Hadoop 入门
整个学习过程资源来源于尚硅谷大数据技术学习,如有侵权请联系删除!
一、 基本概念
- 特点:大量、高速、多样、低价值密度(4V)
- 主要解决海里数据存储和分析计算
- 起源:GFS–>HDFS;Map-Reduce -->MR; BigTable–>HBase
- 高可靠性:多个数据副本;高扩展性:动态增加节点;高效性:并行工作;高容错性:自动将失败的任务重新分配到其他节点。
- Hadoop1.x 2.x 3.x区别:***
3.x在组成上没有变化
1. Hadoop组成
** 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)
2. 大数据生态体系
二、 环境
- 配置ip、主机名
- 安装epel-release软件包。yum install -y epel-release
- 关闭防火墙:systemctl stop firewalld ;
关闭防火墙自启动:systemctl disable firewalld.service
- 卸载虚拟机自带JDK:rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
- 安装JDK:tar -zxvf jdk-8u351-linux-x64.tar.gz -C /opt/module/
配置环境变量:在/etc/profile.d/中添加my_env.sh文件:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_351
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin
然后资源生效:source /etc/profile
- 安装Hadoop:
清华源地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/
tar -zxvf hadoop-3.3.4.tar.gz -C /opt/module/
配置环境变量:在/etc/profile.d/中添加my_env.sh文件:
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.3.4
export PATH= P A T H : PATH: PATH:HADOOP_HOME/bin
export PATH= P A T H : PATH: PATH:HADOOP_HOME/sbin
三、 Hadoop生成集群搭建
本地模式
- 数据存储在Linux本地,通常测试使用
- 词频统计案例:hadoop jar jar包名 功能名 输入文件名 输出文件名
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount wcinput/ wcoutput/
注意输出文件目录不能重复,否则会异常
伪分布模式
数据存储在HDFS
完全分布式****
数据存储在HDFS、多台服务器工作
- scp:实现服务器之间数据拷贝,可以传给其他服务器,也可以从其他服务器拉数据,还可以在中间主机控制另外两台之间数据传输;
语法:scp -r p d i r / pdir/ pdir/fname u s e r @ user@ user@host: p d i r / pdir/ pdir/fname
例如:scp -r jdk1.8.0_351/ jmf@hadoop103:/opt/module/
rsync -av $dir u s e r @ user@ user@host:$dir 实现数据之间同步,相当于只覆盖差异化部分。
- xsync集群分发脚本:https://blog.csdn.net/miachen520/article/details/117588297
- 无密登录配置原理
配置:
ssh-keygen -t rsa :生成密钥对
ssh-copy-id hadoop103 :将公钥拷贝到其他服务器
***4. 集群配置 ***
(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
四、常见错误案例
- 防火墙没关闭、或者没启动YARN
- 主机名称配置错误
- IP地址配置错误
- ssh没配置好
- root用户和子用户启动集群不统一
- Hadoop配置文件错误
- 不识别主机名称java.net.UnknownHostException
(1) 主机名称映射没有配置
(2)主机名称不要带 _ 或者叫hadoop hadoop000等特殊名称
- DataNode和NameNode进程同时只能工作一个
解决办法:先关闭所以进程,然后清理全部节点的data和logs文件夹,在格式化NameNode
- jps发现进程没有,但是重新启动集群,提示进程已经开启。原因:Linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除,在重新启动集群。
- jps不生效,全局变量hadoop java没有生效。source /etc/profile
- 8088端口链接不上 注释/etc/hosts中#127.0.0.1和#::1
HDFS
一、概述
- 分布式文件系统,通过目录树定位文件,适合一次写入,多次读出的场景。
- 高容错性:自动保存多个副本,一个副本丢失可以自动恢复。
- 不适合低延时数据访问 ,无法高效对大量小文件进行存储。如果存储大量小文件,会占用namenode大量的内存来存储文件目录和块信息。小文件存储的寻址时间存超过读取时间。
- 不支持并发写入、文件随机修改。一个文件只能有一个写,不允许多个线程同时写;仅支持数据append(追加),不支持文件的随机修改。
- HDFS组成:namenode、datanode、client、2nn
- hdfs文件块大小,块的大小指上限大小并非实际占用大小。在hdfs-default.xml文件中 dfs.blocksize**
- 寻址时间即为查找到目标block的时间,寻址时间为传输时间的1%时最佳。
- 块设置太小,会增加寻址时间。块设置太大,从磁盘传输数据时间明显大于定位这个块开始位置所需的时间,导致程序处理这块数据时非常慢。***
二、HDFS的shell操作**
- hadoop fs 具体命令 或者 hadoop dfs 具体命令
- 上传命令:
-moveFromLocal:剪切上传到HDFS
-copyFromLocal:复制本地上传到HDFS
-put == copyFromLocal
appendToFile : 追加一个文件到已经存在文件末尾
- 下载命令:
-copyToLocal:拷贝到本地
-get == copyToLocal
- 直接操作命令:
-ls 、-cat、-chgrp、-chmod、-chown、-mkdir、-cp、-mv、-du、-rm -r、-tail 均和Linux命令一样l;-setrcp 设置hdfs文件的副本数量
三、HDFS的客户端API
- Windows下配置Hadoop环境变量
- 设置Maven配置,以及log4j配置
- 参数优先级:hdfs-default.xml=>hdfs-site.xml=> 项目资源目录下的配置文件=>代码中的配置 ****
- 记住常用的文件操作api
四、HDFS的读写流程**
写入数据流程
读取数据流程
- NameNode选择距离待上传数据最近的datanode接收数据。
- 传输最小大小是packet(64k),packet是许多个chunk+chunksum
- 写入的时候会往内存和磁盘都写入一份,内存里面的可以继续往后传输。
- 传输过程有一个ack队列,检验packet是否传输成功,如果没有成功,把失败的packet从ack队列重新放入传输队列。*********
- 节点距离计算:两个节点到达最近的共同祖先的距离总和。
- 副本节点选择
- 读数据流程,如何选择备份节点,主要考虑节点距离和负载均衡;是串行读取
五、NN和2NN
NameNode工作机制
- fsimage文件:是hdfs文件系统元数据的一个永久性检查点,其中包含hdfs文件系统的所有目录和文件inode的序列化信息。命令:hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
- edits文件:存放hdfs文件系统的所有更新操作的路径,文件系统客户端执行的所有操作先写入edits文件中。命令:oev 查看
- seen_txid文件保存的是一个数字,就是最后一个edits的数字
- 2NN和NN差一个edits_inprogress文件(当前最新操作信息)
- checkpoint时间设置,通常2NN每隔一小时执行一次,配置文件hdfs-default.xml
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600s</value>
</property>
<--! 操作次数达到100w,2NN执行一次-->
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
</property>
六、Datanode工作机制
- 开机后datanode会主动向namenode注册,汇报块信息。DN向NN汇报的时间间隔参数在配置文件hdfs-default.xml中 dfs.blockreport.intervalMsec
- 数据完整性校验采用CRC32校验,对比传输前后数据是否一致
- datanode掉线时限参数,hdfs默认超时时长为10分钟+30秒,参数在配置文件hdfs-default.xml中 dfs.namenode.heartbeat.recheck-interval和dfs.heartbeat.interval
超时时间公式timeout = 2 * dfs.namenode.heartbeat.recheck-interval+10 * dfs.heartbeat.interval
重点:
- HDFS文件块大小,取决于硬盘读写速度,一般为128m和256m
- HDFS读写流程
MapReduce
一、概念
- MapReduce是分布式运算程序的编程框架
- 优点:易于编程;实现框架接口。良好的扩展性,可动态增加服务器,解决计算资源不够的问题;高容错性,任何一台机器挂掉,可以将任务转移到其他节点;适合海量数据计算(TB/PB)。
- 缺点:不擅长实时计算;不擅长流式计算;不适合DAG有向无环图计算;
- mapreduce分为map和reduce阶段:map阶段并发maptask,互不相干;reduce阶段并发reducetask,数据依赖于上一个阶段的maptask输出。
- 一个玩着的mapreduce程序在运行时有三类实例进程:
MrAppMaster:负责整个程序的过程调度和状态协调
MapTask:负责map阶段数据处理流程
ReduceTask:负责reduce阶段数据处理流程
- 写的代码打包上传运行时,需要输入主类名 例如hadoop jar wc.jar com.jmf.mapreduce.wordcount.WordCountDriver /input /output3
二、序列化
- Hadoop序列化优点:存储空间少,速度快,互操作性。
- 数据系列化
- 实现对象序列化步骤:实现writable接口;反序列化时,需要反射调用空参构造函数,须有空参构造;重写序列化方法;重写反序列化方法;反序列化的顺序和序列化顺序完全一致;要想显示结果在文件中,需要重写toString方法;如果需要将自定义bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程要求对key必须能排序。
三、核心框架原理
3.1 输入数据处理(重点)InputFormat
-
切片与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处理
3.2MapReduce工作流程
3.3 shuffle机制
Shuffle过程详解,如下:
(1)MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中
(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
(3)多个溢出文件会被合并成大的溢出文件
(4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
(5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
(6)ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
(7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)
注意:分区排序是对索引按照字典进行快排
- mapreduce自定义分区,源码默认是1个分区或者多个自定义分区。(if (partition=1){}else{})
- reduceTask数量 > getPartition数量,会多产生几个空的文件;1 < reduceTask数量 > getPartition数量报IO异常,一部分数据无法存储。如果reduceTask数量=1,则不管mapTask端输出多少个分区文件,都只有一个reduceTask,只产生一个结果文件
- 分区号必须从0开始,逐一累加
- maptask和reducetask均会对数据按key排序
- combiner是Mapper和reducer之外的一个组件,父类是reducer;和reducer区别在于:combiner在每一个maptask所在的节点运行,reducer是接受全局mapper输出的结果。combiner对每个maptask的输出进行局部汇总,combiner应用前提是不影响最终的业务逻辑
- combiner就是将重复key的键值对合并,并产生一个新的键值对,并将原来的value添加到一个集合中作为value
3.4输出数据处理OutputFormat
继承FileOutputFormat类重写getRecordWriter方法
3.5Join
- hadoop迭代器使用了对象重用,value始终指向一个内存地址,改变的是引用指向的内存地址中的数据。(reducer里面遍历value)***细节
- map端join适合一张小表和一张大表的场景;在mapper的setup阶段将文件读取到缓存集合
3.6数据清洗ETL
总结
- Inputformat
1)默认是textinputformat kv key偏移量;v,一行内容
2)处理小文件combinetextinputformat把多个文件合并到一起
- Mapper
setup()初始化 ;map()用户的业务逻辑 ;clearup()关闭资源
- 分区
默认分区是hashpartition ,默认按照key 的hash值%numredeucetask个数
自定义分区
- 排序
1)部分排序 对每个输出的文件的内部排序
2)全排序 一个reduce,对所有数据大排序
3)二次排序 自定义排序,实现writablecompare接口重写compareto方法
- Combiner
前提:不影响最终的业务逻辑;提前聚合(map端完成)解决数据倾斜的一个方法
- Reducer
setup()初始化 ;reduce()用户的业务逻辑 ;clearup()关闭资源
- outputformat
1)默认textoutputformat 按行输出到文件
2)自定义
四、压缩
压缩好处:减少磁盘IO、存储空间;压缩坏处:增加CPU开销
运算密集型的job少用压缩;IO密集型的job多用压缩
1. 各种压缩算法
- bzip2压缩后文件最小但是速度慢;LZO压缩后文件大,解压缩速度最快。
- snappy 压缩和解压速度非常快,不支持切片,压缩率一般。
2. 在生成环境使用
- Hadoop中启用压缩
Yarn
一、基础架构
二、工作机制***********
(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申请注销自己。
三、Mapreduce、HDFS、Yarn
四、调度器和调度算法
apache Hadoop默认的资源调度器是容量调度器
FIFO
先进先出队列
容量调度器
- 雅虎开发的多用户调度器
- 特点:多队列(可以按业务模块创建不同的队列,可以实现任务降级使用,保证特殊时期重要任务优先)、容量保证(每个队列有最低和最高的资源使用上限)、灵活(一个队列资源有剩余可以暂时共享给需要的队列,被借用的有新任务就归还)、多用户(多用户共享集群和多应用程序同时运行,可以对同一用户的作业所占资源进行限制 )
- 每个队列采用FIFO调度策略
公平调度器
- 特点:多队列、容量保证、灵活性、多用户
- 与容量调度器不同:
核心调度策略:容量:优先选择资源利用率低的队列;公平:优先选择对资源缺额(在时间尺度上,所有作业获得公平的资源 。某一时刻一个作业应获得资源与实际获取资源的差距叫缺额)比例大的
每个队列可以单独设置资源分配方式:容量:FIFO、DRF;公平:FIFO、FAIR(默认)、DRF
算法案例
五、yarn在生产环境需要配置的参数***********
yarn-site.xml
- ResourceManager相关
yarn.resourcemanager.scheduler.class 配置调度器,默认容量,并发高可用选择FIFO
yarn.resourcemanager.scheduler.client.thread-count resourcemanager处理调度器请求的线程数量,默认50;
- NodeManager相关
yarn.nodemanager.resource.detect-hardware-capabilities 是否让yarn自己检查硬件进行配置,默认false;
yarn.nodemanager.resource.count-logical-processors-as-cores 是否将虚拟核数当CPU核数,默认false (机器配置不同的时候可以考虑开)
yarn.nodemanager.resource.pcores-vcores-multiplier 虚拟核数和物理核数乘数 例如4核8线程 该参数为2,默认1
yarn.nodemanager.resource.memory-mb 使用内存,默认8G
yarn.nodemanager.resource.system-reserved-memory-mb 为系统保留多少内存(和上一个二选一即可)
yarn.nodemanager.resource.cpu-vcores 使用CPU核数 默认8个
yarn.nodemanager.pmem-check-enabled 是否开启物理内存检查限制container,默认打开
yarn.nodemanager.vmem-check-enabled 是否开启虚拟内存检查限制container,默认打开
yarn.nodemanager.vmem-pmem-ratio 虚拟内存物理内存比例,默认2:1
- Container相关
yarn.scheduler.minimum-allocation-mb 容器最最小内存,默认1G
yarn.scheduler.maximum-allocation-mb 容器最最大内存,默认8G
yarn.scheduler.minimum-allocation-vcores 容器最小CPU核数,默认1个
yarn.scheduler.maximum-allocation-vcores 容器最大CPU核数,默认4个
- 任务优先级
yarn.cluster.max-application-priority 默认是0,不开启
六、命令操作yarn
查看运行列表: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
生产环境调优
1. HDFS核心参数
NameNode内存生产配置
- 一个文件块占用约150Byte
- namenode最小值为1G,每增加100w个block,增加1G内存;datanode最小值为4G,block数或者副本数增加,都需要调大datanode的值,一个datanode的副本总数超过400w,每增加100w增加1G。修改参数:hadoop-env.sh HDFS_NAMENODE_OPTS 和 HDFS_DATANODE_OPTS
NameNode心跳并发配置
NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。线程池个数默认为10,通常配置企业经验dfs.namenode.handler.count=20*ln(cluster Size 集群中机器数)
开启回收站
- 默认是0,禁用回收站,其他值表示设置文件的存活时间,启用修改文件core-site.xml fs.trash.interval
- 回收站目录在HDFS集群中的路径:/user/jmf/.Trash/…. ;
- 通过网页上直接删除的文件也不会走回收站;通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站;只有在命令行利用hadoop fs -rm命令删除的文件才会走回收站
- 恢复数据 hadoop fs -mv 目录
2. HDFS集群压测
-
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 清除测试数据
3. HDFS多目录
NameNode多目录配置
- 在hdfs-site.xml中设置dfs.namenode.name.dir
DataNode多目录配置
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
4. HDFS集群扩容和缩容
添加白名单
- 白名单:在白名单的主机IP地址可以,用来存储数据,可以尽量防止黑客恶意访问攻击;注意:集群中不在白名单的主机仍然工作,只是不能存储数据
- 在hadoop-3.1.3/etc/hadoop目录下分别创建whitelist 和blacklist文件,在hdfs-site.xml配置文件中增加dfs.hosts配置参数,值为白名单路径,然后分发文件到集群,第一次添加白名单需要重启集群
动态添加新数据节点
过程:更改ip,主机名,安装Hadoop,jdk,配置环境变量,配置ssh信任密钥,配置白名单,启动新节点
节点间数据均衡
- 开启数据均衡命令 :sbin/start-balancer.sh -threshold 10 参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%
- 停止数据均衡命令:sbin/stop-balancer.sh
- 由于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,所以尽量不要在NameNode上执行start-balancer.sh
黑名单动态退役旧节点
- 配置黑名单在hdfs-site.xml配置文件中增加dfs.hosts.exclude
- 退役时如果副本数是3,服役节点小于或等于3是不能退役成功的,需要修改副本数。
5. HDFS—存储优化
纠删码
该方法代替多个副本的方式提高数据可靠性,采用计算的方式恢复数据。
- RS-3-2-1024k:使用RS编码,每3个数据单元,生成2个校验单元,共5个单元,也就是说:这5个单元中,只要有任意的3个单元存在(不管是数据单元还是校验单元,只要总数=3),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576
- 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。
- 开启策略:hdfs ec -enablePolicy -policy RS-3-2-1024k
- 其他策略:RS-10-4-1024k,RS-6-3-1024k(默认),RS-LEGACY-6-3-1024k,XOR-2-1-1024k
异构存储(冷热数据分离)
- 异构存储主要解决,不同的数据,存储在不同类型的硬盘中
- 存储策略
- 查看可用存储策略 :hdfs storagepolicies -listPolicies
- 为指定路径设置存储策略:hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx
- 配置文件设置hdfs-site.xml中添加参数dfs.storage.policy.enabled值为true开启存储策略,然后添加参数dfs.datanode.data.dir值为路径,例如:[SSD]file:///opt/module/hadoop-3.1.3/hdfsdata/ssd,[DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/disk
- WARM存储策略测试:
设置策略:hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy WARM
按照存储策略自行移动文件块:hdfs mover /hdfsdata
- LAZY_PERSIST策略需要配置“dfs.datanode.max.locked.memory”,“dfs.block.size”参数,设置该策略后文件块副本都存储在DISK上的原因:当客户端所在的DataNode节点没有RAM_DISK时,会写入客户端所在的DataNode节点的DISK磁盘;客户端所在的DataNode有RAM_DISK,但“dfs.datanode.max.locked.memory”参数值未设置或者设置过小,在内存存储风险太大,通常不会使用该策略。
6. HDFS—故障排除
NameNode故障处理
- NameNode进程挂了并且存储的数据也丢失时将SecondaryNameNode中数据到原NameNode存储数据目录然后重启namenode,即可恢复
命令:scp -r jmf@hadoop103:/opt/module/hadoop-3.4.3/data/dfs/namesecondary/* ./name/
hdfs --daemon start namenode
安全模式和磁盘修复
- 安全模式:文件系统只接受读数据请求,而不接受删除、修改等变更请求
- 进入安全模式场景:NameNode在加载镜像文件和编辑日志期间处于安全模式;NameNode再接收DataNode注册时,处于安全模式
- 退出安全模式条件:dfs.namenode.safemode.min.datanodes:最小可用datanode数量,默认0;dfs.namenode.safemode.threshold-pct:副本数达到最小要求的block占系统总block数的百分比,默认0.999f。(只允许丢一个块)
dfs.namenode.safemode.extension:稳定时间,默认值30000毫秒,即30秒
- 命令:bin/hdfs dfsadmin -safemode get 安全模式状态;bin/hdfs dfsadmin -safemode enter 进入安全模式状态;bin/hdfs dfsadmin -safemode leave离开安全模式状态;bin/hdfs dfsadmin -safemode wait等待安全模式状态
- 数据块损坏,进入安全模式:修复磁盘或者删除元数据
慢磁盘减控
- 通过心跳未联系时间查看,不会超过3秒
- fio命令测试磁盘读写性能:
顺序读测试:sudo fio -filename=/home/jmf/test.log -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r
顺序写测试:sudo fio -filename=/home/atguigu/test.log -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w
随机写测试:sudo fio -filename=/home/atguigu/test.log -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_randw
混合随机读写:sudo fio -filename=/home/atguigu/test.log -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w -ioscheduler=noop
小文件归档
- 小文件会大量占用namenode内存,解决办法:HAR文件归档,将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问,实际上就是打包为整体。namenode只显示一个
- 归档命令:hadoop archive -archiveName input.har -p /input /output
- 查看归档文件:hadoop fs -ls har:///output/input.har
- 解档归档文件:hadoop fs -cp har:///output/input.har/* /
7 HDFS集群迁移
apache集群间数据拷贝
- scp 实现远程主机文件复制
scp -r hello.txt root@hadoop103:/user/atguigu/hello.txt // 推 push
scp -r root@hadoop103:/user/atguigu/hello.txt hello.txt // 拉 pull
scp -r root@hadoop103:/user/atguigu/hello.txt root@hadoop104:/user/atguigu //是通过本地主机中转实现两个远程主机的文件复制;如果在两个远程主机之间ssh没有配置的情况下可以使用该方式
- 采用distcp命令实现两个Hadoop集群之间的递归数据复制bin/hadoop distcp hdfs://hadoop102:8020/user/atguigu/hello.txt hdfs://hadoop105:8020/user/atguigu/hello.txt
8 MapReduce生产经验
- 影响mapreduce效率主要从计算机性能(CPU、内存、磁盘、网络)和I/O操作(数据倾斜(一个reduce快速结束,其他没有);map时间太长,导致reduce等待;小文件过多)优化
- 常用参数调优*************
- 减少数据倾斜问题
(1)首先检查是否空值过多造成的数据倾斜
生产环境,可以直接过滤掉空值;如果想保留空值,就自定义分区,将空值加随机数打散。最后再二次聚合。
(2)能在map阶段提前处理,最好先在Map阶段处理。如:Combiner、MapJoin
(3)设置多个reduce个数
9 Hadoop综合调优
Hadoop小文件优化
- 带来的问题:一方面会大量占用NameNode的内存空间,另一方面就是元数据文件过多,使得寻址索引速度变慢;导致MapTask的处理时间比启动时间还小,白白消耗资源。
- 解决方案:
1)在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS(数据源头)
2)Hadoop Archive(存储方向)是一个高效的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR文件,从而达到减少NameNode的内存使用
3)CombineTextInputFormat(计算方向)CombineTextInputFormat用于将多个小文件在切片过程中生成一个单独的切片或者少量的切片。
4)开启uber模式,实现JVM重用(计算方向)
默认情况下,每个Task任务都需要启动一个JVM来运行,如果Task任务计算的数据量很小,可以让同一个Job的多个Task运行在一个JVM中
MapReduce计算性能测试
使用Hadoop中测试文件的sort程序测试
Hadoop高可用HA
手动模式
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不成功
自动模式
- HA故障转移机制
- 启动步骤:zk start 启动zookeeper集群;start-dfs.sh 启动集群;start-yarn.sh 启动yarn
重要错误:在这里插入代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;
YARN-HA 配置
工作机制
- 先启动的机器在zookeeper注册一个临时节点,该机器就 是active,后面也会注册,但是已经有了就不会注册了,但是保持轮询状态,如果active节点挂了就立马注册一个临时节点成为active
- 当前 rm 上有很多的计算程序在等待运行,其他的 rm 怎么将这些程序接手过来接着跑:rm 会将当前的所有计算程序的状态存储在 zk 中,其他 rm 上位后会去读取,然后接
着跑