Apache Hadoop的集群搭建(入门级)
建议3台虚拟机,虚拟机是centos7版本,使用完全分布式运行模式。
hadoop下载地址:https://archive.apache.org/dist/hadoop/common/
hadoop的伪分布式和本地运行模式:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
jdk下载:https://repo.huaweicloud.com/java/jdk/
1.虚拟机准备
提示:在你准备虚拟机环境时,有几点你是需要理解的。第一,虚拟机之间需要互相ping通,那么你的网卡和防火墙要配置。集群节点之间互相关闭防火墙,节点组成的集群开启防火墙(防御组)。
1.1、关闭防火墙:
每一个节点都需要。
- 第一种方式:
//服务关闭 service iptables stop //关闭开机自启 chkconfig iptables off //检查防火墙是否关闭 service iptables status chkconfig --list iptables
- 第二种方式:
systemctl stop firewalld systemctl disable firewalld systemctl status firewalld
1.2、创建一般用户(可选):
使用一般用户来搭建集群,碰到问题会很多,可以帮助你快速成长。这里的创建software和module文件夹是必要的。
//创建一个一般用户rong
useradd rong
//设置密码
password rong
//在/opt目录下创建software和module文件夹,这两个文件夹是用来放后面的软件和其解压包的。这一步是必要的!
mkdir /opt/software /opt/module
//更改文件夹权限
chown rong:rong /opt/software /opt/module
//将用户添加到sudoers管理中,使该用户具有root权限
vi /etc/sudoers
rong ALL=(ALL) NOPASSWD:ALL
:wq! 强制保存下。
1.3、修改Hosts:
每一个节点都需要,集群的节点之间标注位置信息,互相通信。
vim /etc/hosts
//文件后追加
节点1的ip 节点1名字
节点2的ip 节点2名字
节点3的ip 节点3名字
1.4、修改静态IP:
静态IP的作用就是之前的配置在当IP自动分配时,在每一次重启时,会影响之前的配置信息。每一个节点都需要,要和之前的Hosts里面的信息对上。这里面的网卡信息要注意!
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:F5:1D:6A
TYPE=Ethernet
UUID=8f49ebc2-5b1b-4135-863b-6acb0c84453f
ONBOOT=yes
BOOTPROTO=static #设置为静态
IPADDR=192.168.xxx.xxx #修改ip和之前设置的节点ip对上
PREFIX=24
NETMASK=255.255.255.0 #掩码
GATEWAY=192.168.xxx.x #网关
DNS1=192.168.xxx.x #配置网关连接外网
NAME=eth0
//使配置文件生效
source /etc/sysconfig/network-scripts/ifcfg-eth0
//重启
service network restart
1.5、修改主机名:
每一个节点都需要,和之前的Hosts中的节点信息对上。
vi /etc/sysconfig/network
//修改HOSTNAME字段
HOSTNAME=节点名和之前对上
2、安装JDK
当然是每个节点都需要配置的,因为hadoop的执行需要java的编译。
2.1、卸载现有JDK/OpenJDK:
//查询自带的jdk版本,没有jdk也没关系
java -version
//查询自带的jdk版本号
rpm -qa | grep jdk
//卸载open jdk
yum -y remove $(rpm -qa | grep jdk)
//或者使用sudo来卸载
sudo rpm -e jdk软件包
//再次查询jdk的版本号
java -version
//查询JDK安装路径
which java
2.2、安装JDK:
将jdk的安装包放入到指定文件夹下,可以使用Xftp软件。之前要创建software和moudle文件夹,你可以把安装包和解压包放到这两个文件夹下。
//将压缩包解压到/opt/moudle目录下xzvf也有其特殊的意义,欢迎百度
tar xzvf jdk-8u144-linux-x64.tar.gz -C /opt/moudle
2.3、配置JDK环境:
//配置java的环境变量,将配置信息添加到profile文件中
vi /etc/profile
//在文件末尾添加jdk的路径
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
//让配置信息生效
source /etc/profile
//再次查询java版本号,查看配置是否成功
java -version
3、安装Hadoop
和jdk安装同理,要将事先下载好的Hadoop压缩包放入到/opt/software文件夹下,之后再解压到moudle文件夹下。
3.1、安装Hadoop:
//解压hadoop压缩文件到moudle文件夹下
tar -zxvf hadoop-2.9.2.tar.gz -C /opt/module/
3.2、配置Hadoop环境:
//在hadoop的解压文件夹下可以获取Hadoop安装路径
pwd
//配置hadoop的环境变量,将配置信息添加到profile文件中
vi /etc/profile
//在profile文件末尾添加hadoop路径,bin是可执行文件,sbin是可执行脚本
export HADOOP_HOME=/opt/module/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
//让配置信息生效
source /etc/profile
//查看是否安装成功
hadoop version
总结:到此为止,三个节点上的java和hadoop算是全部安装完成了!
4、配置集群并测试单点启动
scp命令可在不同的主机之间实现文件的快速传输。有3个节点,那么我们就选择一个作为主节点(master),剩下的作为从节点(slave)。所以每个节点上都要配置好第1、2、3节的信息,jdk和Hadoop的安装包全部解压配置安装好。可以尝试使用scp进行快速传输,rsync命令也用于拷贝,但是性质却不一样,建议百度!当然,你可以写个脚本快速执行以上步骤。拷贝文件时,还有一点需要注意,那就是/etc/profile文件别忘记拷贝和之后需要source一下该文件(使之生效)。
4.1、三个节点的规划:
1、穷人版:
2、富人版:
有一个疑问:每一个节点是不是在安装hadoop时就会有了DN和NM?
4.2、配置集群:
我们使用穷人版的集群架构,所以3个节点都有DN和NM,节点1有NN,节点2有RM,节点3有2NN。
另外,在/opt/module/hadoop-2.9.2/etc/hadoop目录下有7个文件需要配置,分别是core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,hadoop-env.sh,mapred-env.sh,yarn-env.sh。其中hadoop-env.sh,mapred-env.sh,yarn-env.sh这三个主要是配置下JAVA_HOME。注意,这些文件你在一个节点上做了修改之后,记得分发给其他的节点。
1.核心配置文件core-site.xml:
在/opt/module/hadoop-2.9.2/etc/hadoop目录下。
vi core-site.xml
//在该文件中编写如下配置
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.9.2/data/tmp</value>
</property>
2.HDFS配置文件hadoop-env.sh和hdfs-site.xml:
//配置hadoop-env.sh
vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
//配置hdfs-site.xml
vi hdfs-site.xml
//在该文件中编写如下配置
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点2NN主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave2:50090</value>
</property>
3.YARN配置文件yarn-env.sh和yarn-site.xml:
//配置yarn-env.sh
vi yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
//配置yarn-site.xml
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>slave1</value>
</property>
4.MapReduce配置文件mapred-env.sh和mapred-site.xml:
//配置mapred-env.sh
vi mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
//配置mapred-site.xml
vi mapred-site.xml
//在该文件中增加如下配置
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
**总结:**以上的配置信息,每一个节点上都要有。所以在一台节点上配置完成之后,分发到其他节点就可以了。
4.3、集群单点启动:
每一个节点都启动了datanode,会有DM服务的。
- 在master节点:
hdfs namenode -format #注意一定要在配置了namenode的机器上格式化
hadoop-daemon.sh start namenode #启动namenode
hadoop-daemon.sh start datanode #启动datanode
- 在slave1节点:
hadoop-daemon.sh start datanode #启动datanode
- 在slave2节点:
hadoop-daemon.sh start datanode #启动datanode
hadoop-daemon.sh start secondarynamenode #启动2NN
- 在3个节点上依次执行
jps
5、配置SSH无密码登录
主要作用是为了群起集群,配置好了ssh协议就可以使用hadoop自带的群起脚本。群起脚本之前需要配置好位于/opt/moudle/hadoop-2.9.2/etc/hadoop文件夹下slave文件,这里面记录了hadoop集群的所有主机,之后要将这个文件分发给每一台主机。
ssh-keygen -t rsa #生成私钥和公钥,一个私钥对应一个公钥。
ssh-copy-id 节点名 #发送公钥到指定的节点
5.1、需要发送的秘钥图:
节点之间使用公钥和私钥进行比对来判断,所以3个节点之间需要进行9次公钥交换,这是最安全的一种SSH无密码配置。密钥实现无密码登录的原理就是,生成的公钥和私钥时一一对应的,将公钥发个远端,本地使用私钥来进行匹配,匹配成功即为登录成功。
5.2、SSH无密码配置解决方法1:
- 这种方法是最安全的,在每一个节点上生成公钥和私钥
ssh-keygen -t rsa
,之后再将每个公钥发送给每一个节点(包括自己)ssh-copy-id 节点名
。
5.3、SSH无密码配置解决方法2:
- 这种方法不推荐,主要是将一个节点上生成的公钥和私钥通过rsync命令分发给每个节点,那么每个节点上拥有的就是相同的公钥和私钥,所以可以实现节点之间的无密码登录。这有一个最严重的问题,就是节点之间传输公钥和私钥时会出现泄漏问题,不安全。
6、群起集群
群起脚本之前需要配置好位于/opt/moudle/hadoop-2.9.2/etc/hadoop文件夹下slave文件,这里面记录了hadoop集群的所有主机,之后要将这个文件分发给每一台主机。
vi /opt/moudle/hadoop-2.9.2/etc/hadoop/slave
删除localhost
master
slave1
slave2
6.1、群起HDFS脚本:
因为之前我们使用穷人版的集群架构,每一个节点上都应有DN和NM服务,所以需要在一个节点上启动一次就可以了。
start-dfs.sh
6.2、YARN启动:
因为YARN我们主要配置在了slave1节点上,因为我们将ResourceManager配置在了slave1上,所以这个只需要在slave1节点上启动。
start-yarn.sh
6.3、测试:
-
群起脚本成功之后,就可以使用
jps
命令查看是不是每个节点都应有下面图中的配置。 -
启动HDFS和YARN之后并运行MapReduce程序查看集群是否启动成功。
7、历史服务器和日志聚集
配置Yarn历史服务器和日志聚集功能。配置历史服务器主要是查看程序的历史运行情况。日志聚集主要是查看程序运行详情。那么我们在一台节点上配置好这些之后,一定要记得分发给其他节点,让其他节点同步。配置历史服务器之前要将hdfs和yarn关闭。
7.1、停止集群节点服务:
- 各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
(2)启动/停止YARN
yarn-daemon.sh start / stop resourcemanager / nodemanager
- 各个模块分开启动/停止(配置ssh是前提)常用
(1)整体启动/停止HDFS
start-dfs.sh / stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh / stop-yarn.sh
7.2、配置历史服务器:
- 配置mapred-site.xml
该文件位于这个/opt/moudle/hadoop-2.9.2/etc/hadoop文件夹下
vi mapred-site.xml
//在该文件里面增加如下配置
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>slave2:10020</value> #选择节点2作为历史服务器
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>slave2:19888</value>
</property>
7.3、配置日志聚集:
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
- 配置yarn-site.xml
同理,这个文件位于/opt/moudle/hadoop-2.9.2/etc/hadoop文件夹下
vi yarn-site.xml
//在该文件里面增加如下配置。
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value> #7天的秒数
</property>
- 总结:配置完历史服务器和日志聚集,一定要记得同步到其他节点。
7.4、测试配置:
- 关闭NodeManager 、ResourceManager和HistoryManager
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
sbin/mr-jobhistory-daemon.sh stop historyserver
- 启动NodeManager 、ResourceManager和HistoryManager
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/mr-jobhistory-daemon.sh start historyserver
- 说明:如果你配置好ssh了,那么上面的两步你可以尝试使用以下的步骤,因为我们要保证在配置历史服务器之前将hdfs和yarn关闭的,配置好之后,我们要将他们呢个重开。在master节点上开启dfs的脚本
start-dfs.sh
,在slave1上开启yarn的脚本start-yarn.sh
,在slave2上开启历史服务mr-jobhistory-daemon.sh start historyserver
。因为我们之前将slave2节点作为历史服务器节点。
- 删除HDFS上已经存在的输出文件
bin/hdfs dfs -rm -R /user/root/output
- 执行WordCount程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/root/input /user/root/output
- 查看日志
- 我们是将slave2作为历史服务器的。
客户端http://slave2:19888/jobhistory
8、集群时间同步
集群时间同步的作用就是让集群的节点之间的时间取得一直。选择一个节点作为时间同步服务器。hbase对时间的同步要求是很高的。
8.1、时间服务器配置(必须root用户)
那我们选择将master作为一个ntp服务器。
- 检查ntp是否安装
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
- 检查ntpd状态,并关闭
service ntpd status #正在运行的状态必须关闭
service ntpd stop #将三台服务全部停掉
chkconfing ntpd off
chkconfing --list ntpd #查看是否关闭
- 修改ntp配置文件
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(集群在局域网中,不使用其他互联网上的时间)
//将下面4行注释掉 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(当该master节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0 fudge 127.127.1.0 stratum 10
4. 修改/etc/sysconfig/ntpd文件
vi /etc/sysconfig/ntpd
//增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
- 重新启动ntpd服务
service ntpd status
ntpd 已停
service ntpd start
正在启动 ntpd: [确定]
- 设置ntpd服务开机启动
chkconfig ntpd on
8.2、其他机器配置(必须root用户)
在另外的slave1和slave2节点上配置。
- 在其他机器配置1分钟与时间服务器同步一次
crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate master
- 修改任意机器时间
date -s "2020-9-11 11:11:11"
- 一分钟后查看机器是否与时间服务器同步
date