单机模式

Hadoop默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单Java进程,方便进行调试。

Prerequisites

  • Ubuntu 20.04
  • Java 8
  • SSH
    1. # 安装ssh
    2. $ sudo apt-get install openssh-server
    3. # 配置ssh key
    4. $ cd ~
    5. $ mkdir .ssh # 如果该文件存在则忽略此命令,不影响
    6. $ cd ~/.ssh
    7. $ ssh-keygen -t rsa
    8. $ cat id_rsa.pub >> authorized_keys

    Install Hadoop

    1. # 下载Hadoop软件压缩包
    2. $ cd ~/Desktop
    3. $ wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
    4. $ sudo tar -zxvf hadoop-3.3.1.tar.gz # 将软件压缩包解压到当前文件夹

    检测是否安装成功

    1. $ cd ~/Desktop/hadoop-3.3.1 # 进入hadoop文件目录
    2. # 查看hadoop版本,正确输出版本号则安装成功
    3. $ ./bin/hadoop version
    如果出现JAVA_HOME is not set and could not be found报错执行以下命令:
  1. 查找jdk包名:$ ls /usr/lib/jvm

image.png

  1. 打开.bashrc文件:$ vim ~/.bashrc
  2. 在打开文件的末尾追加以下几行内容

    1. export JAVA_HOME=/usr/lib/jvm/<此处填写第一步找到的jdk包名>
    2. export JRE_HOME=${JAVA_HOME}/jre
    3. export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    4. export PATH=${JAVA_HOME}/bin:$PATH

    image.png

  3. 保存并退出,输入source ~/.bashrc更新即可。重新检测hadoop是否安装成功。

image.png

运行示例

  • hadoop单机模式提供了很多例子供我们尝试

    1. # 输入如下命令会显示hadoop自带的各种例子
    2. $ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar
  • wordcount例子演示

    1. $ cd ~/Desktop/hadoop-3.3.1 # 进入hadoop文件目录下
    2. $ mkdir input # 创建input文件夹保存需要传入Hadoop中处理的数据
    3. $ cp etc/hadoop/*.xml input # 将文件拷贝到input文件夹中,也可以自己生成一些文本文件
    4. $ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount input output # 运行Hadoop处理input中的数据
    5. $ ls output # output文件夹下可以看到运行结果情况
    6. $ cat output/part-r-00000 # 查看运行结果

    伪分布式模式

    Hadoop可以在单个主机上以伪分布式的方式运行,Hadoop进程以分离的Java进程来运行,该主机既作为NameNode也作为DataNode。同时,Hadoop系统现在读取的是HDFS中的文件。
    注意:伪分布式模式是在单机模式基础上进行开发,单机模式必须安装测试成功后才能进行伪分布式模式配置。

    配置步骤(在hadoop-3.3.1文件目录下运行)

  1. 修改配置文件etc/hadoop/core-site.xml, 用于设置HDFS访问路径

    1. <configuration>
    2. <property>
    3. <name>fs.defaultFS</name>
    4. <value>hdfs://localhost:9000</value>
    5. </property>
    6. </configuration>
  2. 修改配置文件etc/hadoop/hdfs-site.xml

    1. <configuration>
    2. <property>
    3. <name>dfs.replication</name>
    4. <value>1</value>
    5. </property>
    6. <property>
    7. <name>dfs.namenode.name.dir</name>
    8. <value>file:Your_Hadoop_Folder_Dir/tmp/dfs/name</value>
    9. </property>
    10. <property>
    11. <name>dfs.datanode.data.dir</name>
    12. <value>file:Your_Hadoop_Folder_Dir/tmp/dfs/data</value>
    13. </property>
    14. </configuration>
  3. 修改配置文件etc/hadoop/hadoop-env.sh

    1. export JAVA_HOME=/usr/lib/jvm/<你电脑上所安装的jdk包名>
    2. # 如果不知道包名可通过 ls /usr/lib/jvm 查看
  4. 启动Hadoop

    1. $ bin/hdfs namenode -format # namenode格式化
    2. $ sbin/start-dfs.sh # 开启守护进行
    3. # 判断是否启动成功。若成功启动则会列出如下进程: NameNode、DataNode和SecondaryNameNode。
    4. $ jps

    image.png

  5. 此时打开Ubuntu自带浏览器,输入URLhttp://localhost:9870可以查看NameNode,DataNode信息,还可以在线查看HDFS中的文件。

image.png

运行示例

  1. 创建当前用户的HDFS目录

    1. $ bin/hdfs dfs -mkdir /user
    2. $ bin/hdfs dfs -mkdir /user/<your_username>
  2. 在HDFS中创建input文件夹并上传数据

    1. $ bin/hdfs dfs -mkdir input
    2. $ bin/hdfs dfs -put etc/hadoop/*.xml input
  3. 运行wordcount程序

    1. $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount input output
  4. 在HDFS中查看运行结果或将结果拷贝至本地

    1. # 在HDFS中查看运行结果
    2. $ bin/hdfs dfs -cat output/*
    3. # 将运行结果拷贝至本地查看
    4. $ bin/hdfs dfs -get output output
    5. $ cat output/*

    image.png

  5. 运行结束终止进程

    1. $ sbin/stop-dfs.sh

    分布式模式

    使用多台机器构成集群环境来运行Hadoop。

    Prerequisites

  • 你已经在单个节点上成功安装启动单机模式下和伪分布式模式下的Hadoop
  • 选定三个节点作为集群环境: 一个作为master节点, 另两个作为slave节点
  • 每个节点系统配置与单机版相同

    安装整体流程

  1. 选定master节点, 在master节点上安装Hadoop, java环境, SSH, 并修改Hadoop配置信息
  2. 在其他slave节点上安装java环境, SSH
  3. 将master节点上的hadoop文件夹复制到其他slave节点上
  4. 在master节点上启动Hadoop, 查看运行状态

    网络配置

  • 因为我们是虚拟机安装的系统, 所以需要更改网络连接方式为桥接(Bridge)模式, 才能实现多个节点互联
  • 确保各个节点的MAC地址不同 (可以点右边的按钮随机生成 MAC 地址,否则 IP 会冲突)

image.png

  • Linux查看节点IP地址的命令为ifconfighostname -I, 即下图所示的inet地址

image.png

  • 为了便于区分每个节点, 我们可以修改各个节点上的主机名, 以方便区分
    • 执行命令sudo vim /etc/hostname修改主机名
    • 修改hostname中的配置信息, 更换为你想换成的节点名称即可
    • 执行命令sudo vim /etc/hosts修改自己所用节点的IP映射
    • 重启系统

image.png

  • 如上所述是单个结点的网络配置, 我们还需要再其他所有节点上完成类似修改
  • 配置成功检验方法: 在各个ping其他节点, 如果ping的通, 说明配置成功

    1. $ ping master -c 5 # -c指定ping的次数
    2. $ ping slave1 -c 5

    注意: 网络配置成功后, 每次关闭虚拟机不要选择直接关闭, 选择保存当前状态关闭, 不然下次重新打开可能会更换IP, 所有网络配置都需要重新进行!
    image.png

    SSH无密码登录节点

    这个操作是要让master节点可以无密码SSH登录到各个slave节点上

  • 首先生成master节点的公钥 (因为改过主机名, 所以还需要删除原有的再重新生成一次), 在master节点上执行如下操作

    1. $ cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost
    2. $ rm ./id_rsa* # 删除之前生成的公匙(如果有)
    3. $ ssh-keygen -t rsa # 一直按回车就可以
  • 让master节点能无密码SSH本机, 在master节点上执行:

    1. $ cat ./id_rsa.pub >> ./authorized_keys
  • 完成后可以尝试ssh master验证一下 (成功后执行exit返回原来的终端), 接着在master节点上将公钥传输到各个slave节点

    1. $ scp ~/.ssh/id_rsa.pub root@slave1:/home/fudan/

    image.png

  • 接着在各个slave节点上将ssh公钥加入授权

    1. $ mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略
    2. $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    3. $ rm ~/id_rsa.pub # 用完就可以删掉了
  • 在master节点上验证是否可以无密码ssh到各个slave节点

    1. $ ssh slave1
    2. $ ssh slave2

    配置集群环境

    概述

  • 配置集群环境只需要在master节点中修改即可, 修改完之后复制hadoop文件夹到各个slave节点。

  • 配置集群环境需要修改hadoop目录下etc/hadoop下的5个配置文件, 本文仅设置正常启动所必须的设置项, 更多设置可点击查看官方说明
  • 配置好master节点的hadoop配置后, 删除hadoop文件夹中的tmp文件夹和logs文件夹(如果存在), 打包hadoop文件夹分发至slave节点上

    master节点配置文件修改

  1. workers文件: 将DataNode的主机名写入该文件, 每行一个

    1. slave1
    2. slave2
  2. core-site.xml文件: 修改HDFS访问URL

    1. <configuration>
    2. <property>
    3. <name>hadoop.tmp.dir</name>
    4. <value>Your_Hadoop_Folder_Dir/tmp</value>
    5. </property>
    6. <property>
    7. <name>fs.defaultFS</name>
    8. <value>hdfs://master:9000</value>
    9. </property>
    10. </configuration>
  3. hdfs-site.xml文件: 修改replication, secondary namenode URL, datanode和namenode数据存储路径

    1. <configuration>
    2. <property>
    3. <name>dfs.namenode.secondary.http-address</name>
    4. <value>master:50090</value>
    5. </property>
    6. <property>
    7. <name>dfs.replication</name>
    8. <value>2</value>
    9. </property>
    10. <property>
    11. <name>dfs.namenode.name.dir</name>
    12. <value>file:Your_Hadoop_Folder_Dir/tmp/dfs/name</value>
    13. </property>
    14. <property>
    15. <name>dfs.datanode.data.dir</name>
    16. <value>file:Your_Hadoop_Folder_Dir/tmp/dfs/data</value>
    17. </property>
    18. </configuration>
  4. mapred-site.xml: 配置MapReduce执行框架, JobHistory信息

    1. <configuration>
    2. <property>
    3. <name>mapreduce.framework.name</name>
    4. <value>yarn</value>
    5. </property>
    6. <property>
    7. <name>mapreduce.jobhistory.address</name>
    8. <value>master:10020</value>
    9. </property>
    10. <property>
    11. <name>mapreduce.jobhistory.webapp.address</name>
    12. <value>master:19888</value>
    13. </property>
    14. </configuration>
  5. yarn-site.xml: 配置yarn框架ResourceManager和NodeManager

    1. <configuration>
    2. <property>
    3. <name>yarn.resourcemanager.hostname</name>
    4. <value>master</value>
    5. </property>
    6. <property>
    7. <name>yarn.nodemanager.aux-services</name>
    8. <value>mapreduce_shuffle</value>
    9. </property>
    10. </configuration>

    处理打包并分发到slave节点

  6. 删除hadoop文件夹目录下的logs文件夹和tmp文件夹(如果有)

    1. sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
    2. sudo rm -r ./hadoop/logs/* # 删除日志文件
  7. 执行namenode的格式化

    1. $ ./bin/hdfs namenode -format
  8. 打包hadoop文件夹并分发

    1. 在master节点下打包
      1. $ tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制
      2. $ scp ./hadoop.master.tar.gz slave1:/home/fudan/Desktop
      3. $ scp ./hadoop.master.tar.gz slave2:/home/fudan/Desktop
      b. 在slave节点下解压
      1. sudo rm -r /home/fudan/Desktop/hadoop # 删掉旧的(如果存在)
      2. sudo tar -zxf ~/hadoop.master.tar.gz

      启动Hadoop集群

  • 在master节点上启动Hadoop即可

    1. $ ./sbin/start-dfs.sh
    2. $ ./sbin/start-yarn.sh
    3. $ ./sbin/mr-jobhistory-daemon.sh start historyserver
  • 通过jps查看各个节点所启动的进程

master节点:
image.png
slave1节点
image.png
slave2节点
image.png

  • 在master节点通过./bin/hdfs dfsadmin -report查看DataNode是否启动正常

image.png

  • 如果遇到namenode无法正常启动, 可以通过如下方法排查:
    • 删除hadoop目录下的tmp文件夹和logs文件夹, 重启程序
    • 查看logs文件夹下的相应节点日志信息, 排查错误

      关闭Hadoop集群

      1. $ ./sbin/stop-dfs.sh
      2. $ ./sbin/stop-yarn.sh
      3. $ ./sbin/mr-jobhistory-daemon.sh stop historyserver