赞
踩
整个学习过程资源来源于尚硅谷大数据技术学习,如有侵权请联系删除!
** HDFS 分布式文件系统:**
(1)NameNode(nn):存储文件的元数据,如文件名、文件目录结构、属性,以及每个文件的块列表和块所在的DataNode
(2) DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和
** YARN资源管理器**
(1)ResourceManager(RM):管理整个集群资源(内存、CPU等)
(2)NodeManager(NM):管理单节点服务器资源
(3)ApplicationMaster(AM):管理单个任务运行
(4)Container:容器,相当于一台独立服务器,封装任务运行需要的资源,如内存、CPU、磁盘、网络等
注意:支持多客户端;集群可以运行多个ApplicationMaster;每个NodeManager可以有多个Container
** Map-Reduce**
(1)Map阶段并行处理输入数据
(2)Reduce对Map结果进行汇总
HDFS 、YARN 、Map-Reduce关系
流程:任务—>找一个节点开启container—>container向resourcemanager申请资源—>在其他节点开启所需的资源(maptask)—>汇总结果(reducetask)
数据存储在HDFS
数据存储在HDFS、多台服务器工作
(1)NameNode配置 core-site.xml
<configuration> <!-- 指定NameNode地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoopmaster:8020</value> </property> <!-- 本地磁盘存放数据的目录 --> <property> <name>hadoop.tmp.dir</name> <value>file:/opt/module/hadoop-3.3.4/data</value> </property> <!-- 配置HDFS网络登录使用的静态用户,网页可以操作 --> <property> <name>hadoop.http.staticuser.user</name> <value>jmf</value> </property> </configuration>
(2)HDFS配置 hdfs-site.xml
<configuration> <!-- nn web端访问地址 --> <property> <name>dfs.namenode.http-address</name> <value>hadoopmaster:9870</value> </property> <!-- 2nn web端访问地址 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop103:9868</value> </property> </configuration>
(3)YARN配置 yarn-site.xml
<configuration> <!-- 指定MR走shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定ResourceManager --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop102</value> </property> <!-- 环境变量的继承 --> <property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property> <!-- 日志聚集功能 --> <!-- 开启日志聚集功能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置日志聚集服务器地址--> <property> <name>yarn.log.server.url</name> <value>http://hadoop101:19888/jobhistory/logs</value> </property> <!-- 设置日志保留时间为7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property> </configuration>
(4)MapReduce配置 mapred-site.xml
<configuration> <!-- 指定MapReduce程序运行在Yarn上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 配置历史服务器地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop101:10020</value> </property> <!-- 配置历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop101:19888</value> </property> </configuration>
(5)配置workers /etc/hadoop/workers (在Hadoop2.x中该文件是slaves)
5.群起集群
(1)配置workers /etc/hadoop/workers
添加主机名即可
(2)第一次启动集群需要格式化NameNode,需要重新格式化NameNode的话一定要先停止namenode和datanode进程,并且删除所有机器的data和logs目录在格式化
命令:hdfs namenode -format
(3)集群群起命令:
sbin/start-dfs.sh 启动hdfs ;web查看hadoop101:9870
sbin/start-yran.sh 启动recoursemanager(一定在配置的节点启动) web查看hadoop102:8088
mapred --daemon start historyserver : 先关闭yran然后启动历史服务器(在主节点启动)
坑:(1)注意配置文件符号,中英文等等
(2)文件夹权限一定要设置好,Hadoop安装目录是属主,(用root安装了软件,使用的时候用其他用户,导致的权限问题)。
(4) 集群测试 创建文件夹:hadoop fs -mkdir /wcinput
上传文件:hadoop fs -put wcinput/word.txt /wcinput
(5)集群崩溃处理:删除集群全部节点历史数据data/ logs/ 格式化namenode ,如果启动不成功,查看节点版本号文件id是否一致
(6)集群启停脚本https://blog.csdn.net/weixin_44371237/article/details/126040977
(7)查看全部节点jps脚本
#!/bin/bash
for host in hadoop101 hadoop102 hadoop103
do
echo =================== $host =========== ===========
ssh $host jps
done
(9)集群时间同步,如果服务器能联网就不需要同步时间
时间服务器配置:
查看所有节点ntpd服务状态和开机自启动状态: systemctl status ntpd
systemctl start ntpd
systemctl enable ntpd
修改主节点的ntp.conf配置文件/etc/ntp.conf,修改网段,添加:
server 127.127.1.0
fudge 127.127.1.0 startum 10
修改主节点的/etc/sysconfig/ntpd文件:使硬件时间和系统时间一致,添加
SYNC HWCLOCK=yes
重启ntpd服务并且设置开机启动
systemctl start ntpd
systemctl enable ntpd
关闭其他节点npt服务和自启动
在其他机器配置一分钟与时间服务器同步一次 crontab -e 编辑*/1**** /usr/sbin/ntpdate hadoop101
写入数据流程
读取数据流程
NameNode工作机制
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600s</value>
</property>
<--! 操作次数达到100w,2NN执行一次-->
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
</property>
切片与MapTask并行度决定机制***
数据块:Block是HDFS物理上数据分成独立块。是HDFS存储数据单位。
数据切片:在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储,数据切片是MapReduce程序计算输入数据的单位,一个切片对应启动一个MapTask。切片时不考虑数据集整体,而是对逐个文件单独切片***
默认情况:切片大小 = BlockSize,源码切片大小取决于BlockSize、minsize(默认1)、maxsize(默认Long.MAXValue)
reduceTask并行度决定机制****
reduceTask个数由实验决定,增加reducetask个数查看运行时间,后期reducetask个数变多后会增加运行时间。
reducetask=0,表示没有reduce阶段,输出文件个数与map个数一样;reduce默认为1,输出一个文件;如果数据分布不均,在reduce阶段会产生数据倾斜。具体个数根据需求和生产环境决定。
如果分区不为1,reducetask为1,则不会执行分区过程
mapreduce 提交job会往hdfs的临时目录提交:spilt文件(用于切片)、jar包(集群模式需要)、xml记录job配置信息
job提交流程
如果文件大小在切片的1.1倍以内,会只切一片。例如:切片为32m,文件是35.2m,则只会切为一片。
切片源码
CombineTextInputFormat切片机制
应用场景:小文件过多;可以将多个小文件从逻辑上规划到一个切片中,然后交给一个MapTask处理
Shuffle过程详解,如下:
(1)MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中
(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
(3)多个溢出文件会被合并成大的溢出文件
(4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
(5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
(6)ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
(7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)
注意:分区排序是对索引按照字典进行快排
继承FileOutputFormat类重写getRecordWriter方法
压缩好处:减少磁盘IO、存储空间;压缩坏处:增加CPU开销
运算密集型的job少用压缩;IO密集型的job多用压缩
(1)MR程序提交到客户端所在的节点。
(2)YarnRunner向ResourceManager申请一个Application。
(3)RM将该应用程序的资源路径返回给YarnRunner。
(4)该程序将运行所需资源提交到HDFS上。
(5)程序资源提交完毕后,申请运行mrAppMaster。
(6)RM将用户的请求初始化成一个Task。
(7)其中一个NodeManager领取到Task任务。
(8)该NodeManager创建容器Container,并产生MRAppmaster。
(9)Container从HDFS上拷贝资源到本地。
(10)MRAppmaster向RM 申请运行MapTask资源。
(11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
(12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MR会向RM申请注销自己。
apache Hadoop默认的资源调度器是容量调度器
先进先出队列
yarn-site.xml
查看运行列表:yarn application -list
根据状态过滤:yarn application -list -appStates FINISHED(ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)
杀死进程:yarn application -kill application_1612577921195_0001
查看Application日志:yarn logs -applicationId application_1612577921195_0001
查询Container日志:yarn logs -applicationId application_1612577921195_0001 -containerId container_1612577921195_0001_01_000001
列出所有Application尝试的列表:yarn applicationattempt -list application_1612577921195_0001
打印ApplicationAttemp状态:yarn applicationattempt -status appattempt_1612577921195_0001_000001
列出所有Container:yarn container -list appattempt_1612577921195_0001_000001
打印Container状态:yarn container -status container_1612577921195_0001_01_000001
列出所有节点:yarn node -list -all
加载队列配置:yarn rmadmin -refreshQueues (动态修改,不停机)
打印队列信息:yarn queue -status default
NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。线程池个数默认为10,通常配置企业经验dfs.namenode.handler.count=20*ln(cluster Size 集群中机器数)
python -m SimpleHTTPServer 可以开启外部下载接口 http://hadoop101:8000/
Hadoop下有一个test包可以提供读写测试;hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar 写操作文件数 = 集群CPU数 - 1
Throughput mb/sec:单个mapTak的吞吐量 :处理的总文件大小/每一个mapTask写数据的时间累加
Average IO rate mb/sec::平均mapTak的吞吐量
IO rate std deviation:方差、反映各个mapTask处理的差值,越小越均衡
写测试
读测试
压测速度2.89mb/s 两个副本 11个文件,则本集群实测速度:2.89112= 63.58M/s;如果客户端不在集群节点,则有三个副本
如果测试异常设置yarn-site.xml中设置虚拟内存检测(yarn.nodemanager.vmem-check-enabled)为false
hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean 清除测试数据
1.在hdfs-site.xml中设置dfs.datanode.data.dir
硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。
生成均衡计划: hdfs diskbalancer -plan hadoop103
执行均衡计划:hdfs diskbalancer -execute hadoop103.plan.json
查看当前均衡任务的执行情况: hdfs diskbalancer -query hadoop103
取消均衡任务:hdfs diskbalancer -cancel hadoop103.plan.json
过程:更改ip,主机名,安装Hadoop,jdk,配置环境变量,配置ssh信任密钥,配置白名单,启动新节点
该方法代替多个副本的方式提高数据可靠性,采用计算的方式恢复数据。
使用Hadoop中测试文件的sort程序测试
1.实现高可用最关键的策略是消除单点故障。HA 严格来说应该分成各个组件的 HA机制:HDFS 的 HA 和 YARN 的 HA。HDFS HA 功能通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的热备来解决问题。
.2.NameNode 主要在以下两个方面影响 HDFS 集群:NameNode 机器发生意外,如宕机,集群将无法使用;NameNode 机器需要升级,包括软件、硬件升级,此时集群也将无法使用
3. 保证所有 namenode 的数据一致:a.Fsimage:让一台 nn 生成数据,让其他机器 nn 同步;b.Edits:需要引进新的模块 JournalNode 来保证 edtis 的文件的数据一致性
4. 2nn 在 ha 架构中并不存在,定期合并 fsimage 和 edtis 的活由 standby 的 nn 来干
5. 步骤:一定要先启动journalnode: hdfs --daemon start journalnode;在nn1格式化并启动:hdfs namenode -format, hdfs --daemon start namenode;在nn2和nn3同步: hdfs --daemon start namenode;启动nn2和nn3:hdfs --daemon start namenode;启动全部datanode:hdfs --daemon start datanode;将nn1切换为active: hdfs haadmin -transitionToActive nn1;查看是否active:hdfs haadmin -getServiceState nn1
6. 手动模式下,如有namenode挂掉,手动指定active不成功
在这里插入代org.apache.hadoop.hdfs.qjournal.client.QuorumException: Got too many exceptions to achieve quorum size 2/3. 3 exceptions thrown: 192.168.6.103:8485: Call From hadoop102/192.168.6.102 to hadoop103:8485 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused 192.168.6.102:8485: Call From hadoop102/192.168.6.102 to hadoop102:8485 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused 192.168.6.104:8485: Call From hadoop102/192.168.6.102 to hadoop104:8485 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused拒绝连接;码片
报错原因:是因为 NameNode 连接不上 JournalNode。为 start-dfs.sh 群起脚本默认的启动顺序是先启动 NN,再启动 DN,然后再启动 JN,并且默认的 rpc 连接参数是重试次数为 10,每次重试的间隔是 1s,也就是说启动完 NN以后的 10s 中内,JN 还启动不起来,NN 就会报错了。
解决方案:core-default.xml 里面有两个参数如下:ipc.client.connect.max.retries NN 连接 JN 重试次数,默认是 10 次;ipc.client.connect.retry.interval 重试时间间隔,默认 1s;
工作机制
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。