大数据☀️搞定Hadoop集群☀️Hadoop运行模式-完全分布式
Posted 故里º
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据☀️搞定Hadoop集群☀️Hadoop运行模式-完全分布式相关的知识,希望对你有一定的参考价值。
目录
2.ssh连接时出现Host key verification failed的解决办法:
三大模式:
- 本地模式:数据存储在Linux服务器本地
- 伪分布式:数据存储在HDFS
- 完全分布式:数据存储在HDFS/多态服务器工作
完全分布式搭建:
分析:
- 准备三台客户机(关闭防火墙、静态IP、主机名称)
- 安装JDK
- 配置环境变量
- 配置集群
- 单点启动
- 配置SSH
- 群起并测试集群
编写集群分发脚本xsync:
1.scp(secure copy)安全拷贝:
scp定义:
scp可以实现服务器和服务器之间恶的数据拷贝(from server1 to server2)
scp基本语法:
scp -r $pdir/$fname $user@host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
scp -r jdk1.8.0_212/ root@192.168.10.102:/opt/module/
scp -r root@192.168.10.101:/opt/module/hadoop-3.1.3 ./
scp -r root@hadoop02:/opt/module/* root@hadoop04:/opt/module/
2.rsync远程同步工具:
- rsync主要用于备份和镜像。速度快、避免赋值相同内容和支持符号连接
- rsync和scp主要区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
基本语法:
rsync -av $pdir/$fname $user@host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项 | 功能 |
-a | 递归拷贝 |
-v | 显示复制过程 |
3.xsync集群分发脚本:
- 循环复制文件到所有节点的相同目录下
- 脚本命令:
xsunc 要同步的文件名
- 脚本要在任何路径下都可以使用(脚本放在声明了全局变量的路径)
进入/root/bin
目录:
在/root/bin
目录下创建脚本
脚本实现:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop02 hadoop03 hadoop04
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 777 xsync
分发脚本文件:
xsync bin/
分发配置文件:(同步环境变量)
xsync /etc/profile.d/my_env.sh
:
sudo ./bin/xsync /etc/profile.d/my_env.sh
source /etc/profile
:刷新资源
SSH无密登录配置:
配置SSH:
1.基本语法:
ssh 另外一台电脑的ip地址
2.ssh连接时出现Host key verification failed
的解决办法:
The authenticity of host '192.168.1.103 (192.168.1.103)' can't be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)?
直接输入yes
无密钥配置:
1.免密钥登录原理:
2.生成公钥和私钥:
进入root家目录:cd /root
查看所有文件(包括隐藏文件):ll -a
进入cd .ssh
目录
ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id rsa
(私钥)、id rsa.pub
(公钥)
3.将公钥拷贝到需要免密码登录的目标机器:
ssh-copy-id hadoop02
ssh-copy-id hadoop03
ssh-copy-id hadoop04
注意:使用root账户(不同的账户)需要重新配置免密码登录
配置完成后,执行xsync
命令时,不需要再次输入密码:
集群配置:
集群部署规划:
注意:
- NameNode和SecondaryNode不要安装在一台服务器,这两个占用内存资源较大。
- ResourceManager也很消耗内存,不要和NameNode和SecondaryNode配置在同一台机器上。
Hadoop02 | Hadoop03 | Hadoop04 | |
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
YARN | NodeManager | ResourceManager、NodeManager | NodeManager |
配置文件说明:
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-defalut.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 |
自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop
这个路径上,用户可以根据项目需求重新进行修改配置。
配置集群:
核心配置文件:
配置core-site.xml
cd $HADOOP_HOME/etc/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://hadoop02:8020</value>
</property>
<!--指定Hadoop数据的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
</configuration>
HDFS配置文件:
配置hdfs-site.xml
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.secondary.http-address</name>
<value>hadoop02:9870</value>
</property>
<!--2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop04:9868</value>
</property>
</configuration>
YARN配置文件:
配置yarn-site.xml
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>hadoop03</value>
</property>
<!--环境变量的继承(3.1.3的Bug后续版本中可以不用进行配置)-->
<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>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
MapReduce配置文件:
配置Mapred-site.xml
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>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop02:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop02:19888</value>
</property>
</configuration>
在集群上分发配置好的Hadoop配置文件:
/opt/module/hadoop-3.1.3/etc
:进入hadoop配置文件目录
xsync hadoop/
:分发文件
查看分发配置好的Hadoop文件:
cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
群起集群:
配置workers
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
注意:在编写配置这个配置文件时,不能有空格,或者空行!!!
hadoop02
hadoop03
hadoop04
cd /opt/module/hadoop-3.1.3/etc/hadoop
xsync workers
:分发配置文件,同步所有节点的配置文件
启动集群:
如果集群是第一次启动,需要在hadoop02节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止nameNode和dataNode进程,并且要删除所有机器的data和logs目录,然后再进行格式化)
/opt/module/hadoop-3.1.3
:进入hadoop目录
hdfs namenode -format
:格式化操作
格式化完成后会多出data、logs目录:
/opt/module/hadoop-3.1.3/sbin
sbin/star-dfs.sh
:启动HDFS
问题解决:
启动出现以下问题
[root@localhost sbin]# start-all.sh
Starting namenodes on [hadoop]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
2018-07-16 05:45:04,628 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting resourcemanager
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
Starting nodemanagers
ERROR: Attempting to operate on yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.
vim /etc/profile
:进入配置文件
加入以下内容:
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
source /etc/profile
:刷新配置文件
jps
:查看运行
程序启动后,通过web浏览器访问:
http://192.168.10.101:9870/dfshealth.html#tab-overview
注意:
如果web浏览器不能访问页面,注意以下操作:
- 防火墙是否打开,端口号是否开发
- 主机地址是否配置正确
在配置了ResourceManager的节点(hadoop103)启动YARN
sbin/start-yarn.sh
问题解决:
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
出现以上报错信息需要到 sbin 目录下 更改 start-yarn.sh 和 stop-yarn.sh 信息,在两个配置文件的第一行添加:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
最后再输入命令 /sbin/start-yarn.sh 启动 yarn
使用web浏览器访问:http://192.168.10.102:8088/cluster
hadoop fs -mkdir /wcinput
:创建目录
测试集群:
上传文件到集群:
hadoop fs -mkdir /wcinput(Hadoop目录)
:创建一个文件目录
hadoop fs -put wcinput/demo.txt(文件) /wcinput(Hadoop目录)
:上传文件到Hadoop
上传文件后查看文件放在什么位置:
1.查看HDFS文件储存位置:
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-433336804-192.168.10.101-1628733575726/current/finalized/subdir0/subdir0
2.使用cat命令可以查看文件内容
拼接:
cat 文件名 >> 映射文件.jar
tar -zxvf 文件名.jar
下载:
/opt/module/hadoop-3.1.3
:进入hadoop主目录
bin/hadoop fs -get 文件名 存放路径
执行:
/opt/module/hadoop-3.1.3
:进入hadoop主目录
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
集群启动/停止方式总结:
jps
:查看当前hadoop进程
cd /opt/module/hadoop-3.1.3
:进入hadoop主目录
sbin/star-dfs.sh
:启动hdfs(在hdfs启动的那台服务器上执行)
sbin/start-yarn.sh
:启动yarn(在yarn启动的那台服务器上执行)
cd /opt/module/hadoop-3.1.3
:进入hadoop主目录
sbin/stop-yarn.sh
:停止yarn(在yarn启动的那台服务器上执行)
sbin/stop-dfs.sh
:停止hdfs(在hdfs启动的那台服务器上执行)
重新格式化的时候必须删除每一台服务器上的data和logs再进行格式化
/opt/module/hadoop-3.1.3
:进入hadoop目录
hdfs namenode -format
:格式化操作
重新格式化集群操作:
1.删除所有节点的data和logs:
rm -rf 文件夹名称
:递归删除
2.停止所有节点上的服务:
3.重新格式化服务器:
4.重新启动服务:
配置历史服务器:
为了查看程序的历史运行情况,需要配置一下历史服务器!
配置mapred-site.xml:
cd /opt/module/hadoop-3.1.3/etc/hadoop
:进入目录
vim mapred-site.xml
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop02:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop02:19888</value>
</property>
xsync mapred-site.xml
:分发配置好的文件到各个节点服务器上
重新启动yarn:
sbin/stop-yarn.sh
sbin/start-yarn.sh
在hadoop02启动历史服务器:
cd /opt/module/hadoop-3.1.3
:进入hadoop主目录
bin/mapred --daemon start historyserver
:启动历史服务器
mapred --daemon stop historyserver
:停止历史服务器
配置日志的聚集:
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行情况,方便开发调试。
注意:开启日志聚集功能,需要重启NodeManager、ResourceManager、HistoryManager
配置yarn-site.xml
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://${yarn.timeline-service.webapp.address}/applicationhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.timeline-service.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.timeline-service.hostname</name>
<value>${yarn.resourcemanager.hostname}</value>
</property>
<property>
<name>yarn.timeline-service.http-cross-origin.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.system-metrics-publisher.enabled</name>
<value>true</value>
</property>
分发到各个节点上,重启服务!!!
集群时间同步:
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境根据任务对时间的准确程度要求周期同步。测试环境为了尽快看到效果,采用1分钟同步一次。
集群启动/停止脚本:
cd root/bin
:进入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 hadoop02 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop03 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop02 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop02 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop03 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop02 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
chmod 777 myhadoop.sh
:赋予脚本执行权限
问题解决:
[root@hadloop2 hadoop-3.3.0]# sbin/start-dfs.sh
Starting namenodes on [hadoop2]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop1]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
cd $HADOOP_HOME
:进入Hadoop主目录
- 对于start-dfs.sh和stop-dfs.sh文件,添加下列参数:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
- 对于start-yarn.sh和stop-yarn.sh文件,添加下列参数:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
查看三台服务器Java进程:jpsall脚本
#!/bin/bash
for host in hadoop02 hadoop03 hadoop04
do
echo =============== $host ===============
ssh $host jps
done
常用端口说明:
端口名称 | Hadoop2.X | Hadoop3.X |
NameNode内部通信端口 | 8020/9000 | 8020/9000/9820 |
NameNode HTTP UI(对用户的查询端口) | 50070 | 9870 |
MapReduce查看执行任务端口 | 8088 | 8088 |
历史服务器通信端口 | 19888 | 19888 |
以上是关于大数据☀️搞定Hadoop集群☀️Hadoop运行模式-完全分布式的主要内容,如果未能解决你的问题,请参考以下文章