Hadoop集群搭建
1、服务器配置
服务器名称 | 配置 |
---|---|
master | 2C 2G |
slave1 | 2C 2G |
slave2 | 1C 2G |
1.1 修改主机名
#Centos永久修改主机名命令
hostnamectl set-hostname master
1.2 主机映射
vim /etc/hosts
#需要设置的服务器:ip为内网,其他服务器:ip为外网
172.16.0.3 master master
1.94.5.165 slave1 slave1
123.249.87.176 slave2 slave2
测试是否能ping通
若ping不同,根据文档云服务器 实例 IP 地址 ping 不通-故障处理-文档中心-腾讯云 (tencent.com)进行故障排查
若想自己的电脑上通过主机名的方式访问服务器,需要修改本地的 “C:\Windows\System32\drivers\etc\hosts” 文件,将主机名和IP填入(全都是公网IP)
# 修改hosts文件
117.72.37.12 master
1.94.5.165 slave1
123.249.87.176 slave2
然后打开命令行,执行ipconfig /flushdns
命令刷新DNS缓存
1.3 SSH免密登录
先创建hadoop用户
# 创建hadoop用户
sudo useradd hadoop
# 设置密码
sudo passwd hadoop # zxyjw1314
# 添加hadoop用户到Hadoop组中
sudo usermod -a -G Hadoop hadoop
chmod u+w /etc/sudoers
vim /etc/sudoers
添加hadoop=(ALL)ALL
再设置免密登录
#生成公钥和私钥
ssh-keygen -t rsa
#将公钥复制到要免密登录的服务器上:ssh-copy-id 服务器名
#如要在master上免密登录slave1
ssh-copy-id slave1
1.4 安装Java和Hadoop
将jdk和hadoop压缩包通过xftp传输到服务器
# 在/opt下新建module和software文件夹
sudo mkdir /opt/module
sudo mkdir /opt/software
# 解压缩
tar -zxvf jdk-8u381-linux-x64.tar.gz -C /opt/module/
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
#配置环境变量
cd /etc/profile.d/
sudo vim my_env.sh
# my_env.sh
# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_381
export PATH=$PATH:$JAVA_HOME/bin
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
source /etc/profile
1.5 scp和rsync命令
1.5.1 scp(secure copy)安全拷贝
-
scp定义
scp可以实现服务器与服务器之间的数据拷贝
-
基本语法
scp -r $pdir/$fname $user@host:$pdir/$fname 命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
-
案例
前提:在master、slave1、slave2上都已经创建好了/opt/module和/opt/software两个目录,并且把这两个目录修改为hadoop:hadoop
sudo chown hadoop:hadoop -R /opt/module
-
在master上,将master中/opt/module/jdk_1.8.0_381目录拷贝到slave1上
scp -r /opt/module/jdk1.8.0_381 hadoop@slave1:/opt/module/
-
1.5.2 rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
-
基本语法
rsync -av $pdir/$fname $user@host:$pdir/$fname 命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称 选项参数说明 -a 归档拷贝 -v 显示复制过程
-
案例
-
删除master中/opt/module/hadoop-3.1.3/wcinput
rm -rf wcinput/
-
同步master中的/opt/module/hadoop-3.1.3到slave1
rsync -av hadoop-3.1.3/ hadoop@slave1:/opt/module/hadoop-3.1.3/
-
1.5.3 xsync集群分发脚本
-
需求:循环复制文件到所有节点的相同目录下
-
需求分析:
-
rsync命令原始拷贝
rsync -av /opt/module hadoop@slave1:/opt/
-
期望脚本
xsync fname(要同步的文件名称)
-
期望脚本在任何路径都能使用(把脚本放在声明了全局环境变量的路径 /home/hadoop/bin)
-
-
脚本实现
-
在/home/hadoop/bin目录下创建xsync文件
cd /home/hadoop mkdir bin cd bin vim xsync # 在xsync文件中编写代码 # !/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] then echo Not Enough Arguenment! exit fi #2. 遍历集群所有机器 for host in master slave1 slave2 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具有执行权限
chmod 777 xsync
-
2、集群配置
2.1 集群部署规划
- NameNode和SecondaryNameNode不要安装再同一台服务器
- ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在一台服务器
Master | Slave1 | Slave2 | |
---|---|---|---|
HDFS | NameNode DataNode |
DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager |
NodeManager |
2.2 配置文件
-
core-site.xml
<configuration> <!-- 指定NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://cloud1: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> <property> <name>hadoop.tmp.dir</name> <value>/var/log/hadoop/tmp</value> </property> </configuration>
-
hdfs-site.xml
<configuration> <!-- nn web端访问地址 --> <property> <name>dfs.namenode.http-address</name> <value>cloud1:9870</value> </property> <!-- 2nn web端访问地址 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>cloud3:9868</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/module/hadoop-3.1.3/hdfs/name</value> <final>true</final> </property> <property> <name>dfs.datanode.data.dir</name> <value>/opt/module/hadoop-3.1.3/hdfs/data</value> <final>true</final> </property> <property> <name>dfs.http.address</name> <value>cloud1:50070</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
-
yarn-site.xml
<configuration> <!-- 指定MR走shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>cloud2</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>
-
mapred-site.xml
<configuration> <!-- 指定MapReduce程序运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>cloud1:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>cloud1:19888</value> </property> <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> </configuration>
在/opt/module/hadoop-3.1.3/etc目录下执行 xsync hadoop/ 命令,将配置文件分发到另外两个服务器
内存配置调优
-
yarn-site.xml
<!-- yarn-site.xml --> <!-- ResourceManager配置 --> <!-- 设置NodeManager的最大内存,单位为MB,根据实际情况调整 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2048</value> </property> <!-- 设置每个容器的最小内存,单位为MB --> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>512</value> </property> <!-- 设置每个容器的最大内存,单位为MB,根据实际情况调整 --> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>2048</value> </property>
-
mapred-site.xml
<!-- mapred-site.xml --> <!-- MapReduce任务运行时的内存配置 --> <!-- 设置Map任务的内存,单位为MB --> <property> <name>mapreduce.map.memory.mb</name> <value>512</value> </property> <!-- 设置Reduce任务的内存,单位为MB --> <property> <name>mapreduce.reduce.memory.mb</name> <value>1024</value> </property>
2.3 群起集群
配置worker
# 在/opt/module/hadoop-3.1.3/etc/hadoop目录下
vim workers
# 在文件中增加以下内容
master
slave1
slave2
# 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行
# 同步所有节点配置文件
xsync workers
启动集群
-
如果集群是第一次启动,需要在master节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式话NameNode的话,一定要先停止NameNode和DataNode进程,并且要删除所有机器上的data和logs目录,然后再进行格式化。)
rm -rf data/ logs/
hdfs namenode -format
-
启动HDFS
sbin/start-dfs.sh
-
在配置了ResourceManager的节点(slave1)启动YARN
sbin/start-yarn.sh
-
Web端查看HDFS的NameNode
- 浏览器上输入:http://master:9870
- 查看HDFS上存储的数据信息
-
Web端查看YARN的ResourceManager
- 浏览器中输入:http://slave1:8088
- 查看YARN上运行的Job信息
配置历史服务器
-
配置mapred-site.xml
<!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property>
-
启动历史服务器
bin/mapred --daemon start historyserver
配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到JHDFS系统上。
开启日志聚集功能需要重新启动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://cloud1:19888/jobhistory/logs</value> </property> <!-- 设置日志保存时间为7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property> # 分发节点 xsync yarn-site.xml
-
重启YARN
2.4 集群启动和关闭
集群启停脚本/home/hadoop/bin目录下,myhadoop.sh
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit;
fi
case $1 in
"start")
echo " ========== 启动 hadoop集群 ========== "
echo " -------- 启动 hdfs -------- "
ssh master "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " -------- 启动 yarn -------- "
ssh slave1 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " -------- 启动 historyserver -------- "
ssh master "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " ========== 关闭 hadoop集群 ========== "
echo " -------- 关闭 historyserver -------- "
ssh master "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " -------- 关闭 yarn -------- "
ssh slave1 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " -------- 关闭 hdfs -------- "
ssh master "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
查看三台服务器Java进程脚本:jpsall
#!/bin/bash
for host in master slave1 slave2
do
echo ========== $host ==========
ssh $host jps
done
保存后退出,然后赋予脚本执行权限
chmod +x jpsall
2.5 集群启动过程中遇到的问题
2.5.1 端口号被占用
-
报错日志
# 报错日志 ERROR org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.BindException: Problem binding to [0.0.0.0:8040] java.net.BindException: Address already in use; For more details see: http://wiki.apache.org/hadoop/BindException
-
解决方案
# 1.首先查询被占用端口号 netstat -anp | grep 8040 tcp 0 0 192.168.0.104:8088 0.0.0.0:* LISTEN 13425/java # 2.然后查看进程的具体信息 ps -ef | grep 13425 # 3.杀死进程 kill 13425
3、WC程序运行
# 在hdfs创建input文件夹
hadoop fs -mkdir /input
# 将本地文件拷贝到hdfs
hadoop fs -put word.txt /input
标签:opt,hadoop,module,Hadoop,集群,yarn,3.1,master,搭建
From: https://www.cnblogs.com/coke0914/p/17967972