命令行一键启动 Hadoop 集群

发布于: 2020 年 07 月 18 日
命令行一键启动Hadoop集群

一直误以为 Hadoop 的安装运行那么麻烦是不可避免的,其实并非如此。

Hadoop 提供了一种算得上是“开箱可用”的集群启动方式,可以用来快速实验和测试,这个方法就是“迷你集群”,下文用 MiniCluster指代。

引用官网:

使用 MiniCluster 命令行,用户可以使用一个命令就可以启动和关闭一个小而全的 Hadoop 集群,不需要配置任何的环境变量或者配置文件,这个集群包含了 HDFS 和 YARN/MapReduce。

不过从实际操作来看,还是需要稍微配置一点东西的,但很少。

本文基于 Hadoop 2.7.0,在 Mac 上测试,Java 已安装。

参考的官方文档:https://hadoop.apache.org/docs/r2.7.0/hadoop-project-dist/hadoop-common/CLIMiniCluster.html

但是完全按照文档没有走通,因此有一些 workaround。

概述

运行一个 Hadoop MiniCluster 的步骤如下:

  1. 下载并解压 Hadoop 安装包;

  2. 配置 HADOOP_CLASSPATH 环境变量;

  3. 运行 MiniCluster;

下载安装

下载解压命令:

$ wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.0/hadoop-2.7.0.tar.gz
$ tar xvf hadoop-2.7.0.tar.gz
$ cd hadoop-2.7.0

唯一需要解释的是,为什么选择 2.7.0 版本:

  1. 因为我想稍微研究一下 Hadoop 2.x 版本,因此不考虑 3.x

  2. 工作中我们使用的是 2.6.0 版本,有些功能是不支持的,因此大版本就在 2.7 - 2.10 中选择,比较倾向于小版本,因为复杂度会相对低一些

  3. 搜索了一下,比如:https://www.pervasivecomputing.net/hadoop/hadoop-version

  4. 如果这个版本不合适,后面再换

配置环境变量

这一步没有显式的写在官方文档里,如果直接执行下一步,会报 ClassNotFound 的错误。

我希望把 Hadoop 安装包里所有的 JAR 包都添加到 HADOOP_CLASSPATH 中,具体做法是,在你的 .bashrc.zshrc 中添加如下内容:

# Hadoop classpath
export HADOOP_HOME=/Users/iamabug/workspace/hadoop-2.7.0 # 替换为你的安装目录
export HADOOP_CLASSPATH=$(find $HADOOP_HOME -name '*.jar' | xargs echo | tr ' ' ':')

在配置过程中,也搜到了别的配置方法,但是不太行:

# this does not work !!
export HADOOP_HOME=/Users/iamabug/workspace/hadoop-2.7.0
export HADOOP_CLASSPATH=${CLASSPATH}:$(${HADOOP_HOME}/bin/hadoop classpath)
# this does not work

暂时不去深究原因。

运行 MiniCluster

在 Hadoop 的安装目录下,执行:

$ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.0-tests.jar minicluster -format
# 注意,第一次启动时 -format 参数是必须的
# 还有其它的参数,比如指定 datanode,nodemanager 数量,指定端口,增加自定义配置等

输出的日志如下(省略了一部分):

20/07/17 09:48:23 INFO mapreduce.MiniHadoopClusterManager: Updated 0 configuration settings from command line.
20/07/17 09:48:23 INFO hdfs.MiniDFSCluster: starting cluster: numNameNodes=1, numDataNodes=1
...
20/07/17 09:48:25 INFO namenode.NameNode: NameNode RPC up at: localhost/127.0.0.1:55712
20/07/17 09:48:25 INFO namenode.FSNamesystem: Starting services required for active state
...
20/07/17 09:48:25 INFO hdfs.MiniDFSCluster: Starting DataNode 0 with dfs.datanode.data.dir: [DISK]file:/Users/iamabug/workspace/hadoop-2.7.0/build/test/data/dfs/data/data1,[DISK]file:/Users/iamabug/workspace/hadoop-2.7.0/build/test/data/dfs/data/data2
...
20/07/17 09:48:41 INFO server.MiniYARNCluster: MiniYARN ResourceManager address: localhost:55769
20/07/17 09:48:41 INFO server.MiniYARNCluster: MiniYARN ResourceManager web address: 0.0.0.0:8088
...
20/07/17 09:48:42 INFO resourcemanager.ResourceTrackerService: NodeManager from node localhost(cmPort: 55773 httpPort: 55776) registered with capability: <memory:4096, vCores:8>, assigned nodeId localhost:55773

从日志里可以看到启动了一个 NameNode,一个 DataNode 、一个 ResourceManager 和一个 NodeManager,每个角色的服务使用了随机的端口,为了方便使用,我们来指定一下 NN 和 RM 的端口:

$ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.0-tests.jar minicluster -format -nnport 8020 -rmport 8032

下面分别测试一下HDFS和YARN。

上传下载文件

把安装目录下的 README.txt 上传到个人目录下:

$ bin/hadoop fs -ls hdfs://localhost:8020/user/iamabug
Found 2 items
-rw-r--r-- 3 iamabug supergroup 1366 2020-07-17 16:13 hdfs://localhost:8020/user/iamabug/README.txt
drwxr-xr-x - iamabug supergroup 0 2020-07-17 16:02 hdfs://localhost:8020/user/iamabug/target

再把它下载下来:

$ bin/hadoop fs -get hdfs://localhost:8020/user/iamabug/README.txt DO_NOT_README.txt
$ ls
DO_NOT_README.txt README.txt etc libexec target
LICENSE.txt bin include sbin
NOTICE.txt build lib share

运行 WordCount

创建输入目录并准备数据:

$ bin/hadoop fs -mkdir hdfs://localhost:8020/user/iamabug/input
$ bin/hadoop fs -put README.txt hdfs://localhost:8020/user/iamabug/input

运行:

$ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar wordcount hdfs://localhost:8020/user/iamabug/input hdfs://localhost:8020/user/iamabug/output

任务基本瞬间完成,查看输出:

$ bin/hadoop fs -text hdfs://localhost:8020/user/iamabug/output/*
(BIS), 1
(ECCN) 1
(TSU) 1
(see 1
...

但是如果你通过 http://localhost:8088 去查看任务的话,会发现任务列表是空的,这是因为MapReduce任务默认是通过MapReduce集群来运行的,并不是YARN集群,如果要使用YARN集群来运行MR任务的话,需要新建 ./etc/hadoop/mapreduce-site.xml文件,文件内容为:

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

重启集群,再重新提交任务,就可以在YARN的任务列表里找到MR任务:

本文完。

公众号:dashujuxuetu

发布于: 2020 年 07 月 18 日 阅读数: 13
用户头像

大数据学徒

关注

活到秃学到秃 2019.01.08 加入

专注大数据运维开发

评论

发布
暂无评论
命令行一键启动Hadoop集群