Hadoop三种运行模式详解

Posted 做人要厚道2013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop三种运行模式详解相关的知识,希望对你有一定的参考价值。

5.1 本地运行模式

本地运行模式不需要额外的设置. 只需要执行响应的jar包就可以了.

不需要任何的集群配置, 本地运行模式其实也是一种单节点模式.

Hadoop提供了两个案例, 我们执行这两个案例.


5.1.1 官方 grep 案例

这个案例是提供一些文本文件, grep可以从中找到想要匹配的文本(可以是正则表达式).

  1. 进入Hadoop的安装目录

    cd /opt/module/hadoop-2.7.2

  2. 在当前目录下创建目录input. 这个文件夹将来用来存放要统计的文本文件.

    mkdir input
  3. etc/hadoop下的所有xml文件copyinput目录下. 这些xml就是我们要统计的文本

    cp etc/hadoop/*.xml input

  4. 查看input文件中是否有文件.

    cd input
    ls

  5. 执行share目录下MapReduce程序

    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+' 

  6. 进入output查看输出结果



5.1.2 官方wordcount案例

这个案例用来统计文本中每个单词出现的次数.

统计结果按照单词在字典中的排序来输出.

  1. 输入数据仍然使用刚才的那些xml文件.

  2. 执行程序

    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount input out1

  3. 进入out1查看输出结果


注意:

  • 如果出现执行失败的情况下, 请确认jdkhadoop环境变量是否配置成功.

5.2 伪分布运行模式

Hadoop也可以以伪分布模式的方式运行在单节点上, 这个时候每一个Hadoop守护进程都是一个单独的Java进程.

这种模式需要进行相应的分布式设置, 但是又由于只有一个节点, 所以我们称之为伪分布模式.

由于Hadoop2.x增加了Yarn, 所以有两个选择: 可以把MapReduce程序直接运行在HDFS上, 也可以选择运行在Yarn


5.2.1 在HDFS上运行MapReduce程序

配置集群

  1. etc/hadoop/hadoop-env.sh中配置JAVA_HOME变量

    • 获取jdk安装路径: echo $JAVA_HOME
    • etc/hadoop/hadoop-env.sh中添加一行代码:
      export JAVA_HOME=/opt/module/jdk1.8.0_172

    注意:

    • Hadoop下的etc目录, 不是根目录下的etc目录
  2. 配置core-site.xml (核心站点)

    <!-- 指定HDFS中NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <!-- 地址要根据自己实际情况来写. 具体的ip地址也是可以的 -->
        <value>hdfs://hadoop201:9000</value>
    </property>
    <!-- 指定hadoop运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
  3. 配置hdfs-site.xml(hdfs站点)

    <!-- 指定HDFS副本的数量 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

    说明:

    • 这里设置的副本的数量是指的将来在HDFS上存储的文件的副本.
    • 因为现在配置的是单节点伪分布模式, 所以把副本数量设置为 1

启动集群

  1. 格式化 NameNode.

    hdfs namenode -format

    注意:

    • 格式化的动作只需要执行一次即可. 以后再启动集群不需要重复执行这个动作.
    • 多次格式化会出现异常, 务必不要多次格式化.
  2. 启动 namenode

    hadoop-daemon.sh start namenode
  3. 启动 datanode

    hadoop-daemon.sh start datanode

查看集群

  1. 查看namenodedatanode是否启动成功

    jps

  2. 日志文件在logs目录下.如果启动失败可以在日志文件中查找失败的原因.

  3. 使用web端查看hdfs文件系统
    web端地址是:
    http://192.168.1.201:50070/

    注意:

    • 地址其实就是namenode所在的主机的地址
    • 50070web端口. 和前面配置的9000区别开来: 9000datanodenamenode通讯时的端口.

操作集群:在集群上运行wordcount程序

  1. 在本地创建一个文件words.txt, 文件内容如下:(内容随意)

    hello world hello world
    atguigu
    hello
    I love atguigu
    hello world
    how are you
  2. hdfs系统的根目录下创建一个文件夹/input.

    hdfs dfs -mkdir /input
  3. words.txt上传到hdfs系统上的/input目录下

    hdfs dfs -put words.txt /input
  4. 查看是否上传成功

    • 方法1: hdfs dfs -ls /input
    • 方法2: 使用web端查看: http://hadoop201:50070


  5. 在集群上运行wordcount程序

    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output

  6. 查看输出结果

    • 方法1: 直接在hdfs系统上查看

      hdfs dfs -cat /output/part-r-00000

    • 方法2: 把输出结果下载到本地之后查看

      hdfs dfs -get /output ./


5.2.1 在Yarn上运行MapReduce程序

Hadoop2.x增加了组件Yarn, 我们也可以把我们的MapReduce程序在Yarn上执行.

而且, 以后也确实应该这么做.

关于Yarn具体作用我们在后面的课程中会详细讲解.

在前面配置的基础上, 配置Yarn就可以了.

集群配置

  1. etc/haddop/yarn-env.sh上配置JAVA_HOME (伪分布模式中不配置也可, 但是在全分布模式中就必须要配置了)

    export JAVA_HOME=/opt/module/jdk1.8.0_172
  2. 配置yarn-site.xml

    <!-- reducer获取数据的方式 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定YARN的ResourceManager的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <!-- 主机地址要根据实际情况来定 -->
        <value>hadoop201</value>
    </property>
  3. 配置/etc/hadoop/mapred-site.xml

    • 复制出来一个/etc/hadoop/mapred-site.xml

      cp mapred-site.xml.template mapred-site.xml
    • 配置/etc/hadoop/mapred-site.xml

      <!-- 指定MapReduce程序运行在yarn上 -->
      <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
      </property>
  4. 启动resourcemanager

    yarn-daemon.sh start resourcemanager

  5. 启动nodemanager

    yarn-daemon.sh start nodemanager 

集群操作

  1. 查看Yarn: http://192.168.1.201:8088/cluster

  2. 运行MapReduce程序:wordcount

    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output2
  3. 查看执行结果


5.3 完全分布式运行模式

前面学习的本地运行模式和伪分布运行模式, 本质上来说都是一种单节点运行模式.

他们在实际生产环境中没有用处.

但是在开发调试阶段这种单节点运行模式则特别的有用.

在后面开发MapReduce程序时再来体会.

在实际生产环境中, 节点的数量可以很多, 这种运行模式才是完全分布式运行模式.

我们以3个节点为例, 来搭建完全分布模式的运行环境.


5.3.1 虚拟机准备

准备 3 个虚拟机. 假设他们的地址分别是:

192.168.1.201
192.168.1.202
192.168.1.203

并在/etc/hosts文件中做域名映射:

192.168.1.201 hadoop201
192.168.1.202 hadoop202
192.168.1.203 hadoop203

5.3.2 编写集群分发脚本

在集群中, 一般情况下每个节点的配置都是一样的, 所以一般会在一个节点配置完成后, 然后再分发到其他节点上.

所以, 我们可以自己写一个这样的集群分发脚本来完成这个工作.

假设我们的配置是先在hadoop201上配置完成, 然后再分发到其他节点上: hadoop202, hadoop203

scp(安全拷贝 secure copy)

和以前学习的cp命令差不多, 只是cp是同一台主机内部文件或目录的copy

scp可以跨主机进行copy



rsync

rsync:远程同步工具,主要用于备份和镜像。

具有速度快、避免复制相同内容和支持符号链接的优点。

rsyncscp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。

rsync -rvl test hadoop202:~

选项:
r: 递归
v: 显示复制过程
l: copy符号链接(软链接)


集群分发脚本

循环复制指定目录下的所有目录和文件到其他主机的相同位置.

目标主机和当前主机有相同的目录借结构.

原始copy

假设原始功能: 向两台主机进行分发内容

rsync /opt/module hadoop202:/opt/
rsync /opt/module hadoop203:/opt/

自定义脚本

执行下面的脚本: my_rsync, 可以达到与上面同样的功能.
并且脚本可以在任意的地方直接执行.

my_rsync /opt/module
  1. 在当前用户的家目录下下创建一个目录bin

  2. 测试~/bin有没有在path路径中, 如果没有则添加到path路径中.

  3. ~/bin目录下创建文件my_rsync, 并给改文件添加可执行权限

  4. 编辑~/bin/my_rsync脚本
#!/bin/bash
#1. 获取参数个数
argscount=$#
if [ $argscount == 0 ]
then
echo 没有参数,输入你想要copy的目录或文件, 然后重试
exit
fi
#2. 获取目录或者文件名称
p1=$1
fileName=$(basename $p1)
echo fileName=$fileName
#3. 获取上级目录的绝对路径
fileDir=$(cd -P $(dirname $p1);pwd)
echo fileDir=$fileDir
#4. 获取当前用户名
user=$(whoami)
echo user=$user
#5. 循环同步copy文件
for((host=202;host<204;host++))
do
echo --------开始向主机:hadoop$host copy 文件--------
rsync -rvl $p1 $user@hadoop$host:$fileDir
echo --------结束向主机:hadoop$host copy 文件--------
done

5.3.3 集群配置

集群规划部署

现在我们有 3 个服务器节点, 可以根据实际情况来合理每个服务器节点的功能.

安装如下意图来配置集群:

hadoop101hadoop102hadoop103
HDFSNameNode DataNodeDataNode
YARNNodeManagerResourceManager NodeManager

配置集群

  1. 配置etc/hadoop/core-site.xml

    <!-- 指定HDFS中NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <!-- 地址要根据自己实际情况来写. 具体的ip地址也是可以的 -->
        <value>hdfs://hadoop201:9000</value>
    </property>
    <!-- 指定hadoop运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
  2. 配置hdfs-site.xml

    <property>
        <name>dfs.replication</name>
        <!--副本的个数设置 3 -->
        <value>3</value>
    </property>
    
    <!--设置SecondaryNameNode的地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop203:50090</value>
    </property>
  3. 配置yarn-site.xml

    <!-- reducer获取数据的方式 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定YARN的ResourceManager的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop102</value>
    </property>
  4. 配置mapred-site.xml

    如果没有这个文件就先复制:mapred-site.xml.template

    <!-- 指定MapReduce程序运行在yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
  5. 分别给 3 个env文件:hadoop-env.sh, yarn-env.sh, mapred-env.sh配置JAVA_HOME环境变量

    export JAVA_HOME=/opt/module/jdk1.8.0_172
  6. 把配置好的文件分发到集群其他节点(hadoop202, hadoop203)上

    my_rsync hadoop-2.7.2

    注意:

    • copy的过程中需要输入密码.
  7. 去其他节点查看文件分发情况.


集群单点启动

  1. 如果是集群第一次启动, 需要格式化NameNode

    hadoop namenode -format
  2. hadoop201上启动NameNode

    hadoop-daemon.sh start datanode

  3. 分别在hadoop201, hadoop202, hadoop203上分别启动DateNode

    hadoop-daemon.sh start datanode
  4. hadoop203上启动secondarynamenode

    hadoop-daemon.sh start secondarynamenode

  5. hadoop202上启动resourcemanager

    yarn-daemon.sh start resourcemanager

  6. 分别在hadoop201, hadoop202, hadoop203上启动nodemanager

    yarn-daemon.sh start nodemanager


集群统一启动

上面单点启动方式最大的弊端就是需要到每个服务器节点上单独去启动, 非常的不方便.

如果能够在某一个服务器节点上启动, 则其他服务器节点上也能随着启动就好了.

如果想做到集群统一启动,我们需要先做 2 个配置:

  • SSH无密登录

  • etc/hadoop/slaves文件配置上所有的服务器节点

SSH无密登录

原理

生成秘钥和copy秘钥

hadoop201可以免密登录到hadoop202, hadoop203

  1. 生成秘钥:

    输入命令ssh-keygen, 然后连敲 3 次回车.
    过程不要输入任何信息.

    生成秘钥都存储在:~/.ssh目录下:

  2. copy公钥到其他设备

    ssh-copy-id 主机

  3. 测试能否免密登录:

    ssh hadoop202


配置etc/hadoop/slaves

vim etc/hadoop/slaves

分发到其他节点:

my_rsync hadoop-2.7.2

启动集群

有一点需要注意: 启动resourcemanager, 必须去配置他的服务器上启动. 否则启动会失败.

所以, 对我们当前的配置来说, 最后去hadoop202上启动所有的服务.

先在
hadoop202
生成秘钥, 然后分发给hadoop201, hadoop202, hadoop203. 为了方便ssh, 我们也给hadoop202自己登录自己添加上免密登录.

  1. 统一启动namenode, secondarynamenode,datanode

    start-dfs.sh

    这个命令可以做以下事情:

    1. 在配置的主机上启动namenode
    2. 在配置的主机上启动secondarynamenode
    3. 在每个slave主机上启动datanode
  2. 统一启动resourcemanager, datamanager

    start-yarn.sh

    这个命令可以做如下事情:

    1. 如果当前主机配置了resourcemanager, 则在当前主机启动resourcemanager. 否则就不启动resourcemanager

    2. 在每个slave主机上启动nodemanager


集群统一停止

  1. stop-yarn.sh
    停止resourcemanger和nodemanager

  2. stop-dfs.sh
    停止namendoe, secondarynamnode, datanode

以上是关于Hadoop三种运行模式详解的主要内容,如果未能解决你的问题,请参考以下文章

求:hadoop三种运行模式的书面解释,急!!

大数据 hadoop 三种运行模式的区别、及详细配置讲解

ubuntu上Hadoop三种运行模式的部署

Hadoop可以运行的模式

Hadoop—— Hadoop运行模式

Hadoop学习 Hadoop配置文件参数详解