hadoop学习10

Hadoop学习(十)

1.HDFS核心参数

1.NameNode内存生产配置

(1)NameNode内存计算

每个文件块大概占用 150byte,一台服务器 128G 内存为例,能存储多少文件块呢?

128 * 1024 * 1024 * 1024 / 150Byte ≈ 9.1 亿 G MB KB Byte

(2)Hadoop2.x系列,配置NameNode内存

NameNode 内存默认 2000m,如果服务器内存 4G,NameNode 内存可以配置 3g。在 hadoop-env.sh 文件中配置如下。

HADOOP_NAMENODE_OPTS=-Xmx3072m

(3)Hadoop3.x系列,配置NameNode内存

同样我们去到hadoop-env.sh去看看

# 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

可以看到是动态分配内存的,我们可以通过以下命令来查看NameNode占用内存和DataNode占用内存

jps
之后我们可以看到我们NameNode和DataNode的ps号
然后
jamp -heap 对应的ps号即可

其实这样的分配方式并不是很合理,我们要进行修改

经验之谈:

namenode最小值1G,每增加1000000个块,增加1G内存

datanode最小值4G,block数或者rep(副本)数增加都应该调大datanode值,同理,副本数低于4000000,调为4G,每增加1000000,就再增加1G内存。

参考链接:

Hardware Requirements | 6.x | Cloudera Documentation

具体修改还是按照2.0的方式

export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -
Xmx1024m"
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS
-Xmx1024m"

2.NameNode心跳并发配置

思考:

我们的NameNode不仅要应对客户端的请求,是不是还需要对DataNode的心跳进行接收,这些均需要线程

所以我们的NameNode线程数怎么设置呢?

hdfs-site.xml:

The number of Namenode RPC server threads that listen to requests 
from clients. If dfs.namenode.servicerpc-address is not 
configured then Namenode RPC server threads listen to requests 
from all nodes.
NameNode 有一个工作线程池,用来处理不同 DataNode 的并发心跳以及客户端并发
的元数据操作。
对于大集群或者有大量客户端的集群来说,通常需要增大该参数。默认值是 10。
<property>
 <name>dfs.namenode.handler.countname>
 <value>21value>
property>

企业经验企业经验:dfs.namenode.handler.count=20 × (以e为底),比如集群规模(DataNode 台 数)为 3 台时,此参数设置为 21。可通过简单的 python 代码计算该值,代码如下。

>>> import math
>>> print int(20*math.log(3))
21
>>> quit()

所以我们集群3台机器就开21个线程即可

3.回收站配置

(1)工作机制

被删除的文件会到指定的回收站目录,会有文件存活时间设置,到时自动删除,如何检测的呢,是用检测回收站的一个checkpoint来计时,当然都可以自己设置

(2)参数说明

(1)默认值 fs.trash.interval = 0,0 表示禁用回收站;其他值表示设置文件的存活时间。

(2)默认值 fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为 0,则该 值设置和 fs.trash.interval 的参数值相等。

(3)要求 fs.trash.checkpoint.interval <= fs.trash.interval。

(3)启用回收站

修改core-site.xml,配置垃圾回收时间

<property>
 <name>fs.trash.intervalname>
 <value>1value>
property>

单位:分钟

(4)查看回收站

回收站目录在 HDFS 集群中的路径:/user/root/.Trash/….

注:在网页上删除的文件不走回收站,只有hadoop fs -rm 才会走回收站

(5)恢复回收站数据

将回收站的数据mv出来即可

4.集群压测(HDFS)

​ 在企业中非常关心每天从 Java 后台拉取过来的数据,需要多久能上传到集群?消费者 关心多久能从 HDFS 上拉取需要的数据?

​ 为了搞清楚 HDFS 的读写性能,生产环境上非常需要对集群进行压测。

​ HDFS 的读写性能主要受网络和磁盘影响比较大。为了方便测试,将 hadoop100、 hadoop101、hadoop102 虚拟机网络都设置为 100mbps(12.5M/s)。

(1)写性能

测试:向HDFS上写10个128M的文件

我们有一个jar包可以直接用:

 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

我们得到以下信息:

2021-02-09 10:43:16,853 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
2021-02-09 10:43:16,854 INFO fs.TestDFSIO: Date & time: Tue Feb 
09 10:43:16 CST 2021
2021-02-09 10:43:16,854 INFO fs.TestDFSIO: Number of files: 10
2021-02-09 10:43:16,854 INFO fs.TestDFSIO: Total MBytes processed: 1280
2021-02-09 10:43:16,854 INFO fs.TestDFSIO: Throughput mb/sec: 1.61
2021-02-09 10:43:16,854 INFO fs.TestDFSIO: Average IO rate mb/sec: 1.9
2021-02-09 10:43:16,854 INFO fs.TestDFSIO: IO rate std deviation: 0.76
2021-02-09 10:43:16,854 INFO fs.TestDFSIO: Test exec time sec: 133.05
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:

注意:nrFiles n 为生成 mapTask 的数量,生产环境一般可通过 hadoop101:8088 查看 CPU 核数,设置为(CPU 核数 - 1)

说明:

➢ Number of files:生成 mapTask 数量,一般是集群中(CPU 核数-1),我们测试虚 拟机就按照实际的物理内存-1 分配即可

➢ Total MBytes processed:单个 map 处理的文件大小

➢ Throughput mb/sec:单个 mapTak 的吞吐量 计算方式:处理的总文件大小/每一个 mapTask 写数据的时间累加 集群整体吞吐量:生成 mapTask 数量*单个 mapTak 的吞吐量

➢ Average IO rate mb/sec::平均 mapTak 的吞吐量 计算方式:每个 mapTask 处理文件大小/每一个 mapTask 写数据的时间全部相加除以 task 数量

➢ IO rate std deviation:方差、反映各个 mapTask 处理的差值,越小越均衡

结果分析:

注意:由于副本 1 就在本地,所以该副本不参与测试

一共参与测试的文件:10 个文件 * 2 个副本 = 20 个

压测后的速度:1.61 实测速度:1.61M/s * 20 个文件 ≈ 32M/s

三台服务器的带宽:12.5 + 12.5 + 12.5 ≈ 30m/s 所有网络资源都已经用满。

如果客户端不在集群内,则要算30个副本文件

(2)写性能

同理有个jar包:

 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB

得到以下信息:

2021-02-09 11:34:15,847 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read
2021-02-09 11:34:15,847 INFO fs.TestDFSIO: Date & time: Tue Feb 
09 11:34:15 CST 2021
2021-02-09 11:34:15,847 INFO fs.TestDFSIO: Number of files: 10
2021-02-09 11:34:15,847 INFO fs.TestDFSIO: Total MBytes processed: 1280
2021-02-09 11:34:15,848 INFO fs.TestDFSIO: Throughput mb/sec: 200.28
2021-02-09 11:34:15,848 INFO fs.TestDFSIO: Average IO rate mb/sec: 266.74
2021-02-09 11:34:15,848 INFO fs.TestDFSIO: IO rate std deviation: 143.12
2021-02-09 11:34:15,848 INFO fs.TestDFSIO: Test exec time sec: 20.83

别忘记删除生成的文件

结果分析:

​ 为什么读取文件速度大于网络带宽?由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。

5.多目录配置

注意:只是实验,记得要快照!!!!!

1.NameNode多目录

(1)配置多目录的目的:

NameNode 的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性

(2)具体配置

hdfs-site.xml

<property>
 <name>dfs.namenode.name.dirname>
<value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.
dir}/dfs/name2value>
property>

然后直接删除logs和datas

然后初始化集群,然后在开启

我们进入dfs目录可以看到

有name1和name2两个目录,且内容一模一样

2.DataNode多目录

(1)注意:DataNode 可以配置成多个目录,每个目录存储的数据不一样(数据不是副本)

(2)具体配置:

hdfs-site.xml

<property>
 <name>dfs.datanode.data.dirname>
 
<value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.
dir}/dfs/data2value>
property>

进入dfs里面

看到有data1和data2,所以我们可以通过多目录DataNode来保证一定的可靠性,不像NameNode多目录那么鸡肋

3.负载均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可 以执行磁盘数据均衡命令。(Hadoop3.x 新特性)

一般用不到,除非新加磁盘,命令如下:

(1)生成均衡计划(我们只有一块磁盘,不会生成计划)

 hdfs diskbalancer -plan hadoop101 

(2)执行均衡计划

hdfs diskbalancer -execute hadoop101.plan.json 

(3)查看当前均衡任务的执行情况

hdfs diskbalancer -query hadoop101

(4)取消均衡任务

hdfs diskbalancer -cancel hadoop101.plan.json

5.HDFS-集群扩容及缩容

1.白名单

白名单:表示在白名单的主机 IP 地址可以,用来存储数据。

企业中:配置白名单,可以尽量防止黑客恶意访问攻击。

只有白名单才能存储数据

配置步骤如下:

(1)在 NameNode 节点的/opt/module/hadoop-3.1.3/etc/hadoop 目录下分别创建 whitelist 和 blacklist 文件

vim whitelist
hadoop100
hadoop101
touch blacklist
先暂时不加入黑名单

(2)在 hdfs-site.xml 配置文件中增加 dfs.hosts 配置参数


<property>
 <name>dfs.hostsname>
 <value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelistvalue>
property>

<property>
 <name>dfs.hosts.excludename>
 <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklistvalue>
property>

(3)分发配置文件然后重启节点(第一次创建黑白名单),不是第一次可以直接刷新NameNode即可

在 web 浏览器上查看 DN

发现只有白名单的两个节点

我们用102上传文件试试发现上传不了(不在白名单)

我们修改以下

vim whitelist
hadoop100
hadoop101
hadoop102

这个时候再去在 web 浏览器上查看 DN

发现有hadoop102了,就可以上传了

2.服役新节点

1.配置ip和主机名称

2.增加环境变量

3.删除hadoop中的datas和logs(是其他机器克隆来的)

4.配置ssh免密登录

5.直接启动DataNode,然后将主机名加入白名单,然后分发白名单文件

6.重启集群刷新NameNode

7.上Web上查看即可

3.数据均衡

思考:

在企业开发中,如果经常在 hadoop100 和 hadoop102 上提交任务,且副本数为 2,由于数据本地性原则,就会导致 hadoop100 和 hadoop102 数据过多,hadoop101 存储的数据量小。 另一种情况,就是新服役的服务器数据量比较少,需要执行集群均衡命令。

开启命令:

sbin/start-balancer.sh -threshold 10

参数说明:对于参数 10,代表的是集群中各个节点的磁盘空间利用率相差不超过 10%,可根据实 际情况进行调整。

停止命令:

 sbin/stop-balancer.sh

4.黑名单

黑名单:表示在黑名单的主机 IP 地址不可以,用来存储数据。

企业中:配置黑名单,用来退役服务器。

配置如下:

vim blacklist
写上要退役的节点
hadoop102

hdfs-site.xml



 dfs.hosts.exclude
 /opt/module/hadoop-3.1.3/etc/hadoop/blacklist

分发配置文件 blacklist,hdfs-site.xml

第一次添加黑名单必须重启集群,不是第一次,只需要刷新 NameNode 节点即可

hdfs dfsadmin -refreshNodesRefresh nodes successful

检查 Web 浏览器,退役节点的状态为 decommission in progress(退役中),说明数据 节点正在复制块到其他节点

存在当前节点的数据正在退役,把自己的数据块传给集群其他的服务器上

注意:副本数不能大于在役数,也就是我们3个机器如果想退役一台,那么副本数不能大于2

你可能感兴趣的:(hadoop,学习,大数据)