大数据之hadoop3入门到精通(二);https://developer.aliyun.com/article/1535226
HDFS—核心参数
NameNode 内存生产配置
1)NameNode 内存计算
每个文件块大概占用 150byte,一台服务器 128G 内存为例,能存储多少文件块呢?
128 * 1024 * 1024 * 1024 / 150Byte ≈ 9.1 亿
2)Hadoop2.x 系列,配置 NameNode 内存
NameNode 内存默认 2000m,如果服务器内存 4G,NameNode 内存可以配置 3g。在hadoop-env.sh 文件中配置如下。
HADOOP_NAMENODE_OPTS=-Xmx3072m
3)Hadoop3.x 系列,配置 NameNode 内存
(1)hadoop-env.sh 中描述 Hadoop 的内存是动态分配的
# The maximum amount of heap to use (Java -Xmx). If no unit # is provided, it will be converted to MB. Daemons will # prefer any Xmx setting in their respective _OPT variable. # There is no default; the JVM will autoscale based upon machine # memory size. # export HADOOP_HEAPSIZE_MAX= # The minimum amount of heap to use (Java -Xms). If no unit # is provided, it will be converted to MB. Daemons will # prefer any Xms setting in their respective _OPT variable. # There is no default; the JVM will autoscale based upon machine # memory size. # export HADOOP_HEAPSIZE_MIN= HADOOP_NAMENODE_OPTS=-Xmx102400m
(2)查看 NameNode 占用内存
[atguigu@hadoop102 ~]$ jps 3088 NodeManager 2611 NameNode 3271 JobHistoryServer 2744 DataNode 3579 Jps [atguigu@hadoop102 ~]$ jmap -heap 2611 Heap Configuration: MaxHeapSize = 1031798784 (984.0MB)
(3)查看 DataNode 占用内存
[atguigu@hadoop102 ~]$ jmap -heap 2744 Heap Configuration: MaxHeapSize = 1031798784 (984.0MB)
查看发现 hadoop102 上的 NameNode 和 DataNode 占用内存都是自动分配的,且相等。不是很合理。
(1)namenode最小值1G,每增加1000000个block,增加1G内存
(2)datanode最小值4G,block数,或者副本数升高,都应该调大datanode的值。一个datanode上的总数低于4000000,为4G,超过4000000,每增加1000000,增加1G。
具体修改:hadoop-env.sh
export HDFS_NAMENODE_OPTS="Dhadoop.security.logger=INFO,RFAS -Xmx1024m" export HDFS_DATANODE_OPTS="Dhadoop.security.logger=ERROR, RFAS -Xmx1024m"
如果出现hadoop102: ERROR: Cannot set priority of namenode process 16849错误
在hadoop-env.sh中添加
HADOOP_SHELL_EXECNAME=root
NameNode 心跳并发配置
1)hdfs-site.xml
<!-- NameNode 有一个工作线程池,用来处理不同 DataNode 的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大该参数。默认值是 10。--> <property> <name>dfs.namenode.handler.count</name> <value>21</value> </property>
企业经验:dfs.namenode.handler.count=20 × 𝑙𝑜𝑔𝑒(𝐶𝑙𝑢𝑠𝑡𝑒𝑟 𝑆𝑖𝑧𝑒),比如集群规模(DataNode 台数)为 3 台时,此参数设置为 21。可通过简单的 python 代码计算该值,代码如下。
[atguigu@hadoop102 ~]$ sudo yum install -y python [atguigu@hadoop102 ~]$ python Python 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import math >>> print int(20*math.log(3)) 21 >>> quit()
开启回收站配置
1)开启回收站功能参数说明
(1)默认值 fs.trash.interval = 0,0 表示禁用回收站;其他值表示设置文件的存活时间。
(2)默认值 fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为 0,则该值设置和 fs.trash.interval 的参数值相等。
(3)要求 fs.trash.checkpoint.interval <= fs.trash.interval。
2)启用回收站
修改 core-site.xml,配置垃圾回收时间为 1 分钟。
<property> <name>fs.trash.interval</name> <value>1</value> </property>
4)查看回收站
回收站目录在 HDFS 集群中的路径:/user/atguigu/.Trash/….
5)注意:通过网页上直接删除的文件也不会走回收站。
6)通过程序删除的文件不会经过回收站,需要调用 moveToTrash()才进入回收站
Trash trash = New Trash(conf); trash.moveToTrash(path);
7)只有在命令行利用 hadoop fs -rm 命令删除的文件才会走回收站。
hadoop fs -rm -r /user/atguigu/input 2021-07-14 16:13:42,643 INFO fs.TrashPolicyDefault: Moved:'hdfs://hadoop102:9820/user/atguigu/input' to trash at:hdfs://hadoop102:9820/user/atguigu/.Trash/Current/user/atguigu /input
8)恢复回收站数据
hadoop fs -mv /user/atguigu/.Trash/Current/user/atguigu/input /user/atguigu/input
HDFS—集群压测
测试 HDFS 写性能
hadoop jar /opt/module/hadoop3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
测试 HDFS 读性能
hadoop jar /opt/module/hadoop- 3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
NameNode 多目录配置
1)NameNode 的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性
(1)在 hdfs-site.xml 文件中添加如下内容
<property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/dfs/name2</value> </property>
注意:因为每台服务器节点的磁盘情况不同,所以这个配置配完之后,可以选择不分发
(2)停止集群,删除三台节点的 data 和 logs 中所有数据。
(3)格式化集群并启动。
DataNode 多目录配置
1)DataNode 可以配置成多个目录,每个目录存储的数据不一样(数据不是副本)
在 hdfs-site.xml 文件中添加如下内容
<property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value> </property>
添加白名单
白名单:表示在白名单的主机 IP 地址可以,用来存储数据。
企业中:配置白名单,可以尽量防止黑客恶意访问攻击。
1)在 NameNode 节点的/opt/module/hadoop-3.1.3/etc/hadoop 目录下分别创建 whitelist 和blacklist 文件
vim whitelist hadoop102 hadoop103
(2)创建黑名单
touch blacklist #保持空的就可以 后面要用
2)在 hdfs-site.xml 配置文件中增加 dfs.hosts 配置参数
<!-- 白名单 --> <property> <name>dfs.hosts</name> <value>/opt/module/hadoop3.1.3/etc/hadoop/whitelist</value> </property> <!-- 黑名单 --> <property> <name>dfs.hosts.exclude</name> <value>/opt/module/hadoop3.1.3/etc/hadoop/blacklist</value> </property>
3)分发配置文件 whitelist,hdfs-site.xml
4)第一次添加白名单必须重启集群,不是第一次,只需要刷新 NameNode 节点即可
5)在 web 浏览器上查看 DN,http://hadoop102:9870/dfshealth.html#tab-datanode
6)在 hadoop104 上执行上传数据数据失败
hadoop fs -put NOTICE.txt / • 1
7)二次修改白名单,增加 hadoop104
vim whitelist #修改为如下内容 hadoop102 hadoop103 hadoop104
8)刷新 NameNode
hdfs dfsadmin -refreshNodes
9)在 web 浏览器上查看 DN,http://hadoop102:9870/dfshealth.html#tab-datanode
服役新服务器
环境准备
(1)在 hadoop100 主机上再克隆一台 hadoop105 主机
(2)修改 IP 地址和主机名称
(3)拷贝 hadoop102 的/opt/module 目录和/etc/profile.d/my_env.sh 到 hadoop105
(4)删除 hadoop105 上 Hadoop 的历史数据,data 和 log 数据
(5)配置 hadoop102 和 hadoop103 到 hadoop105 的 ssh 无密登录
服役新节点具体步骤
(1)直接启动 DataNode,即可关联到集群
hdfs --daemon start datanode yarn --daemon start nodemanager
4)在白名单中增加新服役的服务器
(1)在白名单 whitelist 中增加 hadoop105,并重启集群
(2)分发
(3)刷新 NameNode
服务器间数据均衡
1)企业经验:
在企业开发中,如果经常在 hadoop102 和 hadoop104 上提交任务,且副本数为 2,由于数据本地性原则,就会导致 hadoop102 和 hadoop104 数据过多,hadoop103 存储的数据量小。
另一种情况,就是新服役的服务器数据量比较少,需要执行集群均衡命令。
2)开启数据均衡命令:
sbin/start-balancer.sh -threshold 10
对于参数 10,代表的是集群中各个节点的磁盘空间利用率相差不超过 10%,可根据实际情况进行调整。
3)停止数据均衡命令:
sbin/stop-balancer.sh
注意:由于 HDFS 需要启动单独的 Rebalance Server 来执行 Rebalance 操作,所以尽量不要在 NameNode 上执行 start-balancer.sh,而是找一台比较空闲的机器。
黑名单退役服务器
黑名单:表示在黑名单的主机 IP 地址不可以,用来存储数据。
企业中:配置黑名单,用来退役服务器。
1)编辑/opt/module/hadoop-3.1.3/etc/hadoop 目录下的 blacklist 文件
vim blacklist hadoop105#添加退役节点
注意:如果白名单中没有配置,需要在 hdfs-site.xml 配置文件中增加 dfs.hosts 配置参数
<!-- 黑名单 --> <property> <name>dfs.hosts.exclude</name> <value>/opt/module/hadoop3.1.3/etc/hadoop/blacklist</value> </property>
2)分发配置文件 blacklist,hdfs-site.xml
3)第一次添加黑名单必须重启集群,不是第一次,只需要刷新 NameNode 节点即可
4)检查 Web 浏览器,退役节点的状态为 decommission in progress(退役中),说明数据节点正在复制块到其他节点
5)等待退役节点状态为 decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是 3,服役的节点小于等于 3,是不能退役成功的,需要修改副本数后才能退役
6)如果数据不均衡,可以用命令实现集群的再平衡
HDFS—故障排除
NameNode 故障处理
1)需求:
NameNode 进程挂了并且存储的数据也丢失了,如何恢复 NameNode
2)故障模拟
(1)kill -9 NameNode 进程
(2)删除 NameNode 存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)
3)问题解决
(1)拷贝 SecondaryNameNode 中数据到原 NameNode 存储数据目录
scp -r yu@hadoop104:/opt/module/hadoop3.1.3/data/dfs/namesecondary/* ./
(2)重新启动 NameNode
hdfs --daemon start namenode
(3)向集群上传一个文件
集群安全模式&磁盘修复
1)安全模式:文件系统只接受读数据请求,而不接受删除、修改等变更请求
2)进入安全模式场景
NameNode 在加载镜像文件和编辑日志期间处于安全模式;
NameNode 再接收 DataNode 注册时,处于安全模式
3)退出安全模式条件
dfs.namenode.safemode.min.datanodes:最小可用 datanode 数量,默认 0
dfs.namenode.safemode.threshold-pct:副本数达到最小要求的 block 占系统总 block 数的百分比,默认 0.999f。(只允许丢一个块)
dfs.namenode.safemode.extension:稳定时间,默认值 30000 毫秒,即 30 秒
4)基本语法
bin/hdfs dfsadmin -safemode get bin/hdfs dfsadmin -safemode enter bin/hdfs dfsadmin -safemode leave bin/hdfs dfsadmin -safemode wait
5)案例 1:启动集群进入安全模式
(1)重新启动集群
(2)集群启动后,立即来到集群上删除数据,提示集群处于安全模式
6)案例 2:磁盘修复
需求:数据块损坏,进入安全模式,如何处理
( 1 ) 分 别 进 入 hadoop102 、 hadoop103 、 hadoop104 的 /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1015489500-192.168.10.102-1611909480872/current/finalized/subdir0/subdir0 目录,统一删除某 2 个块信息
xcall rm -rf blk_1073741826_1002.meta blk_1073741827_1003.meta
(2)重新启动集群
(3)观察 http://hadoop102:9870/dfshealth.html#tab-overview
(4)离开安全模式
bin/hdfs dfsadmin -safemode leave
(5)观察 http://hadoop102:9870/dfshealth.html#tab-overview
(6)将元数据删除
(7)观察 http://hadoop102:9870/dfshealth.html#tab-overview,集群已经正常
7)案例 3:
需求:模拟等待安全模式
(1)查看当前模式
hdfs dfsadmin -safemode get
(2)先进入安全模式
- 1
(3)创建并执行下面的脚本
vim safemode.sh ##脚本 #!/bin/bash hdfs dfsadmin -safemode wait hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt / ## chmod 777 safemode.sh ./safemode.sh
(4)再打开一个窗口,执行
bin/hdfs dfsadmin -safemode leave
(5)再观察上一个窗口
HDFS—集群迁移
Apache 和 Apache 集群间数据拷贝
采用 distcp 命令实现两个 Hadoop 集群之间的递归数据复制
bin/hadoop distcp hdfs://hadoop102:8020/user/atguigu/hello.txt hdfs://hadoop105:8020/user/atguigu/hello.txt
MapReduce 生产经验
测试 MapReduce 计算性能
(1)使用 RandomWriter 来产生随机数,每个节点运行 10 个 Map 任务,每个 Map 产生大约 1G 大小的二进制随机数
hadoop jar /opt/module/hadoop- 3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples- 3.1.3.jar randomwriter random-data
(2)执行 Sort 程序
hadoop jar /opt/module/hadoop- 3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples- 3.1.3.jar sort random-data sorted-data
(3)验证数据是否真正排好序了
hadoop jar /opt/module/hadoop- 3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar testmapredsort -sortInput random-data -sortOutput sorted-data