【大数据开发必看】Hadoop重点

Hadoop重点内容

1. 入门

  • 大数据主要解决的是存储计算问题
  • 数据单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB…
  • 2006年,hadoop诞生
  • Hadoop运行模式:本地模式,伪分布式模式,完全分布式模式
  • 当namenode和datanode一直起不起来(或者起来一会就挂掉):
    • 最可能的原因:格式化namenode的时候,没有删除data和log文件夹,这会导致namenode和datanode的clusterID不一致。
    • 格式化namenode:bin/hdfs namenode –format
  • 一些端口:【版本:hadoop2.0】
    • HDFS中namenode的地址:hdfs://hadoop102:9000
    • secondarynamnode的地址:hadoop104:50090
    • hdfs的web地址:hadop102:50070
    • yarn的web地址:hadoop103:8088
    • 历史服务器的web地址:hadoop102:19888
    • 历史服务器的地址:hadoop102:10020

2. HDFS

  • hdfs的使用场景:适合一次写入,多次读出,且不支持并发写入、文件的修改

  • hdfs的文件在物理上是分块存储【Block】,块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M

  • hdfs的shell操作:

    • 从HDFS下载文件到本地:hadoop fs -get /sanguo/shuguo/kongming.txt ./
    • 从本地上传文件到HDFS:hadoop fs -put ./zaiyiqi.txt /user/atguigu/test/
  • hdfs的客户端操作:

    import org.apache.hadoop.fs.*;
    // 1 获取hdfs客户端对象
    Configuration conf = new Configuration();
    conf.set("dfs.replication", "2");
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "sl");
    // 2 执行上传API
    fs.copyFromLocalFile(new Path("D:/孙磊.txt"), new Path("/000.txt"));
    // 3 关闭资源
    fs.close();
    
    // 1 获取对象
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "sl");
    // 2 获取输入流
    FileInputStream fis = new FileInputStream(new File("d:/banhua.txt"));
    // 3 获取输出流
    FSDataOutputStream fos = fs.create(new Path("/banhua.txt"));
    // 4 流的对拷
    IOUtils.copyBytes(fis, fos, conf);
    // 5 关闭资源
    IOUtils.closeStream(fos);
    IOUtils.closeStream(fis);
    fs.close();
    
  • hdfs写数据流程

    1. 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
    2. NameNode返回是否可以上传
    3. 客户端请求第一个 Block上传到哪几个DataNode服务器上。
    4. NameNode返回3个DataNode节点,分别为dn1、dn2、dn3,表示采用这三个节点存储数据
    5. 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
    6. dn1、dn2、dn3逐级应答客户端。
    7. 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
    8. 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
  • 在hdfs写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?

    • 节点距离:两个节点到达最近的共同祖先的距离总和。
  • hdfs读数据流程

    1. 客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址
    2. 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
    3. DataNode开始**传输数据给客户端(**从磁盘里面读取数据输入流,以Packet为单位来做校验)。
    4. 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
  • namenode中的元数据是存储在哪里的?

    • 假设存在硬盘,因为经常需要访问,那效率就会很低,因此,应该将元数据存储在内存中,但是这样也会产生一个问题,如果断电或者宕机,元数据就会丢失,因此,就有了在磁盘中备份元数据的FsImage,这样仍然有一个问题,当元数据更新的时候,如果同时更新FsImage,就会导致效率过低,因此,又引入了Edits文件(只进行追加操作),每当元数据有更新或者添加元数据的时候,修改内存中的元数据并且追加到Edits文件中。这样,一旦namenode断电,可以通过FsImage和Edits的合并,合成元数据,但是如果长时间添加数据到Edits中,会导致文件过大,效率变低,因此,需要定期进行FsImage和Edits的合并,如果这个操作由namenode来完成,效率过低,因此,引入一个新的节点,secondarynamenode,专门用于FsImage和Edits的合并
    • FsImage文件:
      • hdfs文件系统元数据的一个永久性的检查点
    • Edits文件:
      • 存放hdfs的所有更新操作的路径
    • 每次namenode启动的时候都会将FsImage文件读入内存,加载Edits的操作,保证内存中的元数据是同步的、最新的,可以看成namenode的启动就将FsImage和Edits文件进行了合并。
  • 集群安全模式:

    • 当集群处于安全模式,不能执行重要操作(写操作)。当集群启动完成后,自动退出安全模式
    • 基本语法:bin/hdfs dfsadmin -safemode get/enter/leave/wait
  • datanode工作机制:

    一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

    1. DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
    2. 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
  • datanode保证数据完整性的方法:

    1. 当DataNode读取Block的时候,它会计算CheckSum(校验和)
    2. 如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
    3. Client读取其他DataNode上的Block。
    4. DataNode在其文件创建后周期验证CheckSum
  • datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把节点判定为死亡,要经过一段时间,该时间称为超时时长

    • HDFS默认的超时时长为10分钟+30秒
  • 服役新数据节点:克隆+简单配置即可

  • 退役旧数据节点

    • 添加白名单:在白名单内的节点,都允许访问namenode,不在的,都会被退出
    • 黑名单退役:在黑名单上面的主机都会被强制退出。
  • DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本

  • 小文件归档:这是其中一种解决小文件过多的方法,

    # 把/user/atguigu/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/user/atguigu/output路径下。
    bin/hadoop archive -archiveName input.har –p  /user/atguigu/input /user/atguigu/output
    # 查看归档
    hadoop fs -lsr /user/atguigu/output/input.har
    hadoop fs -lsr har:///user/atguigu/output/input.har
    # 解归档文件
    hadoop fs -cp har:/// user/atguigu/output/input.har/*  /user/atguigu
    

3. MapReduce

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值