# 手工搭建Hadoop环境（多台Linux ECS）
#### 简介
本文介绍了如何在华为云上使用多台弹性云服务器的Linux实例手工搭建Hadoop环境。Hadoop是一款由Apache基金会用Java语言开发的分布式开源软件框架，用户可以在不了解分布式底层细节的情况下，开发分布式程序，充分利用集群的能力进行高速运算和存储。Hadoop的核心部件是HDFS（Hadoop Distributed File System）和MapReduce：
- HDFS：是一个分布式文件系统，可对应用程序数据进行分布式储存和读取。
- MapReduce：是一个分布式计算框架，MapReduce的核心思想是把计算任务分配给集群内的服务器执行。通过对计算任务的拆分（Map计算和Reduce计算），再根据任务调度器（JobTracker）对任务进行分布式计算。
更多信息，请参见[Hadoop官网](https://hadoop.apache.org/)。
#### 前提条件
- 已购买3台弹性云服务器，且已为其绑定弹性公网IP。
- 在部署Hadoop前需对节点进行规划。以三台弹性云服务器为例，**hadoop001** 节点为master节点，**hadoop002** 和**hadoop003** 节点为worker节点。
  
  | **功能组件** | **hadoop001**                                                                                                                                                                                                            | **hadoop002**                                                                                                                                                                                                                            | **hadoop003**                                                                                                                                                                                                                         |
  |:---|:---|:---|:---|
  | HDFS    | - NameNode  - DataNode   | DataNode                                                                                                                                                                                                                                  | - SecondaryNameNode  - DataNode   |
  | YARN  | NodeManager                                                                                                                                                                                                            | - ResourceManager  - NodeManager   | NodeManager                                                                                                                                                                                                                           |
     
  
- 弹性云服务器所在安全组添加了如下表所示的安全组规则，具体步骤参见[为安全组添加安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)。
  表1安全组规则 
  | 方向  | 优先级 | 策略 | 类型      | 协议端口       | 源地址        |
  |:---|:---|:---|:---|:---|:---|
  | 入方向 | 1    | 允许    | IPv4 | TCP: 22  | 0.0.0.0/0 |
  | 入方向  | 1     | 允许     | IPv4   | TCP: 443 | 0.0.0.0/0 |
  | 入方向  | 1       | 允许   | IPv4     | TCP: 8088  | 0.0.0.0/0 |
  | 入方向    | 1       | 允许    | IPv4      | TCP: 9870    | 0.0.0.0/0     |
     
  
 
#### 操作流程
Linux实例手工搭建Hadoop环境的具体操作步骤如下：
1. [安装JDK]
2. [配置SSH免密登录]
3. [安装Hadoop]
4. [配置Hadoop]
5. [启动Hadoop]
 
#### 实施步骤
1. **安装JDK**
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   所有实例均需执行此操作。
   1. 登录弹性云服务器。 具体操作请参见[Linux ECS登录方式概述](https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0013771089.html)。
      
   
   2. 执行以下命令，下载[JDK 1.8](https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz)安装包。
      ```
      wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz
      ```
      
   
   3. 执行以下命令，解压下载的JDK 1.8安装包。
      ```
      tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz
      ```
      
   
   4. 执行以下命令，移动并重命名JDK安装包。 本示例中将JDK安装包重命名为java8，您可以根据需要使用其他名称。
      ```
      sudo mv java-se-8u41-ri/ /usr/java8
      ```
      
   
   5. 执行以下命令，配置Java环境变量。 如果您将JDK安装包重新命名为其他名称，需将以下命令中的java8替换为实际的名称。
      ```
      sudo sh -c "echo 'export JAVA_HOME=/usr/java8' >> /etc/profile"
      sudo sh -c 'echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile'
      source /etc/profile
      ```
      
   
   6. 验证安装。
      ```
      java -version
      ```
      回显信息如下表示jdk安装成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002603318107.png "点击放大")
      
   
   
   
   
2. **配置SSH免密登录**
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   所有实例均需执行此操作。
   1. 执行以下命令，配置主机名和通信。
      ```
      sudo vim /etc/hosts
      ```
      添加所有实例的信息\<主私网IP 主机名\>到/etc/hosts文件中。如下：
      ```
      私网IP hadoop001 
      私网IP hadoop002 
      私网IP hadoop003
      ```
      
   
   2. 执行以下命令，创建公钥和私钥。
      ```
      ssh-keygen -t rsa
      ```
      按三次回车后回显信息如下图所示，表示创建公钥和私钥成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002572758686.png "点击放大")
      
   
   3. 执行，替换主机名为正确的名称。
      ```
      ssh-copy-id <主机名>
      ```
      示例如下：
      hadoop001上依次执行以下命令，执行每一个命令后需要输入yes和对应ECS实例的登录密码。
      ```
      ssh-copy-id hadoop001 
      ssh-copy-id hadoop002 
      ssh-copy-id hadoop003
      ```
      返回如下信息，表示免密登录配置成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002604050527.png "点击放大")
      
   
   
   
   
3. **安装Hadoop**
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   所有实例均需执行此操作。
   1. 执行以下命令，下载[Hadoop软件包](https://archive.apache.org/dist/hadoop/common/)。
      此处以[3.2.4](https://archive.apache.org/dist/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz)版本为例。
      ```
      wget https://archive.apache.org/dist/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz
      ```
      
   
   2. 解压Hadoop安装包到opt目录下。
      ```
      sudo tar -zxvf hadoop-3.2.4.tar.gz -C /opt/
      sudo mv /opt/hadoop-3.2.4 /opt/hadoop
      ```
      
   
   3. 执行以下命令，配置环境变量。
      ```
      sudo sh -c "echo 'export HADOOP_HOME=/opt/hadoop' >> /etc/profile"
      sudo sh -c "echo 'export PATH=\$PATH:/opt/hadoop/bin' >> /etc/profile"
      sudo sh -c "echo 'export PATH=\$PATH:/opt/hadoop/sbin' >> /etc/profile"
      source /etc/profile
      ```
      
   
   4. 执行以下命令，修改配置文件yarn-env.sh和hadoop-env.sh中JAVA_HOME的路径。
      ```
      sudo sh -c 'echo "export JAVA_HOME=/usr/java8" >> /opt/hadoop/etc/hadoop/yarn-env.sh'
      sudo sh -c 'echo "export JAVA_HOME=/usr/java8" >> /opt/hadoop/etc/hadoop/hadoop-env.sh'
      ```
      
   
   5. 验证安装。
      ```
      hadoop version
      ```
      回显信息如下，表示Hadoop安装成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002603198181.png "点击放大")
      
   
   
   
   
4. **配置Hadoop**
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   所有实例均需执行此操作。
   1. 修改Hadoop配置文件core-site.xml。
      1. 执行以下命令，进入编辑页面。
         ```
         vim /opt/hadoop/etc/hadoop/core-site.xml
         ```
         
      
      2. 输入**i**，进入编辑模式。
      
      3. 在\<configuration\>\</configuration\>节点内，插入如下内容。
         ```
         <!--指定namenode的地址-->
            <property>
                  <name>fs.defaultFS</name>
                  <value>hdfs://hadoop001:8020</value>
            </property>
            <!--用来指定使用hadoop时产生文件的存放目录-->
            <property>
                  <name>hadoop.tmp.dir</name>
                  <value>/opt/hadoop/data</value>
            </property>
            <!--配置HDFS网页登录使用的静态用户为hadoop-->
            <property>
                   <name>hadoop.http.staticuser.user</name>
                   <value>hadoop</value>
            </property>
         ```
         
      
      4. 按**Esc**键退出编辑模式。
      
      5. 执行以下命令保存并退出。
         ```
         :wq
         ```
         
       
   
   2. 修改Hadoop配置文件hdfs-site.xml。
      1. 执行以下命令，进入编辑页面。
         ```
         vim /opt/hadoop/etc/hadoop/hdfs-site.xml
         ```
         
      
      2. 输入**i**，进入编辑模式。
      
      3. 在\<configuration\>\</configuration\>节点内，插入如下内容。
         ```
         <!-- namenode web 端访问地址-->
             <property>
                 <name>dfs.namenode.http-address</name>  
                 <value>hadoop001:9870</value>
             </property>
             <!-- secondary namenode web 端访问地址-->
             <property>
                 <name>dfs.namenode.secondary.http-address</name>
                 <value>hadoop003:9868</value>
             </property>
         ```
         
      
      4. 按**Esc**键退出编辑模式。
      
      5. 执行以下命令保存并退出。
         ```
         :wq
         ```
         
       
   
   3. 修改Hadoop配置文件yarn-site.xml。
      1. 执行以下命令，进入编辑页面。
         ```
         vim /opt/hadoop/etc/hadoop/yarn-site.xml
         ```
         
      
      2. 输入**i**，进入编辑模式。
      
      3. 在\<configuration\>\</configuration\>节点内，插入如下内容。
         ```
         <!--NodeManager获取数据的方式是shuffle-->
              <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
              </property>
             <!--指定Yarn(ResourceManager)的地址-->     
             <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>hadoop002</value>
             </property> 
             <!--指定NodeManager允许传递给容器的环境变量白名单-->
             <property>
         <name>yarn.nodemanager.env-whitelist</name>
         <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
             </property>
         ```
         
      
      4. 按**Esc**键退出编辑模式。
      
      5. 执行以下命令保存并退出。
         ```
         :wq
         ```
         
       
   
   4. 修改Hadoop配置文件mapred-site.xml。
      1. 执行以下命令，进入编辑页面。
         ```
         vim /opt/hadoop/etc/hadoop/mapred-site.xml
         ```
         
      
      2. 输入**i**，进入编辑模式。
      
      3. 在\<configuration\>\</configuration\>节点内，插入如下内容。
         ```
         <!--告诉hadoop将MR(Map/Reduce)运行在YARN上-->
            <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
            </property>
         ```
         
      
      4. 按**Esc**键退出编辑模式。
      
      5. 执行以下命令保存并退出。
         ```
         :wq
         ```
         
       
   
   5. 修改Hadoop配置文件workers。
      1. 执行以下命令，进入编辑页面。
         ```
         vim /opt/hadoop/etc/hadoop/workers
         ```
         
      
      2. 输入**i**，进入编辑模式。
      
      3. 在文件workers内，插入实例信息。
         ```
         hadoop001
         hadoop002
         hadoop003
         ```
         
      
      4. 按**Esc**键退出编辑模式。
      
      5. 执行以下命令保存并退出。
         ```
         :wq
         ```
         
       
   
   
   
   
5. **启动Hadoop**
   
   1. 执行以下命令，初始化namenode。
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      仅在第一次启动时需要初始化namenode。三台实例均需执行此操作。
      ```
      hadoop namenode -format
      ```
      
   
   2. 启动Hadoop。
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/caution_3.0-zh-cn.png)
      - 出于系统安全和稳定性考虑，Hadoop官方不推荐使用root用户来启动Hadoop服务，直接使用root用户会因为权限问题无法启动Hadoop。您可以通过非root用户身份启动Hadoop服务，例如ecs-user用户等。
      
      - 如果您一定要使用root用户启动Hadoop服务，请在了解Hadoop权限控制及相应风险之后，修改配置文件，具体步骤请参见[相关操作]。
      
      - 使用root用户启动Hadoop服务会带来严重的安全风险，包括但不限于数据泄露、恶意软件更容易获得系统最高权限、意料之外的权限问题或行为。
       
      1. 在hadoop001上执行start-dfs.sh脚本，启动HDFS服务。 这个脚本会启动NameNode、SecondaryNameNode和DataNode等组件，从而启动HDFS服务。
         ```
         start-dfs.sh
         ```
         回显信息如下图所示。
         ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002574909040.png "点击放大")
         
      
      2. 在hadoop002上执行start-yarn.sh脚本，启动YARN服务。 这个脚本会启动ResourceManager、NodeManager等组件，从而启动YARN服务。
         ```
         start-yarn.sh
         ```
         回显信息如下图所示。
         ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002603318111.png "点击放大")
         
       
   
   3. 在三台节点上执行以下命令，可以查看成功启动的进程。
      ```
      jps
      ```
      成功启动的进程如下所示。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002572758690.png "点击放大")
      
   
   4. 打开浏览器访问http://\<hadoop002 ECS公网IP\>:8088，访问YARN的Web UI界面。 通过该界面可以查看整个集群的资源使用情况、应用程序状态（比如MapReduce作业）、队列信息等。
      若显示如下界面，表示Hadoop环境搭建完成。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002603198187.png "点击放大")
      
   
   5. 打开浏览器访问http://\<hadoop001 ECS公网IP\>:9870，访问NameNode的Web UI界面；输入http://\<hadoop003 ECS公网IP\>:9868，访问SecondaryNameNode的Web UI界面。 该界面提供了有关HDFS文件系统状态、集群健康状况、活动节点列表、NameNode日志等信息。
      显示如下界面，则表示Hadoop环境已搭建完成。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002605588137.png "点击放大")
      
   
   
   
   
 
 #### 相关操作
**修改配置文件，以便root用户可以启动Hadoop服务。**
1. 分别执行以下命令，编辑**start-dfs.sh** 和**stop-dfs.sh** 两个文件。
   ```
   vim /opt/hadoop/sbin/start-dfs.sh
   vim /opt/hadoop/sbin/stop-dfs.sh
   ```
   
2. 在文件中添加以下参数。
   ```
   HDFS_DATANODE_USER=root
   HADOOP_SECURE_DN_USER=hdfs
   HDFS_NAMENODE_USER=root
   HDFS_SECONDARYNAMENODE_USER=root
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002603318123.png "点击放大")
   
3. 分别执行以下命令，编辑**start-yarn.sh** 和**stop-yarn.sh** 两个文件。
   ```
   vim /opt/hadoop/sbin/start-yarn.sh
   vim /opt/hadoop/sbin/stop-yarn.sh
   ```
   
4. 在文件中添加以下参数。
   ```
   YARN_RESOURCEMANAGER_USER=root
   HADOOP_SECURE_DN_USER=yarn
   YARN_NODEMANAGER_USER=root
   ```
   
 
