简单了解HDFS

HDFS(Hadoop Distributed File System )
1.HDFS的特点
1.保存多个副本,且提供容错机制,默认存3份,副本丢失自动恢复。
2.运用在廉价的机器上(商用机)。
3.适合大数据的处理,HDFS默认将文件分割成block块,128M一个block然后将block按键值对储存在HDFS上
并将键值对的映射存到内存中。
2.HDFS的架构
NameNode:Master节点,管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间(安排别人干活的)
SecondaryNameNode:分担namenode的工作量,NameNode的冷备份,合并fsinmag和fsedits然后发给namenode
DataNode:Slave节点。负责存储client发来的数据块block;执行读写操作(下层实际干活的)
Client:代表用户与NameNode或DateNode交互访问整个文件系统
热备份:b是a的热备份,如果a坏了,b马上代替a工作
冷备份:b是a的冷备份,如果a坏了,b不能马上代替工作,但b储存了a的一些信息,可以减少损失
fsimage:源数据镜像文件(文件系统的目录树。)
edits:源数据的操作日志(针对文件系统做的修改操作记录)
namenode内存中储存的是fsimage+edits.
SecondaryNameNode默认每隔一个小时,从namenode上获取fsimage和edits来合并,再发给namenode.
3.HDFS读文件的流程
1.Client向NameNode发送读数据请求,寻找对应的数据块信息
2.NameNode根据请求返回对应的数据块信息,包括所属机器,数据块的先后顺序,数据块id
3.Client拿着NameNode返回的信息,向DateNode通信,读取对应block块的信息
过程为并行读取,有客户端合并数据
4.HDFS写文件的流程
1.Client向NameNode发送写数据的请求,寻找可以写入的数据块block信息的机器位置,若文件过大,
写入时会分成多个block数据块,但实际上是通过一个一个申请的,若副本为3,每次请求返回一个
block块和三个副本的block存放位置
2.Client获取对应block数据块在DateNode节点位置,开始写操作,Client先写入第一个DateNode,
以数据包pakage的方式逐个发送和接受,存在多个副本时package包一次写入,写完第一个DateNode
后向第二个DateNode传输package,写完一个数据块后,如果还有就重复第一部和第二部
3.所有的block都写完之后Client接收到全部写完的答复,告诉NameNode数据已写完,Client
关闭socket流,DateNode也会想NameNode报告新增的block数据块的信息
5.HDFS高可靠性措施
1.冗余备份:
数据储存在HDFS的节点上,对数据进行冗余备份
2.跨机架副本存放
同一机架的两个节点上个备份一个副本,然后再另一个机架的某个节点上再放一个副本
3.安全模式
HDFS启动时,会进入安全模式,此时不允许写操作,NameNode会受到DateNode的节点报告
确认安全后会自动退出安全模式
4.空间回收
从HDFS删除的文件会放到/trash中,这个文件夹中的内容时翻出文件的最后副本,这个文件夹
被清空,文件就彻底不存在了
6.HDFS常用shell命令
hdfs dfs 可以查看hdfs所有可用命令
hdfs dfs -ls / 查看根目录下的文件列表
hdfs dfs -lsr / 递归查看指定目录下的文件夹及文件
hdfs dfs -cat /text 查看hdfs下的文本文件的内容
hdfs dfs -mkdir -p /tmp/tl 在hdfs中创建/tmp/tl的目录 //-p可以创建多级目录
hdfs dfs -rmr /tmp/tl 删除目录
hdfs dfs -copyToLocal /tmp/index.html ccc 将hdfs中的/tmp/index.html下载到本地文件夹的当前路径下 ccc的位置是表示重新命名
hdfs dfs -copyFromLocal index.html /tmp/tl 从本地当前目录下将index.html文件上传到hdfs中的/tmp/tl
hdfs dfs -text /tmp/tl/index.html.gz | more 查看压缩文件的内容
hdfs dfs -du -h /tmp/tl 查看hdfs中目录/tmp/tl中文件占用磁盘大小 -s是所有文件和 的大小
hdfs dfs -touchz /tmp/tl/hello.txt 创建文件
hdfs dfs -usage cp 查看hdfs dfs 中某个命令的用法 如cp

7.HDFS 为何要讲文件分成 block 块存储?
减少底层操作系统的 IO 读取时的寻址时间
方便更高效的流式读取,提高吞吐量
8.HDFS block 块的默认大小时多少?
dfs.blocksize 为 Hadoop 定义 block 块大小的设置参数,在 hdfs-site.xml 中
版本不一样,默认值不同。Hadoop2.2.x 及以后版本均为 128M
9.HDFS block 块的大小是否可以更改?
可以修改
参数修改对以前的文件不起作用,对以后的文件起作用
也可针对上传文件临时修改,指定-D dfs.blocksize 即可
10.一个 block 块文件是否可以存储多个文件数据?
一个 block 块文件不会跨文件存储
一个 block 块文件最多只会存储一个文件对应的数据
11.如果一个文件的大小,小于一个 blocksize,那么它实际占用多大空间?
实际文件多大则占多大空间,但是占了一个 block 块的元数据空间大小
小文件越多,Hadoop NameNode 的压力越大。故 Hadoop 的优势在于处理大文件数据,GB、
TB 甚至 PB 等。
12.HDFS block 越大越好?还是越小越好?
越大则分块越少,则 NameNode 压力将减小,但并行的 IO 和处理能力降低
越小则分块越多,则 NameNode 处理压力越大,但因为寻址时间太久,不利于提高吞吐量
适中即可,一般采用官方的 128M 即可
13.HDFSAPI读取HDFS中的文本文件
思路:1.加载配置文件
2.从HDFS上传文件,将上传的文件转换成字节数组,初始化输出流,读取字节数组
3.将读出来的字节数组转化成字符串类型

代码实现:
	import org.apache.commons.io.output.ByteArrayOutputStream;
	import org.apache.hadoop.conf.Configuration;
	import org.apache.hadoop.fs.FSDataInputStream;
	import org.apache.hadoop.fs.FileSystem;
	import org.apache.hadoop.fs.Path;
	import org.apache.log4j.Logger;

	public class HdfsFileOperatorUtil {
		//添加日志输出
		Logger logger = Logger.getLogger(HdfsFileOperatorUtil.class);
		//加载配置文件到内存对象
		static Configuration hadoopConf = new Configuration();
		
		public static String readFromFile(String srcFile) throws Exception{ 
			//判断文件路径是否为空,去空格之后长度是否为0
			if(srcFile == null || srcFile.trim()length() == 0) {
				throw new Exception("所要读取的源文件" + srcFile + "不存在,请检查");
			}
			byte[] byteArray = readFromFileToByteArray(srcFile);
			if(byteArray ==null || byteArray.length == 0){
				return null;
			}
			//将字节数组通过utf-8解码输出
			return new String(byteArray, "utf-8");
		}

		public static byte[] readFromFileToByteArray(String srcFile) throws Exception{
			if (srcFile == null || srcFile.length() == 0){
				throw new Exception("所要读取的源文件" + srcFile + "不存在,请检查");
			}
			//获取hadoop conf 对应的hdfs集群对象引用
			FileSystem fs = FileSystem.get(hadoopConf);
			//将给定的scrFile构建成一个hdfs的路径对象path
			Path hdfsPath = new Path(srcFile);
			FSDataInputStream hdfsInStream = fs.open(hdfsPath);
			初始化字节数组
			byte[] byteArray = new byte[65536];
			初始化字节流输出
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
	
			int readlen = 0 ;
			读取过程
			while((readlen = ( hdfsInStream.read(byteArray)))> 0){
				 bos.write(byteArray);
				 byteArray = new byte[65536];
			}
			//关闭流
			hdfsInStream.close();
			//将之前写到字节输出流中的字节,转换成一个整体的字节数组
			byte[] resultByteArray = bos.toByteArray();
			bos.close();
			return resultByteArray;
			
		}
		
		public static void main(String[] args) throws Exception {
			//传入的hdfs的文件路径
			String hdfsFilePath = "/tmp/zhongjiajin/p.1.txt" ;
			//将文件读取下来,转化成字符串形式
			String result = readFromFile(hdfsFilePath);
			System.out.println(result);
		}
	}

	Linux运行代码:
	yarn jar TlHadoopCore-jar-with-dependencies.jar 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值