聊城做手机网站推广/郑州百度推广托管
一、hadoop完全分布式运行模式介绍
Hadoop的守护进程运行在由多台主机搭建的集群上,是真正的生产环境,只有分布式多台服务器运行,才满足大数据算力的要求。
在所有的主机上安装JDK和Hadoop,配置SSH组成相互连通的网络,集群之间才可以网络通信,实现分布式计算。
二、hadoop完全分布式运行环境搭建
这里用vmare虚拟三台centos的虚拟机进行完全分布式运行环境的搭建。
2.1 在一台机器上配置好环境
按照我的另一篇文章,“Hadoop环境搭建之本地运行模式”,将一台机器上的环境搭建好,执行以下步骤即可:
1、创建虚拟机
2、将虚拟机ip修改为静态ip
ip修改为:192.168.1.151
3、修改主机名
主机名称修改为:hadoop151
4、配置主机名与ip映射
这里注意要配置三个:
192.168.1.151 hadoop151
192.168.1.152 hadoop152
192.168.1.153 hadoop153
直接在文件的后面加上就好,克隆的其他虚拟机则不需要配置主机名与ip映射,直接ping主机名就可以实现网络通畅。
5、关闭防火墙
6、创建test用户
7、使test用户拥有sudo权限
8、在/opt目录下创建文件夹
9、安装jdk
10、安装hadoop
软件包链接也在文章中,文章链接如下:
https://blog.csdn.net/a1786742005/article/details/104078490
2.2 克隆两台虚拟机并修改配置
1、克隆第一台虚拟机
(1) 使用vmare克隆
(2) 点击下一步
(3) 选择虚拟机当前状态
(4) 创建完整克隆
(5) 修改虚拟机名称,并指定存储位置
(6) 克隆完成
2、修改克隆的第一台虚拟机的静态ip
将ip修改为192.168.1.152
(1) 修改网卡
[test@hadoop151 /]sudo vim /etc/udev/rules.d/70-persistent-net.rules
进入如下页面,删除eth0那一段;将eth1修改为eth0,同时复制物理ip地址。
(2) 修改ip
[test@hadoop151 /]sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0
修改前:
修改后:
(3) 重启一下虚拟机
[test@hadoop151 /]reboot
(4) 再查看一下ip
发现ip已经修改
(5) ping一下第一台虚拟机
发现网络通畅
3、修改克隆的第一台虚拟机的主机名
将主机名修改为:hadoop152
(1) 修改主机名
[test@hadoop151 /]sudo vim /etc/sysconfig/network
(2) 重启一下虚拟机
[test@hadoop151 /]reboot
(3) 查看主机名
主机名已修改
4、修改克隆的第二台虚拟机的ip、主机名
配置操作与上面操作相同,只需要把ip改为192.168.1.153,主机名改为hadoop153。
2.3 配置三台机器之间的ssh无密码登录
1、免密登录原理
2、在hadoop151上配置test用户的ssh无密登录
(1) 生成公钥和私钥
A、先到用户根目录
[test@hadoop151 桌面]$ cd ~
B、进入.ssh文件夹
[test@hadoop151 ~]$ cd .ssh
C、生成公钥和私钥
[test@hadoop151 .ssh]$ ssh-keygen -t rsa
然后敲三个回车,就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(2) 将公钥拷贝到要免密登录的目标机器上
[test@hadoop151 .ssh]$ ssh-copy-id hadoop151
[test@hadoop151 .ssh]$ ssh-copy-id hadoop152
[test@hadoop151 .ssh]$ ssh-copy-id hadoop153
这里注意自己这台机器也要配置ssh无密登录。执行后命令后,先输入yes,再填写密码,就配置成功了。
(3) .ssh文件夹下(~/.ssh)的文件功能解释
文件名称 | 文件作用 |
---|---|
known_hosts | 记录ssh访问过的计算机的公钥 |
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过的无密登录服务器公钥 |
3、在hadoop152和hadoop153上进行同样的配置
2.4 集群部署规划
现在已经保证了三台虚拟机之间的网络通畅以及基本的软件安装,可以开始部署hadoop集群。
NameNode、ResourceManager 以及 SecondaryNameNode都会占用很大内存,分配在三台机器上
ip地址 | 主机名称 | HDFS | YARN |
---|---|---|---|
192.168.1.151 | hadoop151 | NameNode、DataNode | NodeManager |
192.168.1.152 | hadoop152 | DataNode | ResourceManager、NodeManager |
192.168.1.153 | hadoop153 | SecondaryNameNode、DataNode | NodeManager |
2.5 编写集群分发脚本
1、rsync远程同步工具
(1) rsync远程同步工具介绍
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(2) 基本语法
rsync -rvl $pdir/$fname user@hadoopuser@hadoopuser@hadoophost:pdir/pdir/pdir/fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
(3) 参数说明
参数名称 | 参数功能 |
---|---|
-r | 递归 |
-v | 显示复制过程 |
-l | 拷贝符号连接 |
2、编写xsync集群分发脚本
(1) 脚本说明
循环复制文件到所有节点的相同目录下
(2) 编写脚本
在/home/test/bin这个目录下存放的脚本,test用户可以在系统任何地方直接执行。
A、在hadoop151的/home/test目录下创建bin目录,并在bin目录下xsync创建文件
[test@hadoop151 ~]$ cd /home/test
[test@hadoop151 ~]$ mkdir bin
[test@hadoop151 ~]$ cd bin
[test@hadoop151 ~]$ touch xsync
B、编写shell脚本
内容如下:
#!/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=151; host<154; host++)); doecho ------------------- hadoop$host --------------rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
C、修改脚本具有执行权限
[test@hadoop151 bin]$ chmod 777 xsync
(3) 测试脚本
将hadoop151上的/opt/software目录进行分发,查看脚本运行情况
2.6 配置hadoop集群
1、在hadoop151上修改核心配置文件
配置core-site.xml
[test@hadoop151 hadoop]$ vi core-site.xml
在该文件中编写如下配置:
<!-- 指定HDFS中NameNode的地址 -->
<property><name>fs.defaultFS</name><value>hdfs://hadoop151:9000</value>
</property><!-- 指定Hadoop运行时产生文件的存储目录 -->
<property><name>hadoop.tmp.dir</name><value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
2、在hadoop151上配置HDFS
(1) 配置hadoop-env.sh
[test@hadoop151 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(2) 配置hdfs-site.xml
[test@hadoop151 hadoop]$ vi hdfs-site.xml
在该文件中编写如下配置:
<!-- 指定副本数 -->
<property><name>dfs.replication</name><value>3</value>
</property><!-- 指定Hadoop辅助名称节点主机配置 -->
<property><name>dfs.namenode.secondary.http-address</name><value>hadoop153:50090</value>
</property>
3、在hadoop151上配置YARN
(1) 配置yarn-env.sh
[test@hadoop151 hadoop]$ vi yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(2) 配置yarn-site.xml
[test@hadoop151 hadoop]$ vi yarn-site.xml
在该文件中增加如下配置:
<!-- Reducer获取数据的方式 -->
<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value>
</property><!-- 指定YARN的ResourceManager的地址 -->
<property><name>yarn.resourcemanager.hostname</name><value>hadoop152</value>
</property>
4、在hadoop151上配置MapReduce
(1) 配置mapred-env.sh
[test@hadoop151 hadoop]$ vi mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(2) 配置mapred-site.xml
[test@hadoop151 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[test@hadoop151 hadoop]$ vi mapred-site.xml
在该文件中增加如下配置:
<!-- 指定MR运行在Yarn上 -->
<property><name>mapreduce.framework.name</name><value>yarn</value>
</property>
5、在hadoop151上配置datanode节点
文件路径为:/opt/module/hadoop-2.7.2/etc/hadoop/slaves
[test@hadoop151 hadoop]$ vi slaves
在该文件中增加如下内容:
hadoop151
hadoop152
hadoop153
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
6、使用xsync脚本分发到其他机器上
[test@hadoop151 hadoop]$ xsync /opt/module/hadoop-2.7.2/
2.7 启动集群
1、集群启动/停止方式总结
(1) 分别启动/停止HDFS组件
A、 分别启动/停止HDFS组件
hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
B、启动/停止YARN
yarn-daemon.sh start / stop resourcemanager / nodemanager
(2) 各个模块分开启动/停止(配置ssh是前提)
A、整体启动/停止HDFS
start-dfs.sh / stop-dfs.sh
B、整体启动/停止YARN
start-yarn.sh / stop-yarn.sh
2、启动集群
这里以最常用的群起集群的方式来介绍,单点启动的方式可以自己测试。
(1) 如果集群是第一次启动,需要格式化NameNode
注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据!!!
[test@hadoop151 hadoop-2.7.2]$ bin/hdfs namenode -format
(2) 启动HDFS
[test@hadoop151 hadoop-2.7.2]$ sbin/start-dfs.sh
hadoop151上:
hadoop152上:
hadoop153上:
(3) 启动YARN
[test@hadoop152 hadoop-2.7.2]$ sbin/start-yarn.sh
hadoop151上:
hadoop152上:
hadoop153上:
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
(4) Web端查看SecondaryNameNode
hdfs文件系统及yarn的web端查看在我的另一篇文章里,hadoop环境搭建之伪分布式运行模式,大家可以自行查看,这里查看一下SecondaryNameNode:
A、浏览器中输入:http://192.168.1.153:50090/status.html
B、查看SecondaryNameNode信息
另一篇文章的链接为:https://blog.csdn.net/a1786742005/article/details/104090921
2.8 测试集群
1、hdfs上传文件
(1) 执行上传文件命令
[test@hadoop151 ~]$ hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz /
(2) 从web端查看hdfs文件系统
访问链接:http://192.168.1.151:50070/explorer.html
2、执行WordCount程序
(1) 在本地创建一个input文件夹
(2) 进入文件夹创建一个word.txt文件
(3) 编辑word.txt文件
(4) 将input文件夹上传到 hdfs 的 / 目录上面
[test@hadoop151 hadoop-2.7.2]$ hdfs dfs -put input/ /
(5) 运行wordcount程序
[test@hadoop151 hadoop-2.7.2]$ cd /opt/module/hadoop-2.7.2
[test@hadoop151 hadoop-2.7.2]$ bin/hadoop jarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output
(6) 查看结果
2.9 集群时间同步
1、为何要集群时间同步?
因为Hadoop 对集群中各个机器的时间同步要求比较高, 要求各个机器的系统时间不能相差太多, 不然会造成很多问题。比如,最常见的连接超时问题。所以需要配置集群中各个机器和互联网的时间服务器进行时间同步, 但是在实际生产环境中, 集群中大部分服务器是不能连接外网的, 这时候可以在内网搭建一个自己的时间服务器( NTP 服务器),然后让集群的各个机器与这个时间服务器定时的进行时间同步。
2、时间服务器配置(必须为root用户)
将时间服务器配置在hadoop151上,配置步骤如下:
(1) 检查ntp是否安装
[root@hadoop151 hadoop-2.7.2]# rpm -qa|grep ntp
(2) 修改ntp配置文件
[root@hadoop151 hadoop-2.7.2]# vi /etc/ntp.conf
修改内容如下:
A、修改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
B、修改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
C、添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3) 修改/etc/sysconfig/ntpd 文件
[root@hadoop151 hadoop-2.7.2]# vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4) 重新启动ntpd服务
[root@hadoop151 hadoop-2.7.2]# service ntpd status
[root@hadoop151 hadoop-2.7.2]# service ntpd start
(5) 设置ntpd服务开机启动
[root@hadoop151 hadoop-2.7.2]# chkconfig ntpd on
3、其他机器配置(必须root用户)
这里以hadoop152来举例,hadoop153也要进行相同配置
(1) 在其他机器配置10分钟与时间服务器同步一次
[root@hadoop152 test]# crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop151
(2) 修改任意机器时间
[root@hadoop152 test]# date -s "2018-8-11 10:22:10"
(3) 十分钟后查看机器是否与时间服务器同步
[root@hadoop152 test]# date
说明:测试的时候可以将10分钟调整为1分钟,节省时间。