大数据之—Hadoop环境搭建
从纯净centos7虚拟机克隆出一台虚拟机节点node1,先安装一些基础的环境,后面基于node1基础节点状态克隆出其余节点
一、节点规划
192.168.0.137 node1
192.168.0.138 node2
192.168.0.139 node3
配置域名映射
echo "192.168.0.137 node1" >> /etc/hosts
echo "192.168.0.138 node2" >> /etc/hosts
echo "192.168.0.139 node3" >> /etc/hosts
二、node1机器处理
1、基础环境
# 调通网络
ping www.baidu.com
# 安装红帽系软件扩展包,ifconfig网络工具,文本编辑器
yum install -y epel-release net-tools vim
# 关闭防火墙策略
systemctl stop firewalld.service & systemctl disable firewalld.service & systemctl stop iptables.service
2、新建用户
# 方式一
# 创建用户需使用 root 登录
useradd hdp
# 添加密码
echo "hdp" | passwd --stdin hdp
# 配置 sudo 免密
sed -i '$ahdp ALL=(ALL) NOPASSWD:ALL' /etc/sudoers
sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers
# 方式二
# 新建用户
useradd hdp
passwd hdp
# 提升hdp账号权限,既后期使用sudo 命令时可不填写root账户的密码
vim /etc/sudoers
%wheel ALL=(ALL) ALL
hdp ALL=(ALL) NOPASSWD:ALL # 添加此行,一定要在这个位置(既107行下面)
3、创建hadop软件目录
# 解压目录
mkdir -p /opt/hadoop/module; mkdir -p /opt/hadoop/software; chown hdp:hdp /opt/hadoop/module; chown hdp:hdp /opt/hadoop/software
4、卸载自带的jdk
注意:如果机器上本来就有jdk8的环境,就不用卸载
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
5、安装JDK
下载:http://www.codebaoku.com/jdk/jdk-oracle-jdk1-8.html
配置环境变量:vim /etc/profile.d/my_env.sh
#JAVA_HOME
export JAVA_HOME=/opt/jdk/java8
export PATH=$PATH:$JAVA_HOME/bin
刷新环境并测试:source /etc/profile; java -version
6、安装Hadoop
(必须要配置JAVA_HOME,否则启动时就会报错找不到JAVA_HOME)配置Hadoop使用的JAVA_HOME:
vim /opt/hadoop/module/hadoop-3.1.3/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/jdk/java8
下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/
版本:hadoop-3.1.3.tar.gz
上传至目录:/opt/hadoop/software/
修改文件权限:chown hdp:hdp hadoop-3.1.3.tar.gz
解压缩:tar -zxvf /opt/hadoop/software/hadoop-3.1.3.tar.gz -C /opt/hadoop/module/
配置环境变量:vim /etc/profile.d/my_env.sh
# HADOOP_HOME
export HADOOP_HOME=/opt/hadoop/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
刷新环境并测试:source /etc/profile; hadoop -version
7、集群文件分发脚本
需求:循环复制文件到所有节点的相同目录下(此脚本需要)
【xsync】
sudo touch /bin/xsync && sudo chmod +x /bin/xsync && vim /bin/xsync
#!/bin/bash
# 定义主机范围
host_names=(node1 node2 node3)
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo "参数不足"
exit;
fi
#2. 遍历集群所有机器
for host in ${host_names[@]}
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
scp:远程安全拷贝
命令 递归 要拷贝的文件绝对路径/名称 目的地用户@主机:目的地路径/名称
scp -r $pdir/$fname $user@$host:$pdir/$fname
例如
scp -r /opt/module/jdk1.8.0_212 hdp@node2:/opt/module
rsync:远程文件增量式同步
安装:yum install -y rsync
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
rsync -av $pdir/$fname $user@$host:$pdir/$fname
例如:
rsync -av /opt/module/hadoop-3.1.3/ hdp@node2:/opt/module/hadoop-3.1.3/
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
三、node2、node3机器处理
0、node1完全处理完了在克隆这两个节点
1、从node1克隆出node2、node3节点
2、修改主机名、修改ip地址
nmtui
4、修改域名映射(同node1)
5、配置三台机器互相免密登录
三台机器分别以hdp与root角色全部执行一遍以下命令,为了同步文件与配置
# 删除原来的ssh配置
cd & rm -rf .ssh/
# 按顺序执行多个命令,忽略错误,上一条的错误不会影响下一条命令的正常执行
cd & mkdir .ssh & cd .ssh & ssh-keygen -t rsa
# 按顺序执行多个命令,上一条执行成功才执行下一条,中途出错则在出错的地方停止执行
# cd && mkdir .ssh && cd .ssh && ssh-keygen -t rsa
最后三台机器全部执行命令:(分别向其它主机拷贝公钥用于免密登录)
cat /etc/hosts | awk '/node/{print $2}' | xargs -i ssh-copy-id {}
(root用户不用执行此命令
)问题处理:配置ssh免密登录后,hdp用户依然需要输入密码登录
chmod 755 /home/`whoami`/; chmod 700 /home/`whoami`/.ssh/ ;chmod 600 /home/`whoami`/.ssh/authorized_keys;
6、同步文件与配置
xsync /opt/hadoop/module/; xsync /etc/profile.d/my_env.sh; source /etc/profile
四、集群配置
1、集群部署规划
原则:
- NameNode和SecondaryNameNode不要部署在同一个节点上
- ResourceManager消耗内存,不要和NameNode、SecondaryNameNode部署在同一节点上
部署情况:
node1 | node2 | node3 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
2、配置文件说明
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
(1)默认配置文件:
/opt/hadoop/module/hadoop-3.1.3/share/hadoop
默认文件 | 文件存放在Hadoop的jar包中的位置 |
---|---|
[core-default.xml] | hadoop-common-3.1.3.jar/core-default.xml |
[hdfs-default.xml] | hadoop-hdfs-3.1.3.jar/hdfs-default.xml |
[yarn-default.xml] | hadoop-yarn-common-3.1.3.jar/yarn-default.xml |
[mapred-default.xml] | hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml |
(2)自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
3、配置集群
(1)核心配置文件
配置core-site.xml:vim $HADOOP_HOME/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为hdp -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hdp</value>
</property>
</configuration>
(2)HDFS配置文件:vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>node1:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node3:9868</value>
</property>
</configuration>
(3)YARN配置文件:vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node2</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>
</configuration>
(4)MapReduce配置文件:vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(5)分发配置
xsync $HADOOP_HOME/etc/hadoop/
# 查看分发情况:
cat $HADOOP_HOME/etc/hadoop/core-site.xml
4、群起集群
1、配置workers
vim $HADOOP_HOME/etc/hadoop/workers
node1
node2
node3
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步群起配置
xsync $HADOOP_HOME/etc
2、启动集群
更改应用启动权限
chown hdp:hdp -R /opt/hadoop/module/
(1)如果集群是第一次启动,需要在node1节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。)
hdfs namenode -format
(2)启动HDFS(在NameNode节点上执行:node1,会引导其它DataNode启动)
$HADOOP_HOME/sbin/start-dfs.sh
(3)停止HDFS(同上)
$HADOOP_HOME/sbin/stop-dfs.sh
(4)在配置了ResourceManager的节点(node2)启动YARN
$HADOOP_HOME/sbin/start-yarn.sh
(5)停止YARN
$HADOOP_HOME/sbin/stop-yarn.sh
(6)Web端查看HDFS的NameNode
- 浏览器中输入:http://node1:9870
- 查看HDFS上存储的数据信息
(7)Web端查看YARN的ResourceManager
-
浏览器中输入:http://node2:8088
-
查看YARN上运行的Job信息
3、集群基本可用性测试
略....
4、配置历史服务器
为了查看程序历史运行情况,可以配置历史服务器。具体配置步骤如下:
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
- 分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
- 启动历史服务器
mapred --daemon start historyserver
- 停止历史服务器
mapred --daemon stop historyserver
- 查看JobHistory
五、配置日志聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
- 配置yarn-site.xml
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
- 分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
- 重启ResourceManager(node2)和HistoryServer(node1)
node2执行: $HADOOP_HOME/sbin/stop-yarn.sh && $HADOOP_HOME/sbin/start-yarn.sh
node1执行:mapred --daemon stop historyserver && mapred --daemon start historyserver
六、集群启动/停止方式总结
1、各个模块分开启动停止(配置ssh是前提)常用
- HDFS集群启停
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/stop-dfs.sh
- YARN集群启停
$HADOOP_HOME/sbin/start-yarn.sh
$HADOOP_HOME/sbin/stop-yarn.sh
2、各个服务组件逐一启动/停止
- HDFS单节点启停
hdfs --daemon start/stop namenode/datanode/secondarynamenode
- YARN单节点启停
yarn --daemon start/stop resourcemanager/nodemanager
八、编写Hadoop集群常用脚本
1、Hadoop集群一键启停脚本
包含HDFS,Yarn,Historyserver服务
【myhadoop】
touch /opt/myhadoop ; chmod +x /opt/myhadoop; vim /opt/myhadoop
#!/bin/bash
if [ $# -lt 1 ]
then
echo "没有参数输入..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh node1 "$HADOOP_HOME/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh node2 "$HADOOP_HOME/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh node1 "$HADOOP_HOME/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh node1 "$HADOOP_HOME/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh node2 "$HADOOP_HOME/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh node1 "$HADOOP_HOME/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
2、查看三台服务器Java进程脚本
可能的问题(本质就是没有读取到java环境变量,把java的环境变量配置到/etc/profile.d/my_env.sh
中即可):ssh远程执行命令而找不到环境变量
【jpsall】
touch /opt/jpsall ; chmod +x /opt/jpsall ; vim /opt/jpsall;
#!/bin/bash
# 定义主机范围
host_names=(node1 node2 node3)
for host in ${host_names[@]}
do
echo =============== $host ===============
ssh $host jps
done
3、文件分发脚本
xsync /opt/jpsall ; xsync /opt/jpsall
九、常用端口号说明
端口名称 | Hadoop2.x | Hadoop3.x |
---|---|---|
NameNode内部通信端口 | 8020 / 9000 | *8020 / 9000/9820 |
NameNode HTTP UI | *50070 | *9870 |
MapReduce查看执行任务端口 | 8088 | 8088 |
历史服务器通信端口 | 19888 | 19888 |
十、集群时间同步
时间矫正的原因:如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
参考:https://www.cnblogs.com/harrymore/p/9566229.html
说明
安装包与参考文献都在阿里云盘里