命令行一键启动Hadoop集群
一直误以为 Hadoop 的安装运行那么麻烦是不可避免的,其实并非如此。
Hadoop 提供了一种算得上是“开箱可用”的集群启动方式,可以用来快速实验和测试,这个方法就是“迷你集群”,下文用 MiniCluster指代。
引用官网:
使用 MiniCluster 命令行,用户可以使用一个命令就可以启动和关闭一个小而全的 Hadoop 集群,不需要配置任何的环境变量或者配置文件,这个集群包含了 HDFS 和 YARN/MapReduce。
不过从实际操作来看,还是需要稍微配置一点东西的,但很少。
本文基于 Hadoop 2.7.0,在 Mac 上测试,Java 已安装。
但是完全按照文档没有走通,因此有一些 workaround。
概述
运行一个 Hadoop 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 版本:
配置环境变量
这一步没有显式的写在官方文档里,如果直接执行下一步,会报 ClassNotFound 的错误。
我希望把 Hadoop 安装包里所有的 JAR 包都添加到 HADOOP_CLASSPATH 中,具体做法是,在你的 或 中添加如下内容:
# 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: , 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。
上传下载文件
把安装目录下的 上传到个人目录下:
$ 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
...
但是如果你通过 去查看任务的话,会发现任务列表是空的,这是因为MapReduce任务默认是通过MapReduce集群来运行的,并不是YARN集群,如果要使用YARN集群来运行MR任务的话,需要新建 文件,文件内容为:
mapreduce.framework.name
yarn
重启集群,再重新提交任务,就可以在YARN的任务列表里找到MR任务:

本文完。
公众号:dashujuxuetu