1 Hadoop 3.2.4分布式环境搭建
1 系统配置
-
3台centOS虚拟机
# 配置hosts解析 vim /etc/hosts 192.168.88.129 hadoop1 192.168.88.130 hadoop2 192.168.88.131 hadoop3
-
修改主机名
hostnamectl set-hostname hadoop1 hostnamectl set-hostname hadoop2 hostnamectl set-hostname hadoop3
-
关闭防火墙
#关闭防火墙 systemctl stop firewalld.service #禁用开机启动 systemctl disable firewalld.service #重启防火墙 systemctl restart firewalld.service #查看防火墙状态 systemctl status firewalld.service
生产环境不允许直接关闭防火墙!!!只能配置策略,开通特定的端口!!
-
禁用selinux
修改
/etc/selinux/config
设置SELINUX=disabled
vim /etc/selinux/config
-
重启使主机名等配置生效
-
创建hadoop用户,并设置密码
useradd hadoop passwd hadoop
所有主机上都创建
密码:fmi135246
-
配置hadoop用户的root权限
vim /etc/sudoers
在
%wheel
下一行添加内容hadoop ALL=(ALL) NOPASSWD:ALL
NOPASSWD:ALL
表示使用sudo
命令时免输入密码 , 需要放在 %wheel
下一行 , 否则可能失效 -
设置ssh免密登录
# 进入密钥目录(有可能不存在) cd ~/.ssh # 删除旧密钥 rm -rf ~/.ssh # 生成密钥 ssh-keygen -t rsa # 公钥复制到ssh指定的密钥文件 authorized_keys cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys #修改文件权限(不设置可能导致失败) chmod 600 ~/.ssh/authorized_keys # 测试免密登录 ssh -vvv hadoop1 # 退出ssh登录 exit
ssh -vvv
-vvv 表示输出调试信息,如果免密失败,可以从调试信息中查看原因,我在测试中,非root用户,必须修改 authorized_keys 文件的权限,否则设置免密不成功 -
将hadoop1的公钥内容添加到其他主机的
~/.ssh/authorized_keys
中,这样hadoop1可以免密登录其他主机# 在hadoop1上执行 ssh-copy-id hadoop1 ssh-copy-id hadoop2 ssh-copy-id hadoop3
其他主机上同理执行
2 JDK安装
-
解压安装包到
/opt/module
# 创建目录 sudo mkdir -p /opt/module # 修改权限 sudo chown -R hadoop:hadoop /opt/module # 解压安装包到/opt/module tar -xvf jdk-8u341-linux-x64.tar.gz -C /opt/module/ # 修改jdk目录名 mv /opt/module/jdk1.8.0_341/ /opt/module/jdk
-
配置环境变量
可直接将jdk路径配置到
/etc/profile
文件,或者在/etc/profile.d/
新建my_env.sh
# 编辑文件 sudo vim /etc/profile.d/my_env.sh # 添加内容 export JAVA_HOME=/opt/module/jdk export PATH=$PATH:$JAVA_HOME/bin # 使变量生效 source /etc/profile # 测试jdk java -version
使用上个命令的参数
!$
,或者alt + .
3 安装hadoop
-
解压到
/opt/module/hadoop
tar -xvf hadoop-3.2.4.tar.gz -C /opt/module sudo mv /opt/module/hadoop-3.2.4 /opt/module/hadoop
-
配置环境变量到
/etc/profile.d/my_env.sh
# 添加内容 export JAVA_HOME=/opt/module/jdk export PATH=$PATH:$JAVA_HOME/bin export HADOOP_HOME=/opt/module/hadoop export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin #export HDFS_NAMENODE_USER=root #export HDFS_DATANODE_USER=root #export HDFS_SECONDARYNAMENODE_USER=root #export YARN_RESOURCEMANAGER_USER=root #export YARN_NODEMANAGER_USER=root
$HADOOP_HOME/bin 和 $HADOOP_HOME/sbin 必须加入环境变量
-
配置文件分发到其他主机
scp /etc/profile.d/my_env.sh hadoop2:/etc/profile.d/ scp /etc/profile.d/my_env.sh hadoop3:/etc/profile.d/
rsync -av p d i r / pdir/ pdir/fname u s e r @ user@ user@host: p d i r / pdir/ pdir/fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
-
使环境变量生效
source /etc/profile
-
配置
hadoop-env.sh
的jdk路径# 分别打开文件 vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh #vim /usr/local/hadoop/etc/hadoop/mapred-env.sh #vim /usr/local/hadoop/etc/hadoop/yarn-env.sh
添加
JAVA_HOME
配置export JAVA_HOME=/usr/local/jdk
验证配置
hadoop version
-
复制jdk和hadoop到其他主机
#通过ssh创建目录并修改权限 ssh hadoop2 'sudo mkdir -p /opt/module;sudo chown -R hadoop:hadoop /opt/module' ssh hadoop3 'sudo mkdir -p /opt/module;sudo chown -R hadoop:hadoop /opt/module' # 复制安装文件到hadoop2主机 scp -r /opt/module hadoop@hadoop2:/opt/ scp -r /opt/module hadoop@hadoop3:/opt/
-
登录其他主机配置jdk和hadoop的环境变量,参考前面配置
/etc/profile.d/my_env.sh
的步骤
4 hadoop配置文件配置
-
在
home/hadoop
目录下新建bin
目录,并将目录加到PATH
# 创建目录 mkdir -p /home/hadoop/bin # 修改环境变量 vim /etc/profile.d/my_env.sh
修改内容为:
export JAVA_HOME=/opt/module/jdk export PATH=$PATH:$JAVA_HOME/bin export HADOOP_HOME=/opt/module/hadoop export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:/home/hadoop/bin
-
编写集群文件分发脚本xsync
新建
xsync
文件vim ~/bin/xsync
添加如下内容
#!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 for host in 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
添加执行权限
chmod +x ~/bin/xsync
测试将文件复制到其他主机
xsync /home/hadoop/bin
-
集群规划部署
hadoop1 hadoop2 hadoop3 HDFS NameNode
DataNodeDataNode SecondaryNameNode
DataNodeYARN NodeManager ResourceManager
NodeManagerNodeManager 规划原则:
NameNode
,SecondaryNameNode
,ResourceManager
均比较占内存,故应部署在不同的主机上 -
配置文件说明
需要配置的配置文件位于hadoop安装目录下
$HADOOP_HOME/etc/hadoop
配置文件名 配置说明 core-site.xml 1 配置NameNode地址
2 配置hadoop数据存储目录
3 配置HDFS网页登录静态用户名hdfs-site.xml 1 配置NameNode web端访问地址
2 配置SecondaryNameNode web端访问地址yarn-site.xml 1 配置MR走shuffle
2 配置ResourceManger地址mapred-site.xml 1 配置MapReduce程序运行在yarn上 -
配置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/data</value> </property> <!-- 配置HDFS网页登录使用的静态用户为hadoop --> <property> <name>hadoop.http.staticuser.user</name> <value>hadoop</value> </property> </configuration>
-
配置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>
-
配置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> </configuration>
-
配置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>
-
-
同步配置文件到其他主机
xsync $HADOOP_HOME/etc/hadoop/
登录其他主机查看配置文件是否同步成功
-
启动集群
-
配置workers
vim $HADOOP_HOME/etc/hadoop/workers
添加内容
hadoop1 hadoop2 hadoop3
不能有空行,行尾不能有空格
-
同步文件到其他主机
xsync $HADOOP_HOME/etc
-
启动集群
如果是第一次启动,需要现在 NameNode 节点上执行格式化
#在NameNode节点,即hadoop1上执行 hdfs namenode -format
注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的
$HADOOP_HOME/data
和$HADOOP_HOME/logs
目录,然后再进行格式化。在hadoop1主机启动HDFS
#在NameNode节点执行,即hadoop1上执行 start-dfs.sh
在hadoop2主机启动YARN
#在ResourceManager节点执行,即hadoop2上执行 start-yarn.sh
-
通过web服务查看NameNode和ResourceManager
# 查看HDFS的NameNode http://hadoop1:9870 # 查看YARN的ResourceManager http://hadoop2:8088
如果页面都能正常打开则集群启动成功
-
查看各节点进程
# hadoop1 主机 [hadoop@hadoop1 hadoop]$ jps 21745 NodeManager 21860 Jps 20682 NameNode 20797 DataNode # hadoop2主机 [hadoop@hadoop2 hadoop]$ jps 9986 DataNode 10535 NodeManager 10410 ResourceManager 10891 Jps # hadoop3主机 [hadoop@hadoop3 hadoop]$ jps 17488 NodeManager 17584 Jps 17397 SecondaryNameNode 17289 DataNode
-
5 配置历史服务器
为了查看程序的历史运行情况,可以配置历史服务器
-
配置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>
-
同步配置到其他主机
xsync $HADOOP_HOME/etc
-
在hadoop1启动历史服务器
mapred --daemon start historyserver
-
查看进程
[hadoop@hadoop1 hadoop]$ jps 2176 NodeManager 1714 NameNode 2292 Jps 1865 DataNode 1533 JobHistoryServer
-
访问web
http://hadoop1:19888/jobhistory
6 配置日志聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
-
配置 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>
-
同步配置
xsync $HADOOP_HOME/etc
-
关闭NodeManager , ResourceManager , HistroyServer
# 在hadoop2上执行 stop-yarn.sh # 在hadoop1上执行 mapred --daemon stop historyserver
-
开启NodeManager , ResourceManager , HistroyServer
# 在hadoop2上执行 start-yarn.sh # 在hadoop1上执行 mapred --daemon start historyserver
7 编写Hadoop集群常用脚本
1 hadoop集群启停脚本
-
在
~/bin
目录下创建myhadoop.sh
vim ~/bin/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/sbin/start-dfs.sh" echo " --------------- 启动 yarn ---------------" ssh hadoop2 "/opt/module/hadoop/sbin/start-yarn.sh" echo " --------------- 启动 historyserver ---------------" ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon start historyserver" ;; "stop") echo " =================== 关闭 hadoop集群 ===================" echo " --------------- 关闭 historyserver ---------------" ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon stop historyserver" echo " --------------- 关闭 yarn ---------------" ssh hadoop2 "/opt/module/hadoop/sbin/stop-yarn.sh" echo " --------------- 关闭 hdfs ---------------" ssh hadoop1 "/opt/module/hadoop/sbin/stop-dfs.sh" ;; *) echo "Input Args Error..." ;; esac
-
添加执行权限
chmod +x ~/bin/myhadoop.sh
-
测试脚本
# 停止 myhadoop.sh stop # 启动 myhadoop.sh start
-
同步文件
xsync ~/bin
2 查看三台主机的java进程脚本
-
在
~/bin
目录下创建jpsall
vim ~/bin/jpsall
-
添加内容
#!/bin/bash for host in hadoop1 hadoop2 hadoop3 do echo =============== $host =============== ssh $host 'jps' done
-
添加执行权限
chmod +x ~/bin/jpsall
-
测试脚本
[hadoop@hadoop1 ~]$ jpsall =============== hadoop1 =============== 4448 DataNode 4723 NodeManager 4889 JobHistoryServer 4985 Jps 4299 NameNode =============== hadoop2 =============== 4372 DataNode 4550 ResourceManager 5053 Jps 4686 NodeManager =============== hadoop3 =============== 3420 SecondaryNameNode 3677 Jps 3310 DataNode 3503 NodeManager
-
同步到其他主机
xsync ~/bin/
8 默认常用端口号说明
端口 | Hadoop2.X | hadoop3.x |
---|---|---|
NameNode内部通信端口 | 8020/9000 | 8020/9000/9820 |
NameNode HTTP UI | 50070 | 9870 |
MapReduce 查看执行任务端口 | 8088 | 8088 |
历史服务器通信端口 | 19888 | 19888 |