搭建 Hadoop 开发环境并编写运行测试类

发布于: 17 小时前
搭建Hadoop开发环境并编写运行测试类

本文基于 Hadoop 2.7.0 进行搭建配置

Hadoop 的开发构建依赖较多,我的开发机是Mac,官方推荐使用Linux/Ubuntu,而我也确实遇到了一些奇怪的问题,因此我在虚拟机里来搭建开发调试环境。

我尝试过使用官方提供的docker开发镜像,然后在容器里安装图形界面,再通过vnc进去,不过复杂度也很高,我放弃了。

安装 Ubuntu 虚拟机

用Virtualbox下载ISO文件,安装即可。

选择了Ubuntu 18.04.4的镜像,可以通过 http://mirrors.ustc.edu.cn/ubuntu-releases/18.04.4/ubuntu-18.04.4-desktop-amd64.iso 进行下载,装好之后,替换镜像源:

sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt update

因为要安装很多东西,为了避免sudo输入密码,在 /etc/sudoers 最后添加如下一行:

iamabug ALL=(ALL) NOPASSWD: ALL

安装依赖

下面各个依赖的安装参照 https://github.com/apache/hadoop/blob/release-2.7.0/BUILDING.txt 进行。

Oracle JDK 1.7 OpenJDK 1.8

官方推荐 Oracle JDK 1.7,但是安装起来有点费劲,根据 https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions,OpenJDK 也是支持的。

安装并验证:

$ sudo apt-get install openjdk-8-jdk
$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

配置相关环境变量,在 ~/.bashrc 最后添加以下几行:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export PATH=${JAVA_HOME}/bin:${PATH}

Maven

$ sudo apt-get -y install maven

native 库

$ sudo apt-get -y install build-essential autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev

Protoc 2.5.0

# 不要使用apt-get进行安装,版本多半不是2.5.0
$ wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
$ tar xvf protobuf-2.5.0.tar.gz
$ cd protobuf-2.5.0/
$ ./autogen.sh
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig

注意:这里必须要安装 2.5.0 版本,否则接下来编译时会遇到版本不一致的报错:

[ERROR] Failed to execute goal org.apache.hadoop:hadoop-maven-plugins:2.7.0:protoc (compile-protoc) on project hadoop-common: org.apache.maven.plugin.MojoExecutionException: protoc version is 'libprotoc 3.0.0', expected version is '2.5.0' -> [Help 1]

可选依赖

Snappy 压缩

$ sudo apt-get install libsnappy-dev
# 文档中还有一个叫snappy的包,但没找到,先跳过

Bzip2

$ sudo apt-get install bzip2 libbz2-dev

Jansson(JSON的C语言库)

$ sudo apt-get install libjansson-dev

Linux FUSE

$ sudo apt-get install fuse libfuse-dev

下载&编译

虚拟机安装了Intellij IDEA community版本。

克隆github上项目,切换分支:

$ git clone https://github.com/apache/hadoop
# 有可能很慢
$ git checkout release-2.7.0

然后在IDEA中打开项目,在进行构建前,编辑 ~/.m2/settings.xml,修改或添加内容:

<settings>
<mirrors>
<mirror>
<id>aliyun-public</id>
<mirrorOf>*</mirrorOf>
<name>aliyun public</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>aliyun-central</id>
<mirrorOf>*</mirrorOf>
<name>aliyun central</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>aliyun-apache-snapshots</id>
<mirrorOf>*</mirrorOf>
<name>aliyun apache-snapshots</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
<mirror>
<id>aliyun-google</id>
<mirrorOf>*</mirrorOf>
<name>aliyun google</name>
<url>https://maven.aliyun.com/repository/google</url>
</mirror>
<mirror>
<id>aliyun-releases</id>
<mirrorOf>*</mirrorOf>
<name>aliyun releases</name>
<url>https://maven.aliyun.com/repository/releases</url>
</mirror>
<mirror>
<id>aliyun-snapshots</id>
<mirrorOf>*</mirrorOf>
<name>aliyun snapshots</name>
<url>https://maven.aliyun.com/repository/snapshots</url>
</mirror>
</mirrors>
</settings>

构建命令:

$ mvn package -Pdist -DskipTests -Dtar

不出意外,一段时间后编译成功:

[INFO] Reactor Summary for Apache Hadoop Main 2.7.0:
[INFO]
[INFO] Apache Hadoop Main ................................. SUCCESS [ 1.435 s]
.... // 省略
[INFO] Apache Hadoop Distribution ......................... SUCCESS [ 26.005 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 29:25 min
[INFO] Finished at: 2020-07-21T07:57:23+08:00
[INFO] ------------------------------------------------------------------------

查看 hadoop-dist 目录,可以看到二进制包的目录和压缩包:

$ ls hadoop-dist/target/
antrun dist-tar-stitching.sh hadoop-2.7.0.tar.gz hadoop-dist-2.7.0-javadoc.jar maven-archiver
dist-layout-stitching.sh hadoop-2.7.0 hadoop-dist-2.7.0.jar javadoc-bundle-options test-dir

编写测试类

上面的编译其实没什么意思,因为不编译也能从官网下载到安装包,重点是我要能在IDEA里直接编写调试代码。

下面我们就在Hadoop源码项目下写一个自己的测试类。

在IDEA中打开Hadoop项目后,如果出现类没有被识别的情况下,可以尝试点击File菜单下的Invalidate Cache/Restart。

hadoop/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs 路径下新建 TestFirst 类,代码如下:

package org.apache.hadoop.hdfs;
import com.google.common.io.Files;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.io.File;
public class TestFirst {
@Test
public void runDFS() throws Exception{
// 以临时目录作为基础路径,启动一个MiniDFSCluster
// MiniDFSCluster 类是专门用来做JUnit测试的单进程DFS集群
Configuration conf = new Configuration();
File tempDir = Files.createTempDir();
conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, tempDir.getAbsolutePath());
MiniDFSCluster cluster = new MiniDFSCluster.Builder(conf).build();
tempDir.deleteOnExit();
Thread.sleep(100000);
}
}

点击运行按钮,报错:

java.io.FileNotFoundException: webapps/hdfs not found in CLASSPATH
... // 省略
2020-07-21 19:28:48,622 INFO hdfs.MiniDFSCluster (MiniDFSCluster.java:shutdown(1712)) - Shutting down the Mini HDFS Cluster

求助搜索引擎,搜索结果:

  1. https://issues.apache.org/jira/browse/HADOOP-7566,这个貌似可以解释原因,大意是说测试的jar包里没有包含webapps目录,不过我们现在也没打包,不确定。

  2. https://www.jianshu.com/p/fdbda76ccac7,这里给了两种解决方法,一是手动把src/webapps目录拷到target目录下,二是把src/webapps 目录添加到classpath里,第一个方法是验证过的,但第二个可能更科学,因为放到target目录下有可能被清理。

关于根本原因以及这种报错是否正常,暂时不去管它,因为我的目的是要先把代码跑起来,去研究原因时间不足。

在IDEA的Project Structure 的 SDK界面把 src/webapps 添加到classpath,重新执行,仍然报错,放弃。

src/webapps 目录拷贝到 target/test-classes 目录下,重新执行,成功,日志和直接在命令行启动MiniDFSCluster差不多,从日志里面找到NameNode的Web UI端口:

2020-07-21 20:07:34,903 INFO http.HttpServer2 (HttpServer2.java:openListeners(915)) - Jetty bound to port 45667

在浏览器里访问 http://localhost:45667,可以看到熟悉的页面:

目标达成。

后续

接下来我会用这个开发环境研究Hadoop的基本运行原理,从HDFS开始。

公众号:dashujuxuetu

发布于: 17 小时前 阅读数: 22
用户头像

大数据学徒

关注

活到秃学到秃 2019.01.08 加入

专注大数据运维开发

评论

发布
暂无评论
搭建Hadoop开发环境并编写运行测试类