Hadoop的集群搭建(HA),HDFS的工作流程(读、写、nn和snn ...

打印 上一主题 下一主题

主题 883|帖子 883|积分 2649

mapreduce.jobhistory.address hadoop102:10020  mapreduce.jobhistory.webapp.address hadoop102:19888
  1. 7. 配置workers,hadoop2.X版本是slaves文件,添加以下内容
复制代码
hadoop102
hadoop103
hadoop104
  1. 12. 分发配置xsync ./
  2. #### 基本测试(格式化、启动、停止),hadoop-3.3.1目录下:
  3. 13.1 格式化NameNode:hdfs namenode -format;如果不是第一次格式化需要停止NameNode和DataNode,删除所有机器上的data和logs目录,否则因为格式化后NameNode中保存了集群id,启动集群后DataNode也会保存与NameNode一样的集群id,如果再次格式化NameNode会新生成一个集群id,这个集群id与为删除的DataNode中的集群id不一致。  
  4. 13.2 启动hdfs:sbin/start-dfs.sh  
  5. 13.3 启动yarn:sbin/start-yarn.sh  
  6. 13.4 查看hdfs和yarn的web页面:http://hadoop102:9870,http://hadoop103:8088  
  7. 13.5 创建一个文件夹,hadoop fs -mkdir /input  
  8. 13.6 上传一个文件,hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /  
  9. 13.7 在目录下有test文件,执行wordcount程序 :hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /input /test;观察http://hadoop102:19888/jobhistory历史服务器历史任务。  
  10. 14. 集群启动/停止方式:  
  11. 14.1 整体停止/启动HDFS:start-dfs.sh/stop-dfs.sh  
  12. 14.1 整体停止/启动YARN:start-yarn.sh/stop-yarn.sh  
  13. 14.3 分别启动/停止hdfs组件:hadoop-daemon.sh start/stop 【namenode/datanode…】  
  14. 14.4 别启动/停止YARN:yarn --daemon start/stop resourcemanager/nodemanager  
  15. 15. [集群时间同步]( )
  16. #### 集群脚本编写/home/xrl/bin目录下:
  17. 1. 集群分发脚本xsync,创建xsync文件写入以下内容:
复制代码
#!/bin/bash
#1. 判定参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
  1. for file in $@
  2. do
  3.     #4. 判断文件是否存在
  4.     if [ -e $file ]
  5.         then
  6.             #5. 获取父目录
  7.             pdir=$(cd -P $(dirname $file); pwd)
  8.             #6. 获取当前文件的名称
  9.             fname=$(basename $file)
  10.             ssh $host "mkdir -p $pdir"
  11.             rsync -av $pdir/$fname $host:$pdir
  12.         else
  13.             echo $file does not exists!
  14.     fi
  15. done
复制代码
done
  1. 1.1 修改xsync的执行权限:chmod +x xsync  
  2. 1.1 将脚本复制到bin中,以便全局调用:sudo cp xsync /bin/  
  3. 1.1同步环境变量配置 sudo ./bin/xsync /etc/profile.d/my\_env.sh  
  4. 1.1 让环境变量生效:source /etc/profile  
  5. 1.1 测试分发:xsync /home/xrl/bin;观察hadoop103 104上是否有这个文件了。
  6. 2. Hadoop集群启停脚本myhadoop.sh:
复制代码
#!/bin/bash
if [ $# -lt 1 ]
then
echo “No Args Input…”
exit ;
fi
case $1 in
“start”)
echo " =================== 启动 hadoop集群 ==================="
  1.     echo " --------------- 启动 hdfs ---------------"
  2.     ssh hadoop102 "/opt/module/hadoop-3.3.1/sbin/start-dfs.sh"
  3.     echo " --------------- 启动 yarn ---------------"
  4.     ssh hadoop103 "/opt/module/hadoop-3.3.1/sbin/start-yarn.sh"
  5.     echo " --------------- 启动 historyserver ---------------"
  6.     ssh hadoop102 "/opt/module/hadoop-3.3.1/bin/mapred --daemon start historyserver"
复制代码
;;
“stop”)
echo " =================== 关闭 hadoop集群 ==================="
  1.     echo " --------------- 关闭 historyserver ---------------"
  2.     ssh hadoop102 "/opt/module/hadoop-3.3.1/bin/mapred --daemon stop historyserver"
  3.     echo " --------------- 关闭 yarn ---------------"
  4.     ssh hadoop103 "/opt/module/hadoop-3.3.1/sbin/stop-yarn.sh"
  5.     echo " --------------- 关闭 hdfs ---------------"
  6.     ssh hadoop102 "/opt/module/hadoop-3.3.1/sbin/stop-dfs.sh"
复制代码
;;
*)
echo “Input Args Error…”
;;
esac
  1. 2.1 chmod +x myhadoop.sh  
  2. 2.2 分发这个脚本 xsync ./
  3. 3. jpsall查看节点类型
复制代码
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
  1. 3.1 chmod +x jpsall  
  2. 3.2 分发这个脚本 xsync ./
  3. ## Hdoop-HDFS
  4. ### 定义
复制代码

  • HDFS的是基于流数据模式访问(来了一点数据,就立马处理掉,立马分发到各个存储节点来响应分析、查询等,重点关注数据的吞吐量而不是访问速率)和处理超大文件的需求而开辟的一个主从架构的分布式文件系统(分布式文件系统:一种允许文件透过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间);
  • 流式数据: 将数据序列化为字节流来存储;
  • 序列化:对文件进行切片就需要该文件支持序列化;
  • 存储文件,通过目录树定位文件;
  • 适合一次写入,多次读出的场景。一个文件只能有一个写者,只能进行append追加内容,不能修改。
  1. ### 优缺点
复制代码
优点

  • 高容错性:数据保存了多个副本,一个副本丢失或者破坏,可以主动规复,默认保存三个副本。
  • 适合处理大数据,可以处理的数据规模和文件规模巨大。
  • 可以构建在廉价机器上,数据保存多副本的机制提高了可靠性
  • 适合处理离线数据,不适合处理及时数据。
  • 可以处理:布局化(关系型)、半布局化(word,ppt)、非布局化(视频,音频)数据;
    缺点
  • 不适合低延时的数据访问;(hadoop针对高数据吞吐量做了优化,牺牲了获取数据延迟)
  • 无法高效的对小文件进行存储。由于,大量的小文件会大量占用NameNode的内存来存储文件目录和块信息。而且会影响文件存储地址的寻址时间。解决办法:通过SequenceFile 将小文件合并。
  • 不支持并发写入和文件随机修改,只支持数据的追加,不能修改。
  1. ### 组成架构
  2. HDFS 具有主/从架构。![HDFS组成架构](https://img-blog.csdnimg.cn/cc72466a0332483a9a450f60e526b3eb.png)
  3. #### NameNode(nn):
  4. 1. 处理客户端的读写请求。
  5. 2. 管理数据块(Block)的映射信息。每个文件的块列表和块所在的DataNode等;
  6. 3. 配置副本策略;
  7. 4. 储存文件的元数据(文件、目录自身的属性信息,例如文件名,目录名,修改信息等;文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数等;记录 HDFS 的 Datanode 的信息,用于 DataNode 的管理);
  8. 5. 负责管理数据块的副本,按一定周期,接受来自每个DataNode的心跳信号和块状态报告。心跳用于判断datanode是否正常,块状态报告则关于某个datanode上存储的所有数据块的列表.。
  9. #### DataNode(dn):
  10. 1. 存储实际的数据块。
  11. 2. 执行NameNode的下达的命令,执行数据块的读写操作。
  12. 3. 在启动时向NameNode进行注册并周期性(默认6小时)的向NameNode上报所有块信息。
  13. 4. 周期性的扫描自己节点块的信息(默认6小时)。
  14. 5. 向DataNode维持(默认三秒)的心跳(带有 Block块的使用情况),NameNode返回心跳的结果(带有NameNode该给哪个DataNode的命令,如复制块数据到另一台机器,或删除某个块数据),如果超过十分钟+30秒(默认,超时时间 = 2\* dfs.namenode.heartbeat.recheck-interval(超时时长,默认5分钟)+ dfs.heartbeat.interval(心跳时长,3s))NameNode没有收到某个DataNode的心跳,则认为该节点不可用,NameNode会检查不可用的DeadNode中的副本数据,复制到其他的DeadNode中。
  15. 6. DataNode还有一个自检功能,数据块创建3周后,自动触发校验和运算,以保证集群中数据块的安全。
  16. #### 数据块(Block):
  17. 1. HDFS中文件是分块存储的,数据块以文件的方式存储了实际数据;
  18. 2. 默认存在三个副本;查看(hdfs fsck -locations),可以通过hdfs-site.xml配置文件修改(dfs.replication),可以通过命令修改已上传的文件副本数(hadoop fs -setrep -R 3 /),可以上传文件时指定(hdfs dfs -Ddfs.replication=1 -put core-site.xml /)  
  19. 3.块的大小默认为128MB,最佳状态为:寻址时间为传输时间的1%。大小主要取决于磁盘传输速率(不宜太小也不宜太大)。机械硬盘一般设置为128MB,固态一般设置为256MB
  20. 3. 包含两个文件:一个是数据本身,另一个是数据快的长度,时间戳和数据快的校验和(CRC算法计算校验和,保证数据的完整性)
  21. #### Secondary(2nn):
  22. 1. 每隔一段时间对NameNode进行备份,并帮助NameNode进行Edits和Fsimage进行合并,生成新的Fsimage并拷贝到NameNode中。紧急情况下可辅助恢复NameNode。
  23. 2. Edits(日志文件):记录HDFS文件系统的更新操作,客户端执行的操作会先被记录到Edits文件中,Edits文件只能追加内容。
  24. 3. Fsimage(镜像):是元数据的一个持久化的检查点,包含 Hadoop 文件系统中的所有目录和文件元数据信息,但不包含文件块位置的信息。文件块位置信息只存储在内存中,是在 datanode 加入集群的时候,namenode 询问 datanode 得到的,并且间断的更新。
  25. #### Client(客户端):
  26. 1. 文件切分。文件上传HDFS的时候Client将文件切分成一个一个的Bock,然后进行上传;
  27. 2. 与NameNode交互,获取文件的位置信息;
  28. 3. 与DataNode交互,读取或者写入数据:
  29. 4. Client提供一些命令来管理DFS,比NameNode格式化、磁盘整理等;
  30. 5. Client可以通过一些命令来访问HDFS,比如:对HDFS增删改查操作;
  31. ### 工作流程
  32. #### HDFS数据读写流程
  33. ##### HDFS数据写入流程
  34. ![数据写入的流程图](https://img-blog.csdnimg.cn/d65355dbb8164901ba10d84a2d3b3f4a.png)
  35. 1. Client(客户端)先创建一个DistributedFileSystem(分布式的文件系统),向NameNode请求上传文件。
  36. 2. NameNode对Client请求上传文件路径的权限和结构(是否已经存在)进行检查,并给与Client回复。
  37. 3. Client收到NameNode的允许上传的回复,则向NameNode请求上传,文件切分生成的数据块(Block)。
  38. 4. NameNode收到Block上传的请求,通过机架感知算法计算出存储数据的节点(默认三个),回复给Client。
  39. 5. Client收到NameNode的回复后,创建FSDataOutputStream数据流系统,并向DataNode请求建立Block传输通道(只向一个DataNode请求,通过DataNode的节点距离和负载情况选择,然后由这个DataNode节点再向其他DataNode节点请求建立通道,通道建立成功,给请求建立通道的节点应答成功,所有节点应答成功后,由于Client建立通道的节点给Client回复应答成功)。
  40. 6. Client收到DataNode的应答成功信号,往第一个DataNode上传Block【先从磁盘读取数据(有一个一个与chunk大小相同的缓存ByteBuffer,读满或者强制flush后会计算出一个chunksum(校验码)】放到一个本地内存缓存中【chunk(512byte数据 )+chunksum (4byte校验位)】,从内存中读取chunk组成一个Packet【chunk + chunksum = 516byte,组合成一个packet(64k)】放入一个缓冲队列中,然后以Packet为单位,从缓冲队列中取出数据往DataNode上传(生产者消费者模式),第一个DataNode收到一个Packet就会传给后面的节点,每传一个Packet会放入一个ACK队列(缓冲队列)等待所有需要存储这个数据的DataNode节点全部应答成功后,在ACK队列中将这个数据删除。  
  41. 6.1数据缓存说明:做了三层缓存chunk、packet、packetBufferQueue;  
  42. 6.2数据安全:使用了一个ACK队列记录要上传的packet,防止传输过程中传输失败或异常导致数据丢失;  
  43. 6.3使用了生产者消费者模式,来从packetBufferQueue中添加或取出数据,阻塞生产者的条件是packetBufferQueue+ACK之和超过一个Block的packet上限。
  44. 7. 细节:  
  45. 1.请求和应答是使用RPC的方式,客户端通过ClientProtocol与namenode:通信,namenode和datanode之间使用DatanodeProtocol交互。在设计上,namenode不会主动发起RPC,而是响应来自客户端或datanode的RPC请求。客户端和datanode之间是使用socket进行数据传输,和namenode之间的交互采用nio封装的RPC。  
  46. 2.HDFS有自己的序列化协议。  
  47. 3.在数据块传输成功后但客户端没有告诉namenode之前如果namenode宕机那么这个数据块就会丢失。  
  48. 4.在流式复制时,逐级传输和响应采用响应队列来等待传输结果。队列响应完成后返回给客户瑞  
  49. 5.在流式复制时如果有一台或两台(不是全部)没有复制成功,不影响最后结果,只不过datanode会定期向namenode汇报自身信息。如果发现异常namenode会指挥datanode删除残余数据和完善副本。如果副本数量少于某个最小值就会进入安全模式。
  50. 节点距离:两个节点到达最近的共同服务器的距离总和。
  51. ###### 机架感知:
  52. 查看代码:hdfs dfsadmin -printTopology  
  53. [官网说明]( ):对于常见情况,当复制因子为三个时,HDFS的位置策略是在dataNode上,在本地计算机上放置一个副本,否则在随机datanode上,在其他(远程)机架中的节点上的另一个副本, ,以及同一远程机架中不同节点上的最后一个。该策略削减了机间写入流量,通常会改善写作绩效。机架故障的机会远低于节点故障。该策略不会影响数据可靠性和可用性保证。但是,由于仅将块放置在两个唯一的机架中,而不是三个。通过此策略,文件的复制品不会在机架上均匀分布。三分之一的复制品是在一个节点上,三分之二的复制品在一个架子上,另一个副本均匀分布在其余的架子上。该策略可改善读写性能,而不会损害数据可靠性或读写性能。  
  54. ![存储节点的选择](https://img-blog.csdnimg.cn/d04d68f7909246feaf33bf4823bd2938.png)  
  55. 第一个保证读写效率,第二个保证可靠性,第三个在保证可靠性的条件下兼顾效率。
  56. ##### HDFS读数据
  57. ![读数据流程图](https://img-blog.csdnimg.cn/509666702cc049db8c1f9a80ce51116a.png)
  58. 1. Client创建DistributedFileSystem ----发送读请求(读取文件的路径)----> NameNode
  59. 2. NameNode对请求信息进行检查(文件是否存在,访问权限等),可以读 -----返回文件的元数据(文件元数据信息,文件块位置信息等)----->Client
  60. 3. Client创建FSDataOutputStream数据流系统,然后根据NameNode回复的信息(构成文件的文件块顺序、文件块位置等)串行读取数据(DataNode以chunk为单位输出,Client以Packet为单位接收,先在本地缓存,然后写入目标文件)。读取数据时存在多个副本,读取节点根据节点距离和负载情况进行选择。
  61. #### NameNode和SecondaryNameNode工作机制
  62. ![ NameNode和SecondaryNameNode工作机制](https://img-blog.csdnimg.cn/eea24b8f52604552836a0210504a2799.png)  
  63. NameNode工作:
  64. 1. 第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载Fsimage和Edits文件到内存(将Fsimage文件读入内存,加载Edits里面的更新操作)。保证内存中的元数据是最新的、同步的。  
  65. 中的元数据信息是最新的、同步的。
  66. 2. seen\_txid,保存的是一个事务ID,这个事务ID是EditLog最新的一个结束事务id,当NameNode重启时,会顺序遍历从edits\_0000000000000000001到seen\_txid所记录的txid所在的日志文件,进行元数据恢复,如果该文件丢失或记录的事务ID有问题,会造成数据块信息的丢失;
  67. 3. clent对元数据进行增删改的请求。
  68. 4. NameNode中的Edits文件记录操作日志,更新滚动日志(往后追加不能修改)。
  69. 5. 在内存中对元数据进行增删改。
  70. Secondary NameNode工作:
  71. 1. Secondary NameNode询问NameNode是否需要CheckPoint。触发条件:周期时间(默认一小时)到了,Edits数据(默认一百万条)满了。
  72. 2. Secondary NameNode请求执行CheckPoint。
  73. 3. NameNode保存当前的Edits文件,并生成一个新的Edits文件NewEdits,之后的操作记录到NewEdits中。
  74. 4. 将滚动前的Fsimage和Edits文件拷贝到Secondary NameNode。
  75. 5. Secondary NameNode加载Fsimage和Edits文件到内存,并合并。
  76. 6. 生成新的镜像文件fsimage.chkpoint,并将fsimage.chkpoint通过RPC传回NameNode。
  77. 7. NameNode将fsimage.chkpoint重新命名成fsimage。
  78. 8. 之后NameNode将fsimage和NewEdits文件加载到内存就可以得到最新的元数据。
  79. NameNode和Secondary NameNode相差最新的Edits,如果使用Secondary NameNode恢复NameNode数据,这部分的数据更新操作会丢失。
  80. ### 负载均衡
  81. 1. 解决的问题:DataNode节点之间容易出现数据存储不平衡(数据倾斜)的情况,例如:当集群内新增、删除节点、某个节点的数据块损坏、或者某个节点的存储量达到饱和值时都会导致数据倾斜的情况。当存在数据倾斜时,使用MapReduce进行分布式运算时,如果运算任务如果分配到存储数据很少的节点上,会导致网络带宽的消耗,分配到存储数据很多的节点时,会导致得到运算结果所需要的时长增加。
  82. 2. 原则:当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,即对各DataNode节点上数据的存储分布进行调整。从而,让数据均匀的分布在各个DataNode上,均衡IO性能。它应该满足以下几个原则:  
  83. 1.数据平衡不能导致数据块减少,数据块备份丢失;  
  84. 2.管理员可以中止数据平衡进程;  
  85. 3.每次移动的数据量以及占用的网络资源,必须是可控的(不影响Hadoop使用);  
  86. 4.数据均衡过程,不能影响namenode的正常工作;
  87. 3. 运行步骤:  
  88. ![在这里插入图片描述](https://img-blog.csdnimg.cn/c0c85ccf7337437e959768d33cb05cb1.png)  
  89. (1)数据均衡服务(Rebalancing Server)首先要求 NameNode 生成 DataNode 数据分布分析报告,获取每个DataNode磁盘使用情况;  
  90. (2)Rebalancing Server汇总需要移动的数据分布情况;  
  91. ——2.1 HDFS会把当前的DataNode节点,根据设定的阈值和当前集群的平均值,将其划分到Over(高于阈值,数据过多)、Above(高于平均值)、Below(低于平均值)、Under(低于阈值,数据过少)四个组中。在移动数据块的时候,Over组、Above组中的块向Below组、Under组移动。  
  92. (3)计算具体数据块迁移路线图。数据块迁移路线图,确保网络内最短路径(节点距离最近,提高数据传输效率);  
  93. (4)开始数据块迁移任务,Proxy Source Data Node复制一块需要移动数据块;  
  94. (5)将复制的数据块复制到目标DataNode上(通过校验码保证数据的准确性);  
  95. (6)删除原始数据块;  
  96. (7)目标DataNode向Proxy Source Data Node确认该数据块迁移完成;  
  97. (8)Proxy Source Data Node向Rebalancing Server确认本次数据块迁移完成。然后继续执行这个过程,直至集群达到数据均衡标准;
  98. 4. 运行  
  99. 4.1 启动start-balancer.sh   
  100. -threshold:判断集群是否平衡的阈值,可以不指定,默认为10。  
  101. 4.2 停止 stop-balancer.sh  
  102. 4.3 在hdfs-site.xml文件中可以设置数据均衡占用的网络带宽限制(确保hadoop可以正常使用):
复制代码
dfs.balance.bandwidthPerSec 1048576
  1. 4.5 定时任务
复制代码
00 22 * * 5 hdfs balancer -Threshold 5 >>/home/logs/balancer_date +"\%Y\%m\%d".log
  1. ### 安全模式
  2. 1. 安全模式指在不加载第三方设备驱动情况下启动机器,便于检测与修复
  3. 2. 应用场景:①启动或者重新启动hdfs时;②HDFS维护升级时
  4. 3. 操作:  
  5. 退出安全模式:hdfs dfsadmin -safemode leave  
  6. 进入安全模式 :hdfs dfsadmin -safemode enter  
  7. 查看安全模式状态:hdfs dfsadmin -safemode get  
  8. 等待,直到安全模式结束:hdfs dfsadmin -safemode wait
  9. #### 文件系统检查
复制代码
hdfs fsck 【文件路径】
-move: 移动破坏的文件到/lost+found目录下
-delete: 删除破坏的文件
-files: 输出正在被检测的文件
-openforwrite: 输出检测中的正在被写的文件
-includeSnapshots: 检测的文件包括系统snapShot快照目录下的
-list-corruptfileblocks: 输出破坏的块及其所属的文件
-blocks: 输出block的详细陈诉
-locations: 输出block的位置信息
-racks: 输出block的网络拓扑布局信息
-storagepolicies: 输出block的存储策略信息
-blockId: 输出指定blockId所属块的状态,位置等信息
  1. ##### API实现步骤和源码([参考]( ))
  2. ### 部分配置设置
  3. 1. Secondary NameNode和NameNode,CheckPoint条件设置(hdfs-site.xml):  
  4. 1.1 时间:< name > dfs.namenode.checkpoint.period< /name >  
  5. 1.2 操作次数:< name > dfs.namenode.checkpoint.txns < /name >  
  6. 1.3 检查一次操作次数间隔时长:< name > dfs.namenode.checkpoint.check.period< /name>
  7. 2. DataNode向NameNode汇报节点信息周期时间和扫描自己节点块信息列表的时间设置:  
  8. 2.1汇报节点信息周期时间:< name> dfs.blockreport.intervalMsec < /name>  
  9. 2.2扫描自己节点块信息列表的周期时间:< name>dfs.datanode.directoryscan.interval< /name>
  10. 3. DataNode掉线时限参数设置:  
  11. 3.1超时时长(毫秒): < name>dfs.namenode.heartbeat.recheck-interval< /name>  
  12. 3.2心跳时长(秒)< name>dfs.heartbeat.interval</ name>
  13. ### 基本Shell命令和API操作
  14. #### 基本文件系统Shell命令([官方文档]( )):
  15. hadoop fs == hdfs dfs
  16. 1. 上传  
  17. 1.1 从本地剪切:hadoop fs -moveFromLocal 【本地文件路径】 【HDFS路径】  
  18. 1.2 从本地拷贝:hadoop fs -copyFromLocal 【本地文件路径】 【HDFS路径】  
  19. 1.3 从本地拷贝:hadoop fs put 【本地文件路径】 【HDFS路径】  
  20. 1.4 追加一个文件到另一个文件末尾:hadoop fs -appendToFile 【追加文件路径】 【待追加文件路径】
  21. 2. 下载  
  22. 2.1:hadoop fs -copuToLocal 【HDFS文件路径】 【本地路径】  
  23. 2.2:hadoop fs -get 【HDFS文件路径】 【本地路径】
  24. 3. 显示目录信息:hadoop fs -ls 【查看目录路径】
  25. 4. 查看文件内容:hadoop fs -cat 【文件路径】
  26. 5. 显示文件末尾1kb数据:hadoop fs -tail 【文件路径】
  27. 6. 创建路径:hadoop fs -mkdir 【目录路径】
  28. 7. 拷贝文件:hadoop fs -cp 【原文件路径】【文件路径】
  29. 8. 移动文件:hadoop fs -mv 【文件路径】 【移动到(路径)】
  30. 9. 删除文件或文件夹:hadoop fs -rm 【文件路径】  
  31. 9.1 hadoop fs -rm -r【文件路径】(递归删除)
  32. 10. 统计文件大小:hadoop fs -du 【文件目录路径】
  33. 11. 查询某一个文件所占用块数及相关的数据信息:hdfs fsck 【文件路径】 -files -locations -includeSnapshots -blocks -racks -storagepolicies
  34. 12. 设置HDFS中的文件副本数量: hadoop fs -setrep 【副本数量】 【修改文件的路径】
  35. 13. 文件权限操作:  
  36. 12.1 权限设置:hadoop fs -chmod 666 【文件路径】  
  37. 12.2 文件所属者设置:hadoop fs -chown xrl:xrl 【文件路径】
  38. 14. 查看Fsimage和Edits,hadoop-3.3.1/data/tmp/dfs/name/current目录下:  
  39. 13.1 hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径  
  40. 13.1.1 hdfs oiv -p XML -i fsimage\_0000000000000000025 -o /opt/module/hadoop-3.3.1/fsimage.xml  
  41. 13.1.2 cat /opt/module/hadoop-3.3.1/fsimage.xml  
  42. 13.2 hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径  
  43. 13.2.1 hdfs oev -p XML -i edits\_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-3.3.1/edits.xml  
  44. 13.2.2 cat /opt/module/hadoop-3.3.1/edits.xml
  45. 15. version查看版本:hadoop version
  46. 16. classpath查看类路径: hadoop classpath
  47. #### HDFS命令 ([参考]( ))([官方文档]( ))
  48. 1. 格式化、启动、停止参考上文中VM集群配置的基本步骤中的基本测试;
  49. 2. hdfs dfsadmin 命令集
  50. 3. hdfs fsck 运行HDFS文件系统检查工具
  51. 4. hdfs getconf 命令集
  52. 5. hdfs jar 运行jar文件。用户可以把他们的Map Reduce代码捆绑到jar文件中,使用这个命令执行。
  53. 6. hdfs job 用于和Map Reduce作业交互和命令。
  54. 7. hdfs balancer
  55. API操作:
  56. ### HA(High Available)机制
  57. #### 解决问题
复制代码
只有一个NameNode节点时,如果NameNode挂掉时,集群根本不可用。(单点故障)
NameNode的内存有限(内存受限)
  1. #### NameNode高可用(HA)
  2. ##### 架构图
  3. 1. 使用了两个NameNode架构,解决了单点故障问题;
  4. 2. 借助了共享存储系统(JournalNode集群)来保证元数据的同步,共享存储系统类型一般有几类,如:Shared NAS+NFS、BookKeeper、BackupNode 和 Quorum Journal Manager(QJM)
  5. 3. 使用了zookeeper来进行选举active节点;  
  6. ![在这里插入图片描述](https://img-blog.csdnimg.cn/8baafb3d5d8d43a8bc133e816a76aa85.png)
  7. ##### QJM(Quorum Journal Manager)共享存储机制和主备切换机制([参考]( ))
  8. ##### 配置修改
  9. ###### 配置zookeeper集群
  10. 1. 进入conf目录,修改zoo\_sample.cfg并重命名zoo.cfg:mv zoo\_sample.cfg zoo.cfg;
  11. 2. 修改zoo.cfg
复制代码
tickTime=2000
initLimit=10
syncLimit=5
数据存储地址,提前创建这个目录(注意目录权限)

dataDir=/opt/module/zookeeper-3.7.0/zkData
配置zookeeper集群的服务器编号以及对应的主机名、通信端标语(心跳端标语)和选举端标语

server.1=hadoop102:2888:3888
server.2=hadoop103:2888:3888
server.3=hadoop104:2888:3888
clientPort=2181
  1. 4. 在dataDir=/opt/module/zookeeper-3.7.0/zkData这个目录下创建myir文件,haoop102设置1,103设置2,以此类推;
  2. 5. 修改环境变量/etc/profile.d/my\_env.sh
复制代码
export ZK_HOME=/opt/module/zookeeper-3.7.0
export PATH=                                   P                         A                         T                         H                         :                              PATH:                  PATH:ZK_HOME/bin
  1. 6. 编写启动、停止脚本
复制代码
#!/bin/bash
case $1 in
“start”){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 启动 ------------
ssh $i “/opt/module/zookeeper-3.7.0/bin/zkServer.sh start”
done
};;
“stop”){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 停止 ------------
ssh $i “/opt/module/zookeeper-3.7.0/bin/zkServer.sh stop”
done
};;
“status”){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 状态 ------------
ssh $i “/opt/module/zookeeper-3.7.0/bin/zkServer.sh status”
done
};;
esac
  1. 7. 运行
  2. ###### 配置文件修改
  3. 1. core-site.xml
复制代码
fs.defaultFS hdfs://xrlhadoop  hadoop.tmp.dir /opt/module/hadoop-3.3.1/data  hadoop.http.staticuser.user xrl  ha.zookeeper.quorum hadoop102:2181,hadoop103:2181,hadoop104:2181  ha.zookeeper.session-timeout.ms 2000 ms
  1. 2. hdfs-site.xml
复制代码
dfs.replication 3  dfs.permissions false dfs.permissions.enabled false  dfs.nameservices xrlhadoop  dfs.ha.namenodes.xrlhadoop nn1,nn2  dfs.namenode.rpc-address.xrlhadoop.nn1 hadoop102:8020  dfs.namenode.http-address.xrlhadoop.nn1 hadoop102:50070  dfs.namenode.rpc-address.xrlhadoop.nn2 hadoop104:8020  dfs.namenode.http-address.xrlhadoop.nn2 hadoop104:50070  dfs.namenode.shared.edits.dir qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/xrlhadoop  dfs.journalnode.edits.dir /opt/journal/node/local/data  dfs.ha.automatic-failover.enabled true  dfs.client.failover.proxy.provider.xrlhadoop org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider  dfs.ha.fencing.methods sshfence shell(/bin/true)  dfs.ha.fencing.ssh.private-key-files /root/.ssh/id_rsa  dfs.ha.fencing.ssh.connect-timeout 30000 ha.failover-controller.cli-check.rpc-timeout.ms 60000
  1. ###### 启动步骤
  2. 1. Hadoop处于关闭状态;
  3. 2. 安装系统插件:yum -y install psmisc;
  4. 3. 启动zookeeper;
  5. 4. 删除所有节点的$HADOOP\_HOME下的:rm -rf data/ logs/ ;
  6. 5. 启动JN:hadoop-daemon.sh start journalnode
  7. 6. 格式化NameNode:在一台namenode( namenode1或namenode2)中执行格式化命令:hdfs namenode -format
  8. 7. 在另一台namenode同步数据前先要启动 第10步中格式化的 namenode:hadoop-daemon.sh start namenode
  9. 8. 在其它没有格式化的namenode上执行:hdfs namenode -bootstrapStandby
  10. 9. 在一台namenode上执行格式化zookeeper:hdfs zkfc -formatZK
  11. 10. 测试zk是否成功格式,且启动 :zkCli.sh -server hadoop102:2181
  12. 11. 脚本启动zk集群和Hadoop集群:zk.sh start / myhadoop.sh start
  13. 12. 用jpsall脚本查看各个服务启动情况:DFSZKFailoverController  
  14. (故障恢复,它与namenode在一个节点上,当一个节点失败时,自动恢复)
  15. 13. 查看:http://hadoop102:50070,http://hadoop104:50070 一个为Active一个为Standby
  16. 14. 关闭为Active的NameNode节点:hadoop-daemon.sh stop namenode,观察Standby是否转为Active;
  17. #### YARN高可用(HA)
  18. ##### 修改配置文件yarn-site.xml
复制代码
  yarn.log-aggregation-enable true  yarn.log.server.url http://hadoop102:19888/jobhistory/logs  yarn.log-aggregation.retain-seconds 604800 yarn.application.classpath /opt/module/hadoop-3.3.1/etc/hadoop:/opt/module/hadoop-3.3.1/share/hadoop/common/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/common/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/*:/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn:/opt/module/hadoop-3.3.1/share/hadoop/yarn/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn/*  yarn.resourcemanager.ha.enabled true  yarn.resourcemanager.cluster-id xrlyarn  yarn.resourcemanager.ha.rm-ids rm1,rm2  yarn.resourcemanager.hostname.rm1 hadoop103 yarn.resourcemanager.hostname.rm2 hadoop104  yarn.resourcemanager.zk-address hadoop102:2181,hadoop103:2181,hadoop104:2181  yarn.nodemanager.aux-services mapreduce_shuffle  yarn.resourcemanager.recovery.enabled true  yarn.resourcemanager.store.class org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore  yarn.resourcemanager.webapp.address.rm1 hadoop103:8088 yarn.resourcemanager.webapp.address.rm2 hadoop104:8088
  1. [解决hadoop执行MapReduce程序时Ha和yarn的冲突 YarnRuntimeException: java.lang.NullPointerException]( )
  2. ##### 启动步骤
  3. 1. 关闭集群
  4. 2. 删除删除所有节点的$HADOOP\_HOME下的:rm -rf data/ logs/ ;
  5. 3. 删除journalnode的数据:/opt/journal/node/local/data/下的xrlhadoop;
  6. 4. 启动所有节点上的JND;
  7. 5. 格式化一个NameNode:hadoop namenode -format
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表