本文用于记录我的第一次内网大数据集群配置过程。
本篇主要实现JDK安装、Hadoop集群配置。
配置使用的软件版本和脚本参考自尚硅谷,链接如下:
链接: https://www.bilibili.com/video/BV1rL411E7uz?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click
传输工具
使用xshelll进行远程连接,使用xftp进行数据传输。
官网链接:
https://www.xshell.com/zh/xshell/
https://www.xshell.com/zh/xftp/
集群进程查看脚本
命名为jpsall,保存在/home/hadoop/bin。
[hadoop@hadoop1 ~]$ cd /home/hadoop/bin
[hadoop@hadoop1 bin]$ vim jpsall
脚本内容如下:
#!/bin/bash
for host in hadoop1 xcmg3 xcmg4
do
echo =============== $host ===============
ssh $host jps
done
保存后,修改脚本执行权限,并分发到集群内所有服务器。
[hadoop@hadoop1 bin]$ chmod +x jpsall
[hadoop@hadoop1 ~]$ xsync /home/hadoop/bin/
一、JDK安装
(1)使用xshell和xftp将JDK软件包导入到 /opt/software/jdk
(2)解压文件到 /opt/module
[hadoop@hadoop1 jdk]tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
(3)配置JDK环境变量
3.1 新建/etc/profile.d/my_env.sh文件
[hadoop@hadoop1 ~]$ 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
3.2 重置环境变量
[hadoop@hadoop1 ~]$ source /etc/profile
3.3 测试是否安装成功
[hadoop@hadoop1 ~]$ java -version
#如果能看到以下结果,则代表Java安装成功。
java version "1.8.0_212"
如果没有显示上述代码,就重启服务器。
二、Hadoop集群搭建
1.文件解压安装
hadoop压缩包为 hadoop-3.1.3.tar.gz
将压缩包传输到 /opt/software/ 中。
(1)解压文件
[hadoop@hadoop1 ~]$ cd /opt/software/
[hadoop@hadoop1 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
(2)添加环境变量
获取hadoop安装路径
[hadoop@hadoop1 hadoop-3.1.3]$ pwd
/opt/module/hadoop-3.1.3
修改/etc/profille.d/myenv.sh
[hadoop@hadoop1 hadoop-3.1.3]$ sudo vim /etc/profile.d/my_env.sh
在my_env.sh文件末尾添加如下内容
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
重置环境变量
[hadoop@hadoop1 hadoop-3.1.3]$ source /etc/profile
测试是否安装成功
[hadoop@hadoop1 hadoop-3.1.3]$ hadoop version
Hadoop 3.1.3
2.配置hadoop集群
2.1 集群部署规划
NameNode和SecondaryNameNode不要安装在同一台服务器。
ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
hadoop1 | hadoop2 | hadoop3 | |
---|---|---|---|
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
YARN | NodeManager | ResourceManager、NodeManager | NodeManager |
2.2 配置集群文件
对core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml这四个配置文件进行修改。
文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
2.2.1 配置core-site.xml
[hadoop@hadoop1 ~]$ cd $HADOOP_HOME/etc/hadoop
[hadoop@hadoop1 hadoop]$ vim 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://hadoop1:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
2.2.2 配置hdfs-site.xml
[hadoop@hadoop1 hadoop]$ vim 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>hadoop1:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop3:9868</value>
</property>
</configuration>
2.2.3 配置yarn-site.xml
[hadoop@hadoop1 hadoop]$ vim 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>hadoop2</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>
2.2.4 配置mapred-site.xml
[hadoop@hadoop1 hadoop]$ vim 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>
2.2.5 分发配置文件
分发配置文件到集群内所有客户机
[hadoop@hadoop1 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/
#在另外两台服务器上查看分发情况
[hadoop@hadoop2 ~]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
[hadoop@hadoop3 ~]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
2.3 群起集群
2.3.1 配置workers文件
[hadoop@hadoop1 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容
hadoop1
hadoop2
hadoop3
文件结尾不能出现空行,否则会出现错误。
同步所有节点配置文件
[hadoop@hadoop1 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc
2.3.2 格式化Namenode
如果集群是第一次启动,需要在hadoop1节点(主节点)格式化namenode。
格式化namenode,会产生新的集群id,导致namenode和datanode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。
[hadoop@hadoop1 hadoop-3.1.3]$ hdfs namenode -format
2.3.3 启动集群
启动HDFS,web端口号9870
[hadoop@hadoop1 hadoop-3.1.3]$ sbin/start-dfs.sh
启动yarn,web端口号8088
启动yarn的节点是配置了resourcemanager的节点。
[hadoop@hadoop2 hadoop-3.1.3]$ sbin/start-yarn.sh
2.4 配置历史服务器
2.4.1 配置mapred-site.xml
[hadoop@hadoop1 hadoop]$ vim mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address
</name>
<value>hadoop1:19888</value>
</property>
2.4.2 分发配置到集群
[hadoop@hadoop1 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
2.4.3 启动历史服务器
[hadoop@hadoop1 hadoop]$ mapred --daemon start historyserver
[hadoop@hadoop1 hadoop]$ jps
web端口
http://hadoop1:19888/jobhistory
2.5 配置日志聚集
2.5.1 日志聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
2.5.2 配置yarn-site.xml
[hadoop@hadoop1 hadoop]$ vim yarn-site.xml
在该文件里面增加如下配置。
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop1:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2.5.3 分发配置
[hadoop@hadoop1 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
之后重启NodeManager 、ResourceManager和HistoryServer
[hadoop@hadoop2 hadoop-3.1.3]$ sbin/stop-yarn.sh
[hadoop@hadoop2 hadoop-3.1.3]$ mapred --daemon stop historyserver
[hadoop@hadoop2 ~]$ start-yarn.sh
[hadoop@hadoop1 ~]$ mapred --daemon start historyserver
2.6 集群启停脚本
脚本命名为myhadoop.sh,保存在/home/hadoop/bin
[hadoop@hadoop1 ~]$ cd /home/hadoop/bin
[hadoop@hadoop1 bin]$ vim myhadoop.sh
脚本内容如下
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop1 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop2 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop1 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop1 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop2 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop1 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
保存后,修改脚本执行权限。
[hadoop@hadoop1 bin]$ chmod +x myhadoop.sh
启动集群
[hadoop@hadoop1 bin]$ myhadoop.sh start
关闭集群
[hadoop@hadoop1 bin]$ myhadoop.sh stop
3.集群分发脚本
编写xsync脚本,实现对差异文件的更新。
在/home/hadoop/bin目录下创建xsync文件
[hadoop@hadoop1 opt]$ cd /home/hadoop
[hadoop@hadoop1 ~]$ mkdir bin
[hadoop@hadoop1 ~]$ cd bin
[hadoop@hadoop1 bin]$ vim xsync
在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop1 hadoop2 hadoop3
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
#修改脚本xsync的执行权限
[hadoop@hadoop1 bin]$ chmod +x xsync
#测试脚本
[hadoop@hadoop1 ~]$ xsync /home/hadoop/bin
#将脚本复制到/bin中,以便全局调用
[hadoop@hadoop1 bin]$ sudo cp xsync /bin/
#同步环境变量配置(root所有者)
[hadoop@hadoop1 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
#让环境变量生效
[hadoop@hadoop2 bin]$ source /etc/profile
[hadoop@hadoop3 opt]$ source /etc/profile