Hadoop3.1.3集群搭建
1. Hadoop简介
Hadoop是一个用于解决海量数据存储和计算的分布式系统架构,其核心组件为分布式文件系统Hadoop Distributed File System (HDFS)、资源调度Yet Another Resource Negotiator (YARN)以及计算架构MapReduce。笔者作为大数据初学者是首次接触Hadoop,也是首次写博客,一方面是为了分享学习心得,另一方面记录自己的学习路线。如有错误或者不当的地方,还望不吝赐教。
2. 机器准备
要满足企业生产的集群需要大量的机器,但是如果仅仅作为入门者学习对机器并没有太大的要求,一般来说家用电脑即可满足集群的搭建要求。笔者搭建集群使用的是实验室闲置的服务器资源,没有资源的也可以到各大云平台购买服务器,一般按需计费的话三台机器一小时也就1-2元的价格。
2.1机器硬件配置
本文搭建的集群机器配置如下:
机器名称 | CPU | 内存 | 硬盘 |
---|---|---|---|
hadoop001 | 4 | 4G | 50G |
hadoop002 | 4 | 4G | 50G |
hadoop003 | 4 | 4G | 50G |
2.2 虚拟机安装
由于之前接触较多为centos系统,因此选择centos7.5作为上述机器的操作系统,安装的过程为图形化界面对新手比较友好,期间硬盘选择自动分区,安装方式最小安装即可
安装完一台机器之后其余选择直接克隆即可
2.3 网络设置
安装的虚拟机初始并没有配置网络,不能与外网连通,修改网络配置文件:
[root@localhost ~] vi /etc/sysconfig/network-scripts/ifcfg-ensXXX # XXX因人而异
进入编辑界面,修改下列信息
BOOTPROTO=static # dhcp更改为static
ONBOOT=yes # no改为yes
# 增加下列信息
IPADDR=192.168.1.X1 # X1为内网IP,注意多台机器的内网IP不能冲突
NETMASK=255.255.255.0
GATEWAY=192.168.1.1 # 路由器网关
DNS1=114.114.114.114
DNS2=8.8.8.8
保存退出,重启网络服务
[root@localhost ~] service network restart
重启成功之后测试时候能够ping通baidu,可以则IP配置完成,注意所有机器都要配置IP。在配置好IP之后需要关闭系统自带的防火墙,否则集群的机器之间无法通信
[root@localhost ~] systemctl stop firewalld
[root@localhost ~] systemctl disable firewalld
2.4 更改主机名称
分别更改三台机器的主机名
[root@localhost ~] vi /etc/hostname
hadoop001/hadoop002/hadoop003 # 分别对应三台机器
将IP地址与主机名称作映射
[root@localhost ~] vi /etc/hosts
# 在最下方新增
192.168.1.X1 hadoop001
192.168.1.X2 hadoop002
192.168.1.X3 hadoop003
修改windows系统的host,记事本打开本地C:\Windows\System32\drivers\etc\hosts,最下方添加上述hosts中加入的IP与主机名称的映射。注意该步骤不可省略,笔者在最初尝试搭建集群时感觉这一步并不重要所以略去,但是在集群搭建完成之后测试的时候,web界面不能预览HDFS所存储的文件,MapReduce也无法正常计算,仔细排查发现缺失这一步骤,补充后问题解决。
2.5 创建新用户
创建非root用户,之后的大部分操作都要基于该用户进行
[root@localhost ~] useradd hadoopuser # 添加hadoopuser用户
[root@localhost ~] passwd hadoopuser # 设置密码
赋予新建用户root权限
[root@localhost ~] vi /etc/sudoers
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
hadoopuser ALL=(ALL) ALL # 新增
3. 工具及脚本准备
3.1 上传jdk和hadoop安装包
在所有机器上新建目录用于放置java和hadoop的安装包
[root@localhost ~] mkdir /opt/software # java和hadoop的安装包目录
[root@localhost ~] mkdir /opt/module # java和hadoop的安装目录
修改上述两个目录的所有者为hadoopuser
[root@localhost ~] chown hadoopuser:hadoopuser /opt/module
[root@localhost ~] chown hadoopuser:hadoopuser /opt/software
使用xftp上传jdk和hadoop的安装包到hadoop001的机器上/opt/software目录中,再将安装包传输到hadoop002和hadoop003上
[root@localhost ~] su hadoopuser # 切换到hadoopuser用户
[hadoopuser@hadoop001 /] scp -r /opt/software/jdk-8u212-linux-x64.tar.gz hadoopuser@hadoop002:/opt/software/
[hadoopuser@hadoop001 /] scp -r /opt/software/jdk-8u212-linux-x64.tar.gz hadoopuser@hadoop003:/opt/software/
[hadoopuser@hadoop001 /] scp -r /opt/software/hadoop-3.1.3.tar.gz hadoopuser@hadoop002:/opt/software/
[hadoopuser@hadoop001 /] scp -r /opt/software/hadoop-3.1.3.tar.gz hadoopuser@hadoop003:/opt/software/
3.2 配置集群间ssh免密登录
[hadoopuser@hadoop001 /] cd home/hadoopuser/.ssh/
[hadoopuser@hadoop001 .ssh] ssh-keygen -t rsa # 产生密钥
[hadoopuser@hadoop001 .ssh] ssh-copy-id hadoop001 # 分发密钥
[hadoopuser@hadoop001 .ssh] ssh-copy-id hadoop002 # 分发密钥
[hadoopuser@hadoop001 .ssh] ssh-copy-id hadoop003 # 分发密钥
上述操作分别在hadoop002和hadoop003上的userhadoop用户重复,确保任意一台机器都可以免密访问其余的机器,此外还需设置hadoop001上的root用户也可免密访问
[hadoopuser@hadoop001 .ssh] exit
[root@hadoop001 /] cd root/.ssh/
[root@localhost .ssh] ssh-keygen -t rsa
[root@localhost .ssh] ssh-copy-id hadoop001
[root@localhost .ssh] ssh-copy-id hadoop002
[root@localhost .ssh] ssh-copy-id hadoop003
4. jdk和hadoop安装(三台机器均需完成)
4.1 解压jdk和hadoop安装包
分别将/opt/software中的java和hadoop安装包解压至/opt/module内
[hadoopuser@hadoop001 /] tar -xzvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module/
[hadoopuser@hadoop001 /] tar -xzvf /opt/software/hadoop-3.1.3.tar.gz -C /opt/module/
4.2 配置java和hadoop的环境变量
编辑环境变量
[hadoopuser@hadoop001 /] sudo vi /etc/profile.d/my_env.sh
# 加入下列信息
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
激活环境变量
[hadoopuser@hadoop001 /] source /etc/profile.d/my_env.sh
查看版本确认java和hadoop安装成功
[hadoopuser@hadoop001 /] java -version
[hadoopuser@hadoop001 /] hadoop version
5. 配置hadoop集群
5.1 集群部署规划
Hadoop的核心组件HDFS和YARN均需要一台服务器分别作为NameNode和ResourceManager,此外HDFS也需要配置SecondaryNameNode,如果把这些服务全部放到同一台服务器上,会造成这台服务器的压力过大,因此一般将这三个服务分别部署在三个节点上,笔者的集群部署规划如下:
服务 | hadoop001 | hadoop002 | hadoop003 |
---|---|---|---|
HDFS | NameNode | / | SecondaryNameNode |
YARN | / | ResourceManager | / |
5.2 修改各组件对应的配置文件
修改Hadoop基础组件的配置
[hadoopuser@hadoop001 /] vi /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
# 在<configuration>之间加入如下参数
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop001:8020</value> # 配置NameNode的默认端口
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value> # 配置HDFS的默认存储路径
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoopuser</value> # 配置HDFS的web界面默认登录用户
</property>
修改HDFS组件的配置
[hadoopuser@hadoop001 /] vi /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
# 在<configuration>之间加入如下参数
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop001:9870</value> # NameNode的web访问地址
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop003:9868</value> # SecondaryNameNode的wen访问地址
</property>
修改YARN组件的配置
[hadoopuser@hadoop001 /] vi /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
# 在<configuration>之间加入如下参数
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value> # MapReduce的shuffle
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop002</value> # ResourceManager的
</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>
修改MapReduce组件的配置
[hadoopuser@hadoop001 /] vi /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
# 在<configuration>之间加入如下参数
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value> # 指定MapReduce运行在YARN上
</property>
配置workers
[hadoopuser@hadoop001 /] vi /opt/module/hadoop-3.1.3/etc/hadoop/workers
# 修改信息如下
hadoop001
hadoop002
hadoop003
5.3 启动集群并测试
首次启动集群需要初始化NameNode
[hadoopuser@hadoop001 /] hdfs namenode -format
在hadoop001上启动HDFS
[hadoopuser@hadoop001 /] start-dfs.sh
在hadoop002上启动YARN
[hadoopuser@hadoop002 /] start-yarn.sh
打开web界面HDFS的地址hadoop001:9870和YARN的web访问地址hadoop002:8088,出现界面则成功
使用hadoop的examples来测试集群是否能够正常的存储和计算,首先在/opt/module/hadoop-3.1.3下新建一个word.txt文件,随意输入一些字符并保存
[hadoopuser@hadoop001 /] vi /opt/module/hadoop-3.1.3/word.txt
# 随意输入一些字符
aaa bb
cc aaa
bb cc
aaa bbb
c
将该文件上载到HDFS中,在此之前可先创建一个目录来放置该文件
[hadoopuser@hadoop001 /] hadoop fs -mkdir input # 在HDFS中新建一个input的目录
[hadoopuser@hadoop001 /] hadoop fs -put /opt/module/hadoop-3.1.3/word.txt /input # 将word.txt上载到HDFS中
上载之后,可在HDFS的web界面查看到文件
调用hadoop的example,统计word.txt中的字符出现次数
[hadoopuser@hadoop001 /] hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
注意,这个地方的输出目录output在运行之前不能存在于HDFS的目录下,否则会抛出目录已存在的异常。运行之后可在web界面查看到output目录,打开之后有统计之后的结果
结果准确无误,集群搭建成功
6. 设置集群历史服务器和日志聚集
6.1 配置历史服务器
历史服务器可以查看程序的历史运行情况,便于查找bug。其配置与上述类似,只需要修改对应地配置文件,并启动服务即可。在配置之前,首先将HDFS和YARN的服务都停止,然后修改所有机器上的/opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml配置文件
[hadoopuser@hadoop002 /] stop-yarn.sh # hadoop002中停止YARN服务
[hadoopuser@hadoop001 /] stop-dfs.sh # hadoop001中停止HDFS服务
[hadoopuser@hadoop001 /] vi /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml # 修改mapred配置文件
# 在configuration之间添加下列参数
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop001:10020</value> # 历史服务器的地址为hadoop001
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop001:19888</value> # 历史服务器的web访问地址为hadoop001:19888
</property>
6.2 配置日志聚集
日志会记录集群运行时的详细情况,在出现故障时对溯源很有效,配置日志聚集的步骤与上述历史服务器的配置类似,只不过日志聚集并不是单独的服务,而是依赖于YARN,所以我们只需要在所有机器上都修改YARN的配置,打开其日志聚集功能即可
[hadoopuser@hadoop001 /] vi /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml # 修改YARN配置文件
# 在configuration之间新增下列参数
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value> # 开启日志聚集功能
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop001:19888/jobhistory/logs</value> # 设置日志聚集的地址
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value> # 设置日志保存的时效
</property>
以上配置完成之后,依次在hadoop001上启动HDFS和historyserver,在hadoop002上启动YARN
[hadoopuser@hadoop001 /] start-dfs.sh # hadoop001上启动HDFS
[hadoopuser@hadoop001 /] mapred --daemon start historyserve # hadoop001上启动历史服务器
[hadoopuser@hadoop002 /] start-yarn.sh # hadoop002上启动YARN
删除HDFS下的output目录,再次运行examples
[hadoopuser@hadoop001 /] hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
运行结束之后在YARN的web界面点击History,跳转到历史服务器的界面
点击logs,即可跳转到日志聚集的页面
至此,简单的集群配置完成!