65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Linux 上使用 IntelliJ IDEA 调试 Hadoop HDFS

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (9投票s)

2015年12月26日

CPOL

7分钟阅读

viewsIcon

37514

本文帮助在 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 虚拟机。

  1. 安装 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)
  2. 安装 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"
  3. 安装本地库
    sudo apt-get -y install maven build-essential autoconf automake libtool
    cmake zlib1g-dev pkg-config libssl-dev libfuse-dev
  4. 安装 Google Protocol Buffers
    sudo apt-get install protobuf-compiler

    通过在命令提示符下键入 protoc 来验证。您应该会得到

    Missing input file.
  5. 下载适用于 Linux 的 IntelliJ IDEA。

    https://www.jetbrains.com/idea/download/#section=linux 您应该选择社区版。

下载 Hadoop 源代码

获取 Hadoop 源代码的方法有很多。我选择直接从 GitHub 获取,以便获得最新的代码库。当您开始为 Hadoop 贡献代码时,您可以使用 Git 工具克隆存储库。现在,我们可以直接从 GitHub 下载。

  1. 访问  https://github.com/apache/hadoop
  2. 点击下载 ZIP 选项,它将下载到“Downloads”文件夹。
  3. 解压缩后,您会得到一个名为 hadoop-trunk 的文件夹。
  4. 将此文件夹放在主目录中。我将其放在 ~/code/hadoop-trunk 下。

Hadoop 源代码结构

Hadoop 包含许多项目,如下所示。每个项目包含各种模块。

我们目前感兴趣的项目是 hadoop-common-projecthadoop-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_HOMEHADOOP_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 日:更新了设置调试环境的内容。
© . All rights reserved.