史上最详细的 Hadoop 环境搭建(中篇)

4,107 阅读10分钟

本文来自作者:鸣宇淳  在 GitChat 上的精彩分享,由于篇幅长,故分为上、中、下三篇。

本以为分为两篇就能分享完,可是内容实在太多了,不得已才分为三篇不愧是「史上最详细」

昨日分享:史上最详细的 Hadoop 环境搭建(上篇)

第三部分:Hadoop 伪分布式模式安装

第六步 伪分布式 Hadoop 部署过程

十三、Hadoop 所用的用户设置

1. 创建一个名字为 hadoop 的普通用户

2. 给 hadoop 用户 sudo 权限

设置权限,学习环境可以将 hadoop 用户的权限设置的大一些,但是生产环境一定要注意普通用户的权限限制。

注意:如果root用户无权修改sudoers文件,先手动为root用户添加写权限。

3. 切换到hadoop用户

[root@bigdata-senior01 ~]# su - hadoop [hadoop@bigdata-senior01 ~]$

4. 创建存放hadoop文件的目录

5. 将hadoop文件夹的所有者指定为hadoop用户

如果存放hadoop的目录的所有者不是hadoop,之后hadoop运行中可能会有权限问题,那么就讲所有者改为hadoop。

十四、解压Hadoop目录文件

1. 复制 hadoop-2.5.0.tar.gz 到/opt/modules目录下。

2. 解压 hadoop-2.5.0.tar.gz

十五、配置 Hadoop

1. 配置 Hadoop 环境变量

追加配置:

执行:source /etc/profile 使得配置生效

验证 HADOOP_HOME 参数:

2. 配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh 文件的 JAVA_HOME参数

3. 配置 core-site.xml

[hadoop@bigdata-senior01 ~]$ sudo vim  ${HADOOP_HOME}/etc/hadoop/core-site.xml

(1) fs.defaultFS 参数配置的是HDFS的地址。

(2)    hadoop.tmp.dir 配置的是Hadoop临时目录,比如HDFS的NameNode数据默认都存放这个目录下,查看*-default.xml 等默认配置文件,就可以看到很多依赖${hadoop.tmp.dir} 的配置。

默认的hadoop.tmp.dir/tmp/hadoop-${user.name} ,此时有个问题就是 NameNode 会将 HDFS 的元数据存储在这个/tmp目录下,如果操作系统重启了,系统会清空 /tmp 目录下的东西,导致NameNode元数据丢失,是个非常严重的问题,所有我们应该修改这个路径。

  • 创建临时目录:

  • 将临时目录的所有者修改为 hadoop

  • 修改 hadoop.tmp.dir

十六、配置、格式化、启动 HDFS

1. 配置 hdfs-site.xml

dfs.replication 配置的是 HDFS存 储时的备份数量,因为这里是伪分布式环境只有一个节点,所以这里设置为1。

2. 格式化 HDFS

格式化是对 HDFS 这个分布式文件系统中的 DataNode 进行分块,统计所有分块后的初始元数据的存储在 NameNode 中。

格式化后,查看 core-site.xml 里 hadoop.tmp.dir(本例是 /opt/data 目录)指定的目录下是否有了 dfs 目录,如果有,说明格式化成功。

注意:

  1. 格式化时,这里注意 hadoop.tmp.dir 目录的权限问题,应该 hadoop 普通用户有读写权限才行,可以将 /opt/data 的所有者改为 hadoop。[hadoop@bigdata-senior01 hadoop-2.5.0]$ sudo chown -R hadoop:hadoop /opt/data

  2. 查看 NameNode 格式化后的目录。

fsimage 是 NameNode 元数据在内存满了后,持久化保存到的文件。

fsimage*.md5  是校验文件,用于校验 fsimage 的完整性。

seen_txid  是 hadoop 的版本

vession 文件里保存:

  • namespaceID:NameNode 的唯一 ID。

  • clusterID:集群 ID,NameNode 和 DataNode 的集群 ID 应该一致,表明是一个集群。

3. 启动 NameNode

4. 启动 DataNode

5. 启动 SecondaryNameNode

6. JPS 命令查看是否已经启动成功,有结果就是启动成功了。

7. HDFS 上测试创建目录、上传、下载文件

HDFS 上创建目录

上传本地文件到 HDFS 上

读取 HDFS 上的文件内容

从 HDFS上 下载文件到本地

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -get /demo1/core-site.xml

十七、配置、启动YARN

1. 配置mapred-site.xml

默认没有mapred-site.xml文件,但是有个mapred-site.xml.template配置模板文件。复制模板生成mapred-site.xml。

添加配置如下:

指定 mapreduce 运行在 yarn 框架上。

2. 配置 yarn-site.xml

添加配置如下:

  • yarn.nodemanager.aux-services 配置了 yarn 的默认混洗方式,选择为 mapreduce 的默认混洗算法。

  • yarn.resourcemanager.hostname 指定了 Resourcemanager 运行在哪个节点上。

3. 启动 Resourcemanager

4. 启动 nodemanager

5. 查看是否启动成功

可以看到 ResourceManager、NodeManager 已经启动成功了。

6. YARN 的 Web 页面

YARN 的 Web 客户端端口号是 8088,通过 http://192.168.100.10:8088/ 可以查看。

十八、运行 MapReduce Job

在 Hadoop 的 share 目录里,自带了一些 jar 包,里面带有一些 mapreduce 实例小例子,位置在 share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,可以运行这些例子体验刚搭建好的Hadoop平台,我们这里来运行最经典的 WordCount 实例。

1. 创建测试用的 Input 文件

创建输入目录:

创建原始文件:

在本地 /opt/data 目录创建一个文件 wc.input,内容如下。

将 wc.input 文件上传到 HDFS 的 /wordcountdemo/input 目录中:

2. 运行 WordCount MapReduce Job

3. 查看输出结果目录

  • output 目录中有两个文件,_SUCCESS 文件是空文件,有这个文件说明Job执行成功。

  • part-r-00000文件是结果文件,其中-r-说明这个文件是 Reduce 阶段产生的结果,mapreduce 程序执行时,可以没有 reduce 阶段,但是肯定会有 map 阶段,如果没有 reduce 阶段这个地方有是-m-。

  • 一个 reduce 会产生一个 part-r- 开头的文件。

  • 查看输出文件内容。

结果是按照键值排好序的。

十九、停止 Hadoop

二十、 Hadoop 各个功能模块的理解

1. HDFS模块

HDFS 负责大数据的存储,通过将大文件分块后进行分布式存储方式,突破了服务器硬盘大小的限制,解决了单台机器无法存储大文件的问题,HDFS 是个相对独立的模块,可以为 YARN 提供服务,也可以为 HBase 等其他模块提供服务。

2. YARN 模块

YARN 是一个通用的资源协同和任务调度框架,是为了解决 Hadoop1.x 中MapReduce 里 NameNode 负载太大和其他问题而创建的一个框架。

YARN 是个通用框架,不止可以运行 MapReduce,还可以运行Spark、Storm等其他计算框架。

3. MapReduce 模块

MapReduce 是一个计算框架,它给出了一种数据处理的方式,即通过 Map 阶段、Reduce阶段来分布式地流式处理数据。它只适用于大数据的离线处理,对实时性要求很高的应用不适用。

第七步 开启历史服务

二十一、历史服务介绍

Hadoop 开启历史服务可以在 web 页面上查看 Yarn 上执行 job 情况的详细信息。可以通过历史服务器查看已经运行完的 Mapreduce 作业记录,比如用了多少个 Map、用了多少个 Reduce、作业提交时间、作业启动时间、作业完成时间等信息。

二十二、开启历史服务

开启后,可以通过 Web 页面查看历史服务器:

http://bigdata-senior01.chybinmy.com:19888/

二十三、Web 查看 job 执行历史

1. 运行一个 mapreduce 任务

2. job 执行中

3. 查看 job 历史

历史服务器的 Web 端口默认是19888,可以查看Web界面。

但是在上面所显示的某一个 Job 任务页面的最下面,Map 和 Reduce 个数的链接上,点击进入 Map 的详细信息页面,再查看某一个 Map 或者 Reduce 的详细日志是看不到的,是因为没有开启日志聚集服务。

二十四、开启日志聚集

4. 日志聚集介绍

MapReduce是在各个机器上运行的,在运行过程中产生的日志存在于各个机器上,为了能够统一查看各个机器的运行日志,将日志集中存放在HDFS上,这个过程就是日志聚集。

5. 开启日志聚集

配置日志聚集功能:

Hadoop 默认是不启用日志聚集的。在 yarn-site.xml 文件里配置启用日志聚集。

yarn.log-aggregation-enable:是否启用日志聚集功能。

yarn.log-aggregation.retain-seconds:设置日志保留时间,单位是秒。

将配置文件分发到其他节点:

重启 Yarn 进程:

重启 HistoryServer 进程:

6. 测试日志聚集

运行一个 demo MapReduce,使之产生日志:

查看日志:

运行 Job 后,就可以在历史服务器 Web 页面查看各个 Map 和 Reduce 的日志了。  

第四部分:完全分布式安装

第八步 完全布式环境部署 Hadoop

完全分部式是真正利用多台 Linux 主机来进行部署 Hadoop,对 Linux 机器集群进行规划,使得 Hadoop 各个模块分别部署在不同的多台机器上。

二十五、环境准备

1. 克隆虚拟机

  • Vmware 左侧选中要克隆的机器,这里对原有的 BigData01 机器进行克隆,虚拟机菜单中,选中管理菜单下的克隆命令。

  • 选择“创建完整克隆”,虚拟机名称为 BigData02,选择虚拟机文件保存路径,进行克隆。

  • 再次克隆一个名为 BigData03 的虚拟机。

2. 配置网络

修改网卡名称:

在 BigData02 和 BigData03 机器上编辑网卡信息。执行 sudo vim /etc/udev/rules.d/70-persistent-net.rules 命令。因为是从 BigData01 机器克隆来的,所以会保留 BigData01 的网卡 eth0,并且再添加一个网卡 eth1。

并且 eth0 的 Mac 地址和 BigData01 的地址是一样的,Mac 地址不允许相同,所以要删除 eth0,只保留 eth1 网卡,并且要将 eth1改名为 eth0。将修改后的 eth0 的 mac 地址复制下来,修改 network-scripts 文件中的 HWADDR 属性。

修改网络参数:

BigData02机器IP改为192.168.100.12

BigData03机器IP改为192.168.100.13

3. 配置 Hostname

BigData02 配置 hostname 为 bigdata-senior02.chybinmy.com

BigData03 配置 hostname 为 bigdata-senior03.chybinmy.com

4. 配置 hosts

BigData01、BigData02、BigData03 三台机器 hosts 都配置为:

5. 配置 Windows 上的 SSH 客户端

在本地 Windows 中的 SSH 客户端上添加对 BigData02、BigData03 机器的SSH链接。

二十六、服务器功能规划

为了和之前 BigData01 机器上安装伪分布式 Hadoop 区分开来,我们将 BigData01上的 Hadoop 服务都停止掉,然后在一个新的目录  /opt/modules/app下安装另外一个Hadoop。

二十七、在第一台机器上安装新的 Hadoop

我们采用先在第一台机器上解压、配置 Hadoop,然后再分发到其他两台机器上的方式来安装集群。

6. 解压 Hadoop 目录:

7. 配置 Hadoop JDK 路径修改 hadoop-env.sh、mapred-env.sh、yarn-env.sh 文件中的 JDK 路径:

8. 配置 core-site.xml

fs.defaultFS 为 NameNode 的地址。

hadoop.tmp.dir 为 hadoop 临时目录的地址,默认情况下,NameNode 和 DataNode 的数据文件都会存在这个目录下的对应子目录下。应该保证此目录是存在的,如果不存在,先创建。

9. 配置 hdfs-site.xml

dfs.namenode.secondary.http-address 是指定 secondaryNameNode 的 http 访问地址和端口号,因为在规划中,我们将 BigData03 规划为 SecondaryNameNode 服务器。

所以这里设置为:bigdata-senior03.chybinmy.com:50090

10. 配置 slaves

slaves 文件是指定 HDFS 上有哪些 DataNode 节点。

11. 配置 yarn-site.xml

根据规划yarn.resourcemanager.hostname 这个指定 resourcemanager 服务器指向bigdata-senior02.chybinmy.com

yarn.log-aggregation-enable 是配置是否启用日志聚集功能。

yarn.log-aggregation.retain-seconds 是配置聚集的日志在 HDFS 上最多保存多长时间。

12. 配置 mapred-site.xml

从 mapred-site.xml.template 复制一个 mapred-site.xml 文件。

mapreduce.framework.name 设置 mapreduce 任务运行在 yarn 上。

mapreduce.jobhistory.address 是设置 mapreduce 的历史服务器安装在BigData01机器上。

mapreduce.jobhistory.webapp.address 是设置历史服务器的web页面地址和端口号。

二十八、设置 SSH 无密码登录

Hadoop 集群中的各个机器间会相互地通过 SSH 访问,每次访问都输入密码是不现实的,所以要配置各个机器间的

SSH 是无密码登录的。

1. 在 BigData01 上生成公钥

一路回车,都设置为默认值,然后再当前用户的Home目录下的.ssh 目录中会生成公钥文件(id_rsa.pub) 和私钥文件(id_rsa)

2. 分发公钥

3. 设置 BigData02、BigData03 到其他机器的无密钥登录

同样的在 BigData02、BigData03 上生成公钥和私钥后,将公钥分发到三台机器上。

二十九、分发 Hadoop 文件

  1. 首先在其他两台机器上创建存放 Hadoop 的目录

2. 通过 Scp 分发

Hadoop 根目录下的 share/doc 目录是存放的 hadoop 的文档,文件相当大,建议在分发之前将这个目录删除掉,可以节省硬盘空间并能提高分发的速度。

doc目录大小有1.6G。

三十、格式 NameNode

在 NameNode 机器上执行格式化:

注意:

如果需要重新格式化 NameNode,需要先将原来 NameNode 和 DataNode 下的文件全部删除,不然会报错,NameNode 和 DataNode 所在目录是在 core-site.xmlhadoop.tmp.dirdfs.namenode.name.dirdfs.datanode.data.dir属性配置的。

因为每次格式化,默认是创建一个集群ID,并写入 NameNode 和 DataNode 的 VERSION 文件中(VERSION 文件所在目录为 dfs/name/current 和 dfs/data/current),重新格式化时,默认会生成一个新的集群ID,如果不删除原来的目录,会导致 namenode 中的 VERSION 文件中是新的集群 ID,而 DataNode 中是旧的集群 ID,不一致时会报错。

另一种方法是格式化时指定集群ID参数,指定为旧的集群ID。

三十一、启动集群

  1. 启动 HDFS

2. 启动 YARN

在 BigData02 上启动 ResourceManager:

3. 启动日志服务器

因为我们规划的是在 BigData03 服务器上运行 MapReduce 日志服务,所以要在 BigData03 上启动。

4. 查看 HDFS Web 页面

http://bigdata-senior01.chybinmy.com:50070/

5. 查看 YARN Web 页面

http://bigdata-senior02.chybinmy.com:8088/cluster

三十二、测试 Job

我们这里用 hadoop 自带的 wordcount 例子来在本地模式下测试跑mapreduce。

  1.  准备 mapreduce 输入文件 wc.input

2. 在 HDFS 创建输入目录 input

3. 将 wc.inpu t上传到 HDFS

4. 运行 hadoop 自带的 mapreduce Demo

5. 查看输出文件

【未完,请待明天文章】

第五部分:Hadoop HA 安装