大数据之hadoop3入门到精通

hadoop3.x搭建学习

Hadoop概述

什么是hadoop?

1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构。

2)主要解决,海量数据的存储和海量数据的分析计算问题。

3)广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。

Hadoop四大特点

1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元

素或存储出现故障,也不会导致数据的丢失。

2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。

3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处

理速度。

4)高容错性:能够自动将失败的任务重新分配。

虚拟机IP和主机配置

配置网络和ip
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" #修改静态ip
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="c162952f-1144-46a7-9f1d-f095cf01c0e2"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.10.100 #添加ip地址
GATEWAY=192.168.10.2 #添加网关
DNS1=192.168.10.2  #域名解析器
配置主机名称
vim /etc/hostname
hadoop100
配置主机名称映射
vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
安装 epel-release

注:Extra Packages for Enterprise Linux 是为“红帽系”的操作系统提供额外的软件包,适用于 RHEL、CentOS 和 Scientific Linux。相当于是一个软件仓库,大多数 rpm 包在官方repository 中是找不到的)

yum install -y epel-release
关闭防火墙,关闭防火墙开机自启
systemctl stop firewalld
systemctl disable firewalld.service
创建yu用户,并修改用户密码
useradd yu
passwd yu
配置 yu用户具有 root 权限,方便后期加 sudo 执行 root 权限的命令
vim /etc/sudoers
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
yu      ALL=(ALL)       NOPASSWD: ALL  #在此处添加yu用户配置
卸载虚拟机自带的jdk
rpm -qa | grep -i java | xargs -n1 rpm -e 
--nodeps

1.rpm -qa:查询所安装的所有 rpm 软件包

2.grep -i:忽略大小写

3.xargs -n1:表示每次只传递一个参数

4.rpm -e –nodeps:强制卸载软件

克隆三台虚拟机搭建集群

1.修改ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33
#IPADDR=192.168.10.104

2.修改主机名称

vim /etc/hostname
#hadoop104
解决不显示ens33问题

1.执行下面的命令,ifconfig出现ens33,但没有ip地址

ifconfig ens33 up 

2.执行下面的命令,此时应该就出现ip了

systemctl stop NetworkManager
ifup ens33

3.重启网络

systemctl restart network.service

4.执行ifconfig检测是否ens33是否已获取到ip地址

5.最后一步:永久关闭NetworkManager,保证下次开机ens33会自启动

systemctl disable NetworkManager
安装jdk

1.解压jdk压缩包

tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

2.配置 JDK 环境变量

创建my_env.sh文件

 sudo vim /etc/profile.d/my_env.sh
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
安装hadoop

1.解压hadoop压缩包

tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

2.配置 HADOOP环境变量

#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

本地运行模式

计算wordcount案例

hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount /root/test /root/re

完全分布式运行模式

集群分发脚本编写
#!/bin/bash
#验证参数
if(($#!=1))
then
        echo 请输入要分发的文件!
        exit;
fi
#获取分发文件的绝对路径
dirpath=$(cd -P `dirname $1`;pwd)
filename=$(basename $1)

echo "您要分发的文件路径是:$dirpath/$filename"

user=$(whoami)

for((i=102;i<=104;i++))
do
        echo ----------------------hadoop$i-----------------------
        rsync -rvlt $dirpath/$filename $user@hadoop$i:$dirpath
done
集群 执行命令脚本
#!/bin/bash
if(($#==0))
then
        echo 请输入要执行的命令!
        exit;
fi

echo "要执行的命令是:$*"

#执行命令
for((i=102;i<=104;i++))
do
        echo ------------------hadoop$i------------------
        ssh hadoop$i $*
done
免密登录配置

(1)生成密钥

ssh-keygen -t rsa

(2) 分发密钥

ssh-copy-id hadoop101#地址
配置core-site.xml
<!-- 指定 NameNode 的地址 -->
 <property>
 <name>fs.defaultFS</name>
 <value>hdfs://hadoop102:8020</value>
 </property>
 <!-- 指定 hadoop 数据的存储目录 -->
 <property>
 <name>hadoop.tmp.dir</name>
 <value>/opt/module/hadoop-3.1.3/data</value>
 </property>
 <!-- 配置 HDFS 网页登录使用的静态用户为 atguigu -->
 <property>
 <name>hadoop.http.staticuser.user</name>
 <value>atguigu</value>
 </property>
配置hdfs.xml
<!-- nn web 端访问地址-->
<property>
 <name>dfs.namenode.http-address</name>
 <value>hadoop102:9870</value>
 </property>
<!-- 2nn web 端访问地址-->
 <property>
 <name>dfs.namenode.secondary.http-address</name>
 <value>hadoop104:9868</value>
 </property>
配置yarn-site.xml
<!-- 指定 MR 走 shuffle -->
 <property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
 </property>
 <!-- 指定 ResourceManager 的地址-->
 <property>
 <name>yarn.resourcemanager.hostname</name>
 <value>hadoop103</value>
 </property>
 <!-- 环境变量的继承 -->
 <property>
 <name>yarn.nodemanager.env-whitelist</name>
 
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
 </property>
配置mapred-site.xml
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
 <property>
 <name>mapreduce.framework.name</name>
 <value>yarn</value>
 </property>
配置 workers
hadoop102
hadoop103
hadoop104
启动集群

(1)如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停 止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)

hadoop namenode -format
start-dfs.sh
start-yarn.sh

Web 端查看 HDFS 的 NameNode

(a)浏览器中输入:http://hadoop102:9870

(b)查看 HDFS 上存储的数据信息

Web 端查看 YARN 的 ResourceManager

(a)浏览器中输入:http://hadoop103:8088

(b)查看 YARN 上运行的 Job 信息

集群崩溃处理方法

1.停止集群

stop-dfs.sh
stop-yarn.sh

2.删除三台集群下data和logs目录

cd /opt/module/hadoop-3.1.3/data/ /opt/module/hadoop-3.1.3/logs/

3.重新格式化namenode

hadoop namenode -format
配置历史服务器

1.配置mapred-site.xml

<!-- 历史服务器端地址 -->
<property>
 <name>mapreduce.jobhistory.address</name>
 <value>hadoop102:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
 <name>mapreduce.jobhistory.webapp.address</name>
 <value>hadoop102:19888</value>
</property>

2.分发配置

xsync /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml

3.在hadoop102上启动历史服务器(需要重启mapreduce)

mapred --daemon start historyserver

若果报Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster错误配置mapred-site.xml文件

<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
配置日志的聚集

注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和HistoryServer。

1.编辑yarn-site.xml

<!-- 开启日志聚集功能 -->
<property>
 <name>yarn.log-aggregation-enable</name>
 <value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property> 
 <name>yarn.log.server.url</name> 
 <value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
 <name>yarn.log-aggregation.retain-seconds</name>
 <value>604800</value>
</property>

2.分发配置

 xsync $HADOOP_HOME/etc/hadoop/yarnsite.xml

3.关闭 NodeManager 、ResourceManager 和 HistoryServer

stop-yarn.sh
mapred --daemon stop historyserver

4.启动 NodeManager 、ResourceManage 和 HistoryServer

start-yarn.sh
mapred --daemon start historyserver

5.执行 WordCount 程序

hadoop jar 
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar 
wordcount /input /output

6.查看日志

Hadoop 集群启停脚本
#!/bin/bash
if [ $# == 0 ]
then
        echo '请输入参数!'
        exit;
fi


case $1 in
"start")
        echo ---------------启动hadoop集群-----------------
        echo ---------------   启动hdfs   ----------------
        ssh hadoop102 start-dfs.sh
        echo ---------------   启动yarn   ----------------
        ssh hadoop103 start-yarn.sh
        echo ---------------启动历史服务器----------------
        ssh hadoop102 mapred --daemon start historyserver
;;
"stop")
        echo ---------------关闭hadoop集群-----------------
        echo ---------------   关闭hdfs   ----------------
        ssh hadoop102 stop-dfs.sh
        echo ---------------   关闭yarn   ----------------
        ssh hadoop103 stop-yarn.sh
        echo ---------------关闭历史服务器----------------
        ssh hadoop102 mapred --daemon stop historyserver
;;
*)
        echo  "参数输入错误"
;;
esac
集群时间同步

(1)查看所有节点 ntpd 服务状态和开机自启动状态

sudo systemctl status ntpd
sudo systemctl start ntpd
sudo systemctl is-enabled ntpd

(2)修改 hadoop102 的 ntp.conf 配置文件

修改 1(授权 192.168.10.0-192.168.10.255 网段上的所有机器可以从这台机器上查询和同步时间)

sudo vim /etc/ntp.conf
#修改#restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap为 restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap

(3)注释以下字段并添加

#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0
fudge 127.127.1.0 stratum 10

(4)修改 hadoop102 的/etc/sysconfig/ntpd 文件

SYNC_HWCLOCK=yes

(5)重新启动 ntpd 服务并设置开机启动

sudo systemctl start ntpd
sudo systemctl enable ntpd

常见错误及解决方案

1)防火墙没关闭、或者没有启动 YARN

INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032

2)主机名称配置错误

3)IP 地址配置错误

4)ssh 没有配置好

5)root 用户和 atguigu 两个用户启动集群不统一

6)配置文件修改不细心

7)不识别主机名称

8)DataNode 和 NameNode 进程同时只能工作一个。

同时删除data和logs目录 重启集群

9)执行命令不生效,粘贴 Word 中命令时,遇到-和长–没区分开。导致命令失效

解决办法:尽量不要粘贴 Word 中代码。

10)jps 发现进程已经没有,但是重新启动集群,提示进程已经开启。

原因是在 Linux 的根目录下/tmp 目录中存在启动的进程临时文件,将集群相关进程删

除掉,再重新启动集群。

11)jps 不生效

原因:全局变量 hadoop java 没有生效。解决办法:需要 source /etc/profile 文件。

12)8088 端口连接不上

cat /etc/hosts

注释掉如下代码

#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

#::1 hadoop102

Yarn 生产环境核心参数配置案例

1)需求:从 1G 数据中,统计每个单词出现次数。服务器 3 台,每台配置 4G 内存,4 核CPU,4 线程。

2)需求分析:1G / 128m = 8 个 MapTask;1 个 ReduceTask;1 个 mrAppMaster

平均每个节点运行 10 个 / 3 台 ≈ 3 个任务(4 3 3)

3)修改 yarn-site.xml 配置参数如下:

<!-- 选择调度器,默认容量 -->
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capaci
ty.CapacityScheduler</value>
</property>
<!-- ResourceManager 处理调度器请求的线程数量,默认 50;如果提交的任务数大于 50,可以
增加该值,但是不能超过 3 台 * 4 线程 = 12 线程(去除其他应用程序实际不能超过 8) -->
<property>
<description>Number of threads to handle scheduler 
interface.</description>
<name>yarn.resourcemanager.scheduler.client.thread-count</name>
<value>8</value>
</property>
<!-- 是否让 yarn 自动检测硬件进行配置,默认是 false,如果该节点有很多其他应用程序,建议
手动配置。如果该节点没有其他应用程序,可以采用自动 -->
<property>
<description>Enable auto-detection of node capabilities such as
memory and CPU.
</description>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>false</value>
</property>
<!-- 是否将虚拟核数当作 CPU 核数,默认是 false,采用物理 CPU 核数 -->
<property>
<description>Flag to determine if logical processors(such as
hyperthreads) should be counted as cores. Only applicable on Linux
when yarn.nodemanager.resource.cpu-vcores is set to -1 and
yarn.nodemanager.resource.detect-hardware-capabilities is true.
</description>
<name>yarn.nodemanager.resource.count-logical-processors-ascores</name>
<value>false</value>
</property>
<!-- 虚拟核数和物理核数乘数,默认是 1.0 -->
<property>
<description>Multiplier to determine how to convert phyiscal cores to
vcores. This value is used if yarn.nodemanager.resource.cpu-vcores
is set to -1(which implies auto-calculate vcores) and
yarn.nodemanager.resource.detect-hardware-capabilities is set to true. 
The number of vcores will be calculated as number of CPUs * multiplier.
</description>
<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
<value>1.0</value>
</property>
<!-- NodeManager 使用内存数,默认 8G,修改为 4G 内存 -->
<property>
<description>Amount of physical memory, in MB, that can be allocated 
for containers. If set to -1 and
yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
automatically calculated(in case of Windows and Linux).
In other cases, the default is 8192MB.
</description>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- nodemanager 的 CPU 核数,不按照硬件环境自动设定时默认是 8 个,修改为 4 个 -->
<property>
<description>Number of vcores that can be allocated
for containers. This is used by the RM scheduler when allocating
resources for containers. This is not used to limit the number of
CPUs used by YARN containers. If it is set to -1 and
yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
automatically determined from the hardware in case of Windows and Linux.
In other cases, number of vcores is 8 by default.</description>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<!-- 容器最小内存,默认 1G -->
<property>
<description>The minimum allocation for every container request at the RM in MBs. Memory requests lower than this will be set to the value of 
this property. Additionally, a node manager that is configured to have 
less memory than this value will be shut down by the resource manager.
</description>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<!-- 容器最大内存,默认 8G,修改为 2G -->
<property>
<description>The maximum allocation for every container request at the 
RM in MBs. Memory requests higher than this will throw an
InvalidResourceRequestException.
</description>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 容器最小 CPU 核数,默认 1 个 -->
<property>
<description>The minimum allocation for every container request at the 
RM in terms of virtual CPU cores. Requests lower than this will be set to 
the value of this property. Additionally, a node manager that is configured 
to have fewer virtual cores than this value will be shut down by the 
resource manager.
</description>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<!-- 容器最大 CPU 核数,默认 4 个,修改为 2 个 -->
<property>
<description>The maximum allocation for every container request at the 
RM in terms of virtual CPU cores. Requests higher than this will throw an
InvalidResourceRequestException.</description>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>2</value>
</property>
<!-- 虚拟内存检查,默认打开,修改为关闭 -->
<property>
<description>Whether virtual memory limits will be enforced for
containers.</description>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 虚拟内存和物理内存设置比例,默认 2.1 -->
<property>
<description>Ratio between virtual memory to physical memory when
setting memory limits for containers. Container allocations are
expressed in terms of physical memory, and virtual memory usage is 
allowed to exceed this allocation by this ratio.
</description>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>

4)分发配置。

注意:如果集群的硬件资源不一致,要每个 NodeManager 单独配置

容量调度器多队列提交案例

需求 1:default 队列占总内存的 40%,最大资源容量占总资源 60%,hive 队列占总内存的 60%,最大资源容量占总资源 80%。

需求 2:配置队列优先级

1)在 capacity-scheduler.xml 中配置如下:

(1)修改如下配置

<!-- 指定多队列,增加 hive 队列 -->
<property>
 <name>yarn.scheduler.capacity.root.queues</name>
 <value>default,hive</value>
 <description>
 The queues at the this level (root is the root queue).
 </description>
</property>
<!-- 降低 default 队列资源额定容量为 40%,默认 100% -->
<property>
 <name>yarn.scheduler.capacity.root.default.capacity</name>
 <value>40</value>
</property>
<!-- 降低 default 队列资源最大容量为 60%,默认 100% -->
<property>
 <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
 <value>60</value>
</property>

(2)为新加队列添加必要属性:

<!-- 指定 hive 队列的资源额定容量 -->
<property>
 <name>yarn.scheduler.capacity.root.hive.capacity</name>
 <value>60</value>
</property>
<!-- 用户最多可以使用队列多少资源,1 表示 -->
<property>
 <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
 <value>1</value>
</property>
<!-- 指定 hive 队列的资源最大容量 -->
<property>
 <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
 <value>80</value>
</property>
<!-- 启动 hive 队列 -->
<property>
 <name>yarn.scheduler.capacity.root.hive.state</name>
 <value>RUNNING</value>
</property>
<!-- 哪些用户有权向队列提交作业 -->
<property>
 <name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
 <value>*</value>
</property>
<!-- 哪些用户有权操作队列,管理员权限(查看/杀死) -->
<property>
 <name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
 <value>*</value>
</property>
<!-- 哪些用户有权配置提交任务优先级 -->
<property>
 
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
 <value>*</value>
</property>
<!-- 任务的超时时间设置:yarn application -appId appId -updateLifetime Timeout
参考资料: https://blog.cloudera.com/enforcing-application-lifetime-slasyarn/ --> <!-- 如果 application 指定了超时时间,则提交到该队列的 application 能够指定的最大超时
时间不能超过该值。
-->
<property>
 <name>yarn.scheduler.capacity.root.hive.maximum-applicationlifetime</name>
 <value>-1</value>
</property>
<!-- 如果 application 没指定超时时间,则用 default-application-lifetime 作为默认
值 -->
<property>
 <name>yarn.scheduler.capacity.root.hive.default-applicationlifetime</name>
 <value>-1</value>
</property>

2)分发配置文件

3)重启 Yarn 或者执行 yarn rmadmin -refreshQueues 刷新队列,就可以看到两条队列

向 Hive 队列提交任务
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename=hive /input /output
任务优先级

容量调度器,支持任务优先级的配置,在资源紧张时,优先级高的任务将优先获取资源。默认情况,Yarn 将所有任务的优先级限制为 0,若想使用任务的优先级功能,须开放该限制。

1)修改 yarn-site.xml 文件,增加以下参数

<property>
 <name>yarn.cluster.max-application-priority</name>
 <value>5</value>
</property>

2)分发配置,并重启 Yarn

3)模拟资源紧张环境,可连续提交以下任务,直到新提交的任务申请不到资源为止。

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 5 2000000

4)再次重新提交优先级高的任务

hadoop jar /opt/module/hadoop-
3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -D mapreduce.job.priority=5 5 2000000

5)也可以通过以下命令修改正在执行的任务的优先级。

yarn application -appID application_1611133087930_0009 -updatePriority 5

公平调度器案例

创建两个队列,分别是 test 和 atguigu(以用户所属组命名)。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行;若未指定队列,test 用户提交的任务到 root.group.test 队列运行,atguigu 提交的任务到 root.group.atguigu 队列运行(注:group 为 用户所属组)。公平调度器的配置涉及到两个文件,一个是 yarn-site.xml,另一个是公平调度器队列分配文件 fair-scheduler.xml(文件名可自定义)。

配置多队列的公平调度器

1)修改 yarn-site.xml 文件,加入以下参数

<property>
 <name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairS
cheduler</value>
 <description>配置使用公平调度器</description>
</property>
<property>
 <name>yarn.scheduler.fair.allocation.file</name>
 <value>/opt/module/hadoop-3.1.3/etc/hadoop/fair-scheduler.xml</value>
 <description>指明公平调度器队列分配配置文件</description>
</property>
<property>
 <name>yarn.scheduler.fair.preemption</name>
 <value>false</value>
 <descriptio

2)配置 fair-scheduler.xml

<?xml version="1.0"?>
<allocations>
 <!-- 单个队列中 Application Master 占用资源的最大比例,取值 0-1 ,企业一般配置 0.1 
-->
 <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
 <!-- 单个队列最大资源的默认值 test atguigu default -->
 <queueMaxResourcesDefault>4096mb,4vcores</queueMaxResourcesDefault>
 <!-- 增加一个队列 test -->
 <queue name="test">
 <!-- 队列最小资源 -->
 <minResources>2048mb,2vcores</minResources>
 <!-- 队列最大资源 -->
 <maxResources>4096mb,4vcores</maxResources>
 <!-- 队列中最多同时运行的应用数,默认 50,根据线程数配置 -->
 <maxRunningApps>4</maxRunningApps>
 <!-- 队列中 Application Master 占用资源的最大比例 -->
 <maxAMShare>0.5</maxAMShare>
 <!-- 该队列资源权重,默认值为 1.0 -->
 <weight>1.0</weight>
 <!-- 队列内部的资源分配策略 -->
 <schedulingPolicy>fair</schedulingPolicy>
 </queue>
 <!-- 增加一个队列 atguigu -->
 <queue name="atguigu" type="parent">
 <!-- 队列最小资源 -->
 <minResources>2048mb,2vcores</minResources>
 <!-- 队列最大资源 -->
 <maxResources>4096mb,4vcores</maxResources>
 <!-- 队列中最多同时运行的应用数,默认 50,根据线程数配置 -->
 <maxRunningApps>4</maxRunningApps>
 <!-- 队列中 Application Master 占用资源的最大比例 -->
 <maxAMShare>0.5</maxAMShare>
 <!-- 该队列资源权重,默认值为 1.0 -->
 <weight>1.0</weight>
 <!-- 队列内部的资源分配策略 -->
 <schedulingPolicy>fair</schedulingPolicy>
 </queue>
 <!-- 任务队列分配策略,可配置多层规则,从第一个规则开始匹配,直到匹配成功 -->
 <queuePlacementPolicy>
 <!-- 提交任务时指定队列,如未指定提交队列,则继续匹配下一个规则; false 表示:如果指
定队列不存在,不允许自动创建-->
 <rule name="specified" create="false"/>
 <!-- 提交到 root.group.username 队列,若 root.group 不存在,不允许自动创建;若
root.group.user 不存在,允许自动创建 -->
 <rule name="nestedUserQueue" create="true">
 <rule name="primaryGroup" create="false"/>
 </rule>
 <!-- 最后一个规则必须为 reject 或者 default。Reject 表示拒绝创建提交失败,
default 表示把任务提交到 default 队列 -->
 <rule name="reject" />
 </queuePlacementPolicy>
</allocations>

3)分发配置并重启 Yarn

测试提交任务

1)提交任务时指定队列,按照配置规则,任务会到指定的 root.test 队列

hadoop jar /opt/module/hadoop-
3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -Dmapreduce.job.queuename=root.test 1 1

2)提交任务时不指定队列,按照配置规则,任务会到 root.atguigu.atguigu 队列

hadoop jar /opt/module/hadoop-
3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1
Yarn 的 Tool 接口案例

看代码

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 占用内存都是自动分配的,且相等。不是很合理。

经验参考:https://docs.cloudera.com/documentation/enterprise/6/release-notes/topics/rg_hardware_requirements.html#concept_fzz_dq4_gbb

(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 /

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)先进入安全模式

bin/hdfs dfsadmin -safemode enter

(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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值