本文目录如下:
- 4 完全分布式运行模式(开发重点)
- 4.1 虚拟机准备
- 4.2 scp(secure copy)安全拷贝
- 4.3 rsync 远程同步工具
- 4.4 **`xsync集群分发脚本`**
- 4.4.1 需求分析:
- 4.4.2 脚本实现
- 4.4.3 xsync相关错误
- 4.5 集群配置
- 4.5.1 集群部署规划
- 4.5.2 配置集群 (修改配置文件)
- 4.5.3 在集群上分发配置好的Hadoop配置文件
- 4.5.4 查看文件分发情况
- 4.6 集群单点启动
- 4.7 SSH无密登录配置
- 4.7.1 配置ssh
- 4.7.2 无密钥配置
- 4.7.3 .ssh文件夹下(~/.ssh)的文件功能解释
- 4.8 群起集群
- 4.8.1 配置workers
- 4.8.2 启动集群
- 4.8.3 集群基本测试
- 4.9 集群启动/停止方式总结
- 4.9.1 各个服务组件逐一启动/停止
- 4.9.2 各个模块整体启动/停止(配置ssh是前提)常用
- 4.10 集群时间同步
- 4.10.1 检查ntp是否安装
- 4.10.2 修改 /etc/ntp.conf 配置文件
- 4.10.3 修改 /etc/sysconfig/ntpd 文件
- 4.10.4 重新启动ntpd服务
- 4.10.5 设置ntpd服务开机启动
- 4.11 其他机器配置(必须root用户)
4 完全分布式运行模式(开发重点)
步骤:
1)准备3台客户机(关闭防火墙、静态ip、主机名称)
2)安装JDK
3)配置环境变量
4)安装Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置ssh
9)群起并测试集群
注:可以直接看
4.4小节
进行操作。
4.1 虚拟机准备
详见3.1章。
4.2 scp(secure copy)安全拷贝
- (1) scp定义:
scp
可以实现服务器与服务器之间的数据拷贝。(from server1 to server2) - (2) 基本语法
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
# 例:远程把 Hadoop101 上的 /opt/module 拷贝到 Hadoop102 相同的位置
scp -r hadoop101:/opt/module/hadoop-3.2.1 hadoop102:/opt/module
# **注意**:拷贝过来的/opt/module目录,别忘了在hadoop102等目标主机上修改文件的所有者和所有者组。
sudo chown xqzhao:xqzhao -R /opt/module
# **注意**:拷贝过来的配置文件别忘了source一下/etc/profile,。
source /etc/profile
4.3 rsync 远程同步工具
- rsync主要用于
备份
和镜像
。具有速度快、避免复制相同内容和支持符号链接的优点。- rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
- (1) 基本语法
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
# 例:远程把 Hadoop101 上的 /opt/module 拷贝到 Hadoop102 相同的位置
rsync -av hadoopl01:/opt/module/hadoop-3.2.1 /opt/module
选项参数说明:
选项 | 功能 |
---|---|
-a | 归档拷贝 |
-v | 显示复制过程 |
注:归档拷贝:完完全全拷贝
4.4 xsync集群分发脚本
需求:循环复制文件到所有节点的相同目录下
4.4.1 需求分析:
- (1) rsync命令原始拷贝:
rsync -av /opt/module root@hadoop103:/opt/
- (2) 期望脚本:
xsync要同步的文件名称 - (3) 说明:
在/home/xqzhao/bin这个目录下存放的脚本,xqzhao用户可以在系统任何地方直接执行。
4.4.2 脚本实现
- (1) 在
/home/xqzhao
目录下创建xsync
文件,文件内容如下:
[xqzhao@hadoop100 /]$ cd ~
[xqzhao@hadoop100 ~]$ vim xsync
在该文件中编写如下代码:
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if ((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=101; host<103; host++)); do
echo ------------------- hadoop$host --------------
rsync -av $pdir/$fname $user@hadoop$host:$pdir
done
- (2) 修改脚本 xsync 具有执行权限
[xqzhao@hadoop100 ~]$ chmod 777 xsync
- (3) 调用脚本形式:xsync 文件名称
[xqzhao@hadoop100 ~]$ sudo cp xsync /bin
# 移动之后便可以全局使用
[xqzhao@hadoop100 ~]$ xsync 文件夹名称
注意:如果将xsync放到/bin
目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin
目录下。
- 注:
xsync
创建完成之后,通过xsync
脚本将Java
和Hadoop
的安装文件分发到集群中的其他虚拟机中的相应文件夹。并且不要忘记在 /etc/profile 中配置 java、hadoop 环境
- 注:可以先进行4.5的集群配置,然后再将配置好的Hadoop分发至其他机器。
4.4.3 xsync相关错误
Operation not permitted:点此查看解决办法
4.5 集群配置
4.5.1 集群部署规划
hadoop100 | hadoop101 | hadoop102 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
4.5.2 配置集群 (修改配置文件)
- 先在单个节点上配置好,然后在向集群分发文件。
- 进入配置文件目录
[xqzhao@hadoop100 hadoop-3.2.1]$ cd /opt/module/hadoop-3.2.1/etc/hadoop/
- (1) 核心配置文件
配置core-site.xml
[xqzhao@hadoop100 hadoop]$ vim core-site.xml
# 在该文件中编写如下配置
<!-- 指定HDFS中NameNode的地址 //内部通信地址,Web端无法通过8020访问 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:8020</value>
<!-- <value>hdfs://hadoop100:9000</value> -->
</property>
<!-- 指定 Hadoop 数据存储的目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.2.1/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 xqzhao-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>xqzhao</value>
</property>
<!-- 注:放在 <configuration> </configuration> 中间 -->
- (2) HDFS配置文件
配置hadoop-env.sh
[xqzhao@hadoop100 hadoop]$ vim hadoop-env.sh
# 修改如下选项
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置hdfs-site.xml
[xqzhao@hadoop100 hadoop]$ vim hdfs-site.xml
# 在该文件中编写如下配置
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- NameNode Web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop100:9870</value>
</property>
<!-- SecondaryNameNode Web端访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop102:9868</value>
</property>
- (3) MapReduce配置文件
配置mapred-env.sh
[xqzhao@hadoop100 hadoop]$ vim mapred-env.sh
# 修改如下选项
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置mapred-site.xml
[xqzhao@hadoop100 hadoop]$ vim mapred-site.xml
# 在该文件中增加如下配置
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- (4) YARN配置文件
配置yarn-env.sh
[xqzhao@hadoop100 hadoop]$ vim yarn-env.sh
# 修改如下选项
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置yarn-site.xml
[xqzhao@hadoop100 hadoop]$ vim yarn-site.xml
# 在该文件中增加如下配置
<!-- 指定 MapReduce 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
<!-- 环境变量的继承 //可以认为是解决了一个小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>
4.5.3 在集群上分发配置好的Hadoop配置文件
[xqzhao@hadoop100 hadoop]$ xsync /opt/module/hadoop-3.2.1/etc
4.5.4 查看文件分发情况
[xqzhao@hadoop101 hadoop]$ cat /opt/module/hadoop-3.2.1/etc/hadoop/core-site.xml
4.6 集群单点启动
- (1) 如果集群是第一次启动,需要
格式化NameNode
。
[xqzhao@hadoop100 hadoop-3.2.1]$ hdfs namenode -format
看到下列语句表示格式化成功
> 注意
:格式化之前,一定要先停止
上次启动的所有namenode和datanode进程,然后再删除data
和log
数据。否则会出现异常情况。
- (2) 在hadoop100上启动
NameNode
[xqzhao@hadoop100 hadoop-3.2.1]$ hdfs --daemon start namenode
[xqzhao@hadoop100 hadoop-3.2.1]$ jps
3461 NameNode
[xqzhao@hadoop100 hadoop-3.2.1]$ hdfs --daemon start datanode
[xqzhao@hadoop100 hadoop-3.2.1]$ jps
3461 NameNode
3608 Jps
3561 DataNode
[xqzhao@hadoop101 hadoop-3.2.1]$ hdfs --daemon start datanode
[xqzhao@hadoop101 hadoop-3.2.1]$ jps
3190 DataNode
3279 Jps
[xqzhao@hadoop102 hadoop-3.2.1]$ hdfs --daemon start datanode
[xqzhao@hadoop102 hadoop-3.2.1]$ jps
3237 Jps
3163 DataNode
- (4) 在hadoop102上启动
SecondaryNameNode
[xqzhao@hadoop102 hadoop-3.2.1]$ hdfs --daemon start secondarynamenode
[xqzhao@hadoop102 hadoop-3.2.1]$ jps
3237 Jps
3163 DataNode
3294 SecondaryNameNode
- (5) 奇怪的的问题
由于一些无法启齿的原因(内存不够开三个虚拟机),博主的主机配置为2个虚拟机
+1个阿里云服务器
,共3台主机(不知道能否这样搭配)。在这样的搭配下启动Hadoop集群时遇到的很棘手的问题,问题就出在这个阿里云服务器上,在阿里云服务器上启动SecondaryNameNode
时,报了下面这个错误:
- 针对这一个问题,大家可以参考这个博客解决:点此查看解决办法
- 如果还有疑问,也可查看这个博客:点此查看解决办法2
- 相信有的小伙伴可能对上面博客中的
内网IP
和公网IP
有些疑问,相信这篇博客可以解决你的疑问:查看公网IP和内网IP的方法- 总之,这是一个相当棘手的问题,希望你们遇不到这个Bug。即使遇到了,使用上面这些方法应该是可以很快解决的。
-
(6) 查看是否启动成功
经过上述一系列猛如虎的操作,我们的集群就算搭建成功了,在本机浏览器输入http://hadoop100:9870/
,在弹出的页面,点击Datanodes
,可以看到如下页面表示搭建成功:
-
(7) 思考:每次都一个一个节点启动,如果节点数增加到1000个怎么办?
早上来了开始一个一个节点启动,到晚上下班刚好完成,下班?
4.7 SSH无密登录配置
4.7.1 配置ssh
- (1) 基本语法
[xqzhao@hadoop100 opt]$ ssh 另一台电脑的ip地址
- (2) ssh连接时出现
Host key verification failed
的解决方法
[xqzhao@hadoop102 opt] $ ssh 192.168.91.101
The authenticity of host '192.168.91.101 (192.168.91.101)' 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)?
Host key verification failed.
- (3) 解决方案如下:直接输入
yes
4.7.2 无密钥配置
- (1) 生成公钥和私钥:
[xqzhao@hadoop100 /]$ cd ~/.ssh
[xqzhao@hadoop100 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)
、id_rsa.pub(公钥)
- (2) 将公钥拷贝到要免密登录的目标机器上
[xqzhao@hadoop100 .ssh]$ ssh-copy-id hadoop100
[xqzhao@hadoop100 .ssh]$ ssh-copy-id hadoop101
[xqzhao@hadoop100 .ssh]$ ssh-copy-id hadoop102
执行成功效果如下图所示:
注意:还需要在hadoop101、hadoop102上采用xqzhao账号,配置一下无密登录到hadoop100、hadoop101、hadoop102
注:在命令行输入
exit
可以退出远程登录。
4.7.3 .ssh文件夹下(~/.ssh)的文件功能解释
表2-4
known_hosts | 记录ssh访问过计算机的公钥(public key) |
---|---|
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过得无密登录服务器公钥 |
4.8 群起集群
4.8.1 配置workers
注:
在Hadoop2.X
中,没有workers
文件,取而代之的是slaves
。
[xqzhao@hadoop100 hadoop]$ cd /opt/module/hadoop-3.2.1/etc/hadoop
[xqzhao@hadoop100 hadoop]$ vim workers
在该文件中增加如下内容:
hadoop100
hadoop101
hadoop102
# 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件(暂时不清楚是否需要执行这一步):
[xqzhao@hadoop102 hadoop]$ xsync workers
4.8.2 启动集群
- (1) 如果集群是第一次启动,需要格式化
NameNode
。(格式化
)
[xqzhao@hadoop100 hadoop-3.2.1]$ hdfs namenode -format
注意
:格式化之前,一定要先停止
上次启动的所有namenode
和datanode
进程,然后再删除集群中每台虚拟机上的data
和logs
目录。否则会出现异常情况。
- (2) 启动
HDFS
[xqzhao@hadoop100 hadoop-3.2.1]$ sbin/start-dfs.sh
[xqzhao@hadoop100 hadoop-3.2.1]$ jps
4166 NameNode
4482 Jps
4263 DataNode
[xqzhao@hadoop101 hadoop-3.2.1]$ jps
3218 DataNode
3288 Jps
[xqzhao@hadoop102 hadoop-3.2.1]$ jps
3221 DataNode
3283 SecondaryNameNode
3364 Jps
- (3) 在配置了
ResourceManger
的节点(Hadoop101
)启动YARN
[xqzhao@hadoop101 hadoop-3.2.1]$ sbin/start-yarn.sh
注意:NameNode
和ResourceManger
如果不是同一台机器,不能在NameNode
上启动 YARN,应该在ResouceManager
所在的机器上启动YARN。
- (4) Web端查看 SecondaryNameNode
- 浏览器中输入:http://hadoop102:9868/status.html
- 查看
SecondaryNameNode
信息,如下图所示。
- (5) 在
Hadoop102
上启动历史服务器
[xqzhao@hadoop102 hadoop-3.2.1]$ sbin/mr-jobhistory-daemon.sh start historyserver
注
: 启动历史服务器之前,需要先进行相应的配置, 详情请见: Hadoop运行模式 中第 3.3小节
。
4.8.3 集群基本测试
- (1) 上传文件到集群
上传小文件
[xqzhao@hadoop100 hadoop-3.2.1]$ hdfs dfs -mkdir -p /wcinput
[xqzhao@hadoop100 hadoop-3.2.1]$ hdfs dfs -put wcinput/wc.input /wcinput
上传大文件
[xqzhao@hadoop100 hadoop-3.2.1]$ bin/hadoop fs -put /opt/software/hadoop-3.2.1.tar.gz /wcinput
- (2) 上传文件后查看文件存放在什么位置
(a)查看HDFS文件存储路径
[xqzhao@hadoop100 subdir0]$ pwd
/opt/module/hadoop-3.2.1/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
(b)查看HDFS在磁盘存储文件内容
[xqzhao@hadoop100 subdir0]$ cat blk_1073741825
hadoop yarn
hadoop mapreduce
xqzhao
xqzhao
- (3) 拼接
-rw-rw-r--. 1 xqzhao xqzhao 134217728 5月 23 16:01 blk_1073741836
-rw-rw-r--. 1 xqzhao xqzhao 1048583 5月 23 16:01 blk_1073741836_1012.meta
-rw-rw-r--. 1 xqzhao xqzhao 63439959 5月 23 16:01 blk_1073741837
-rw-rw-r--. 1 xqzhao xqzhao 495635 5月 23 16:01 blk_1073741837_1013.meta
[xqzhao@hadoop100 subdir0]$ cat blk_1073741836>>tmp.file
[xqzhao@hadoop100 subdir0]$ cat blk_1073741837>>tmp.file
[xqzhao@hadoop100 subdir0]$ tar -zxvf tmp.file
- (4) 下载
[xqzhao@hadoop100 hadoop-3.2.1]$ bin/hadoop fs -get /user/xqzhao/input/hadoop-3.2.1.tar.gz ./
4.9 集群启动/停止方式总结
4.9.1 各个服务组件逐一启动/停止
- (1) 分别启动/停止HDFS组件
[xqzhao@hadoop100 /]$ hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
- (2) 启动/停止YARN
[xqzhao@hadoop100 /] yarn-daemon.sh start / stop resourcemanager / nodemanager
4.9.2 各个模块整体启动/停止(配置ssh是前提)常用
- (1) 整体启动/停止HDFS
start-dfs.sh / stop-dfs.sh
- (2) 整体启动/停止YARN
start-yarn.sh / stop-yarn.sh
4.10 集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
时间服务器配置(必须root用户)步骤:
4.10.1 检查ntp是否安装
[root@hadoop100 /]$ rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
4.10.2 修改 /etc/ntp.conf 配置文件
[root@hadoop100 /]$ vim /etc/ntp.conf
修改内容如下
- (1) 修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
(把前面的注释符’#'去掉了)
- (2) 修改2(集群在局域网中,不使用其他互联网上的时间)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst 为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
(在每一行之前添加了注释符’#’)
- (3) 添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
4.10.3 修改 /etc/sysconfig/ntpd 文件
[root@hadoop100 /]$ vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
4.10.4 重新启动ntpd服务
[root@hadoop100 /]$ service ntpd status
service ntpd status
[root@hadoop100 /]$ service ntpd start
Starting ntpd: [ OK ]
4.10.5 设置ntpd服务开机启动
[root@hadoop100 /]$ chkconfig ntpd on
4.11 其他机器配置(必须root用户)
- (1) 在其他机器配置10分钟与时间服务器同步一次
[root@hadoop101 /]$ crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop100
- (2) 修改任意机器时间
[root@hadoop101 /]$ date -s "2017-9-11 11:11:11"
- (3) 十分钟后查看机器是否与时间服务器同步
[root@hadoop101 /]$ date
说明:测试的时候可以将10分钟调整为1分钟,节省时间。
声明:本文是学习时记录的笔记,如有侵权请告知删除!
原视频地址:https://www.bilibili.com/video/BV1Me411W7PV