在 Linux 上使用 IntelliJ IDEA 调试 Hadoop HDFS






4.90/5 (9投票s)
本文帮助在 Linux Ubuntu 上使用 IntelliJ IDEA 设置 Hadoop 框架的调试环境
引言
本文档旨在为希望设置 Hadoop 调试环境的初学者提供指导,包括调试 Namenode、Datanode 和 Map Reduce API。这将有助于更好地理解框架本身。作为一名微软开发者,我对 Java、IntelliJ IDEA 和 Hadoop 开发并不熟悉。我写这篇文章的原因是我花了几天时间来设置调试环境,因为我在网上找不到完整的细节。然而,我有一种强烈的学习这项了不起的大数据技术的愿望,这帮助我克服了所有障碍。:) 我希望这篇文章能帮助那些想从零开始学习 Hadoop 的人。
本文分为两部分
- 第一部分:通过构建源代码运行 HDFS
- 第二部分:使用 IntelliJ 设置调试环境
背景
通常,Hadoop 技术包含两部分——数据存储和存储数据的分析。
HDFS (Hadoop Distributed File System) 负责存储和管理数据,MapReduce 框架负责数据分析工作。
HDFS 包含一个 Namenode 来管理文件系统的元数据,以及多个 Datanode 来存储数据。
我假设读者对 Hadoop 架构的基础有足够的了解。如果没有,请花些时间学习后再来看这篇文章。我建议阅读 Tom White 的《Hadoop:权威指南》一书。
HDFS 组件
Namenode 和 Datanode 实现为 Linux 守护进程,它们都公开 RPC 和 HTTP 接口进行通信。
Namenode RPC 接口默认监听在 8020 端口,HTTP 接口默认监听在 50070 端口。
Datanode RPC 接口默认监听在 50010 端口,HTTP 接口默认监听在 50075 端口。
这些端口可以通过配置进行覆盖。
Namenode 和 Datanode 在各自的 JVM 进程中运行。因此,通过一些简单的配置更改,我们可以在同一台机器上运行它们。
所需工具
我使用的是 Windows 上的 Ubuntu 14.x Linux 虚拟机。
- 安装 Java SDK 1.8
在命令提示符下运行以下命令,Ubuntu 将在您的计算机上安装 SDK。sudo apt-add-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer
通过在命令提示符下运行
java -version
来验证安装。在我的机器上,它显示如下。java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
- 安装 Maven
sudo apt-get install maven
验证 Maven 安装。在命令提示符下键入
mvn -version
。您应该会得到Apache Maven 3.0.5 Maven home: /usr/share/maven Java version: 1.8.0_65, vendor: Oracle Corporation Java home: /usr/local/jdk1.8.0_65/jre Default locale: en_US, platform encoding: UTF-8 OS name: "Linux", version: "3.19.0-25-generic", arch: "amd64", family: "unix"
- 安装本地库
sudo apt-get -y install maven build-essential autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev libfuse-dev
- 安装 Google Protocol Buffers
sudo apt-get install protobuf-compiler
通过在命令提示符下键入
protoc
来验证。您应该会得到Missing input file.
- 下载适用于 Linux 的 IntelliJ IDEA。
https://www.jetbrains.com/idea/download/#section=linux 您应该选择社区版。
下载 Hadoop 源代码
获取 Hadoop 源代码的方法有很多。我选择直接从 GitHub 获取,以便获得最新的代码库。当您开始为 Hadoop 贡献代码时,您可以使用 Git 工具克隆存储库。现在,我们可以直接从 GitHub 下载。
- 访问 https://github.com/apache/hadoop
- 点击下载 ZIP 选项,它将下载到“Downloads”文件夹。
- 解压缩后,您会得到一个名为 hadoop-trunk 的文件夹。
- 将此文件夹放在主目录中。我将其放在 ~/code/hadoop-trunk 下。
Hadoop 源代码结构
Hadoop 包含许多项目,如下所示。每个项目包含各种模块。
我们目前感兴趣的项目是 hadoop-common-project 和 hadoop-hdfs-project。
hadoop-common-project 包含一个名为 hadoop-common 的模块,该模块拥有所有项目/模块共享的通用库。
hadoop-hdfs-project 包含 hadoop-hdfs 模块,这是 HDFS 的标准实现。它包含 Namenode 和 Datanode 的实现。
构建 Hadoop 源代码
Hadoop 有许多依赖项,这些依赖项通常在 Maven 存储库中可用。因此,我们需要构建源代码一次以获取所有依赖项。请确保您已连接到 Internet。
转到 Hadoop 源代码并运行此命令
mvn clean install -Pdist -DskipTests
~/code/hadoop-trunk/ $mvn clean install -Pdist -DskipTests
根据您的 Internet 速度,解析依赖项和构建源代码将花费一些时间,所以请放松!
请确保构建成功。如果您按照说明正确操作,则不应该出现任何错误。如果出现任何错误,请在 Google 上搜索解决方案或在评论部分发布。我们将尽力提供帮助!
配置环境
构建产生两个我们现在感兴趣的重要文件夹。在我的例子中,它们是
一个是 hadoop-common 中的:/home/mallan/code/hadoop-trunk/hadoop-common-project/hadoop-common/target/hadoop-common-3.0.0-SNAPSHOT
一个是 hadoop-hdfs 中的:/home/mallan/code/hadoop-trunk/hadoop-hdfs-project/hadoop-hdfs/target/hadoop-hdfs-3.0.0-SNAPSHOT
3.0.0 表示 Hadoop 版本。它可能会根据您的源代码版本而变化。
HDFS 所需的一切都只在这两个文件夹中。花一些时间探索这些文件夹的内容。
让我们为这两个文件夹配置 Hadoop 环境变量。
打开 .bashrc 文件(位于您的主目录),然后复制以下行。
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_COMMON_HOME=~/code/hadoop-trunk/hadoop-common-project/hadoop-common/target/hadoop-common-3.0.0-SNAPSHOT
export HADOOP_HDFS_HOME=~/code/hadoop-trunk/hadoop-hdfs-project/hadoop-hdfs/target/hadoop-hdfs-3.0.0-SNAPSHOT
export HADOOP_YARN_HOME=~/code/hadoop-trunk/
export HADOOP_MAPRED_HOME=~/code/hadoop-trunk/
export HADOOP_CONF_DIR=~/code/hadoop-trunk/hadoop-common-project/hadoop-common/target/hadoop-common-3.0.0-SNAPSHOT/etc/hadoop
export PATH=$PATH:$HADOOP_COMMON_HOME/bin:$HADOOP_HDFS_HOME/bin:$HADOOP_COMMON_HOME/sbin:$HADOOP_HDFS_HOME/sbin
export PATH=$JAVA_HOME/bin:$PATH
HADOOP_YARN_HOME
和 HADOOP_MAPRED_HOME
只是为了让脚本正常运行,否则它会报错。所以,我提供了虚拟路径。当您需要启用 MapReduce 和 YARN 框架时,需要正确配置它们。
关闭所有打开的终端,然后重新打开它们,以便设置这些环境变量。
接下来,我们需要配置默认文件系统主目录,位于 /home/mallan/code/hadoop-trunk/hadoop-common-project/hadoop-common/target/hadoop-common-3.0.0-SNAPSHOT/etc/core-site.xml,并将此属性添加到配置部分。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs:///</value>
<description>The name of the default file system. </description>
</property>
</configuration>
运行 HDFS (Namenode 和 Datanode)
您已准备好运行自己构建的 Namenode 和 Datanode。
转到提示符并键入 hdfs namenode -format
。这将准备 /tmp 文件夹中的文件系统元数据文件。
键入 hdfs namenode
。** 这将运行 Namenode,它将开始监听 8020 和 50070 端口。
在另一个终端中,键入 hdfs datanode
。这将运行 Datanode,它将如上所述开始监听 50010 和 50075 端口。
现在,使用另一个终端,您可以运行 dfs 命令,例如
hdfs dfs -ls /
hdfs dfs -mkdir /folder1
hdfs dfs -coptyFromLocal <source> <destination>
等等。
What Next?
我希望您能够运行您构建的二进制文件中的 HDFS。在下一节中,我们将设置自己的调试环境,以便调试 Namenode 和 Datanode。
使用 IntelliJ 设置源代码
Hadoop 项目使用 Maven 来构建和维护项目。如果您是 Maven 的新手,我建议花一些时间学习它。
Maven 项目包含 POM.xml 文件,该文件定义了项目结构和依赖项。IntelliJ 在解析 POM 文件方面做得很好。
请遵循以下步骤
1. 运行 IntelliJ,您会看到以下屏幕
2. 点击 Open 并选择 hadoop-trunk 文件夹中的 POM.xml。
3. IntelliJ IDEA 将读取 POM 文件并加载所有项目。每个项目/模块又包含自己的 POM.xml 文件。IntelliJ 解析所有依赖项,最后看起来像这样。
4. 如果使用 Build->Rebuild 选项构建项目,它应该可以正常构建。但是,如果您转到 Namenode.java (hadoop-hdfs-project->hadoop-hdfs->src->main->java->org.apache.hadoop->hdfs->server->Namenode->Namenode.java)
并尝试使用 Run 选项运行它(右键单击文件即可获得)。它不会运行,而是会抛出一些 NoClassFoundErrors。请按照以下步骤进行修复。
4.1 我们需要对 (hadoop-hdfs-project->hadoop- hdfs->POM.xml 文件中的 POM 文件进行一些更改。
转到 <dependencies> 部分,您会看到一些依赖项的作用域为 **provided**。这意味着运行进程的容器应在运行时提供这些依赖项。IntelliJ IDEA 无法提供这一点,因此将所有 'provided' 更改为 'compile' 选项。
在 此处 了解更多关于 Maven 依赖项的信息。
4.2 转到 hadoop-common-projectàhadoop-commonàsrcàmainàresourcesàcore-defaults.xml。
确保 fs.defaultFS 和 fs.default.name 的值为 hdfs:///。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs:///</value>
<description>The name of the default file system. </description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs:///</value>
</property>
</configuration>
4.3 我们还需要修复最后一件事。Namenode 运行 HttpServer,它必须能够定位 Web 应用程序文件夹。
在资源管理器中,转到 ~/code/hadoop-trunk/hadoop-hdfs-project/hadoop-hdfs/target/,您会找到 webapps 文件夹。将此复制并粘贴到“classes”文件夹中。运行时会在该处查找 webapps 文件夹。下面的截图显示了复制 webapps 文件夹后的情况。
5. 在开始调试之前,运行 hdfs namenode –format 。这将准备 /tmp 中的元数据文件夹。
6. 现在我们准备好以调试模式运行 Namenode。转到 Namenode.java,右键单击它,然后选择“debug Namenode”选项。在此之前,您可能想在 Namenode 的 main 方法中设置断点。
7. 一旦 Namenode 以调试模式运行,您就可以从命令提示符运行一些 hdfs 命令。例如:hdfs dfs –ls / 下面的截图显示了在 NamenodeRpcServer 类中命中断点
并行执行
在调试 Namenode 或 Datanode 时,我们可以利用我们从已构建的二进制文件中运行的实例。例如:
在尝试调试 Namenode 时,我们可以仅运行从已构建二进制文件中运行的 Datanode。IntelliJ 中的调试 Namenode 可以连接到正在运行的 Datanode。Datanode 调试也是如此。
我希望您现在能够成功调试 HDFS。我相信这是学习 Hadoop 架构的好方法。如果您遇到任何问题,请发表评论。谢谢。
参考文献
https://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment
历史
- 2015 年 12 月 26 日:初始版本
- 2015 年 12 月 27 日:更新了设置调试环境的内容。