Hadoop三种运行模式详解
Posted 做人要厚道2013
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop三种运行模式详解相关的知识,希望对你有一定的参考价值。
5.1 本地运行模式
本地运行模式不需要额外的设置. 只需要执行响应的jar包就可以了.
不需要任何的集群配置, 本地运行模式其实也是一种单节点模式.
Hadoop
提供了两个案例, 我们执行这两个案例.
5.1.1 官方 grep
案例
这个案例是提供一些文本文件, grep
可以从中找到想要匹配的文本(可以是正则表达式).
进入
Hadoop
的安装目录cd /opt/module/hadoop-2.7.2
在当前目录下创建目录
input
. 这个文件夹将来用来存放要统计的文本文件.mkdir input
把
etc/hadoop
下的所有xml
文件copy
到input
目录下. 这些xml
就是我们要统计的文本cp etc/hadoop/*.xml input
查看
input
文件中是否有文件.cd input ls
执行
share
目录下MapReduce
程序hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
进入
output
查看输出结果
5.1.2 官方wordcount
案例
这个案例用来统计文本中每个单词出现的次数.
统计结果按照单词在字典中的排序来输出.
输入数据仍然使用刚才的那些
xml
文件.执行程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount input out1
进入
out1
查看输出结果
注意:
- 如果出现执行失败的情况下, 请确认
jdk
和hadoop
环境变量是否配置成功.
5.2 伪分布运行模式
Hadoop
也可以以伪分布模式的方式运行在单节点上, 这个时候每一个Hadoop
守护进程都是一个单独的Java
进程.
这种模式需要进行相应的分布式设置, 但是又由于只有一个节点, 所以我们称之为伪分布模式.
由于Hadoop2.x
增加了Yarn
, 所以有两个选择: 可以把MapReduce
程序直接运行在HDFS
上, 也可以选择运行在Yarn
上
5.2.1 在HDFS
上运行MapReduce
程序
配置集群
在
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
目录
- 获取
配置
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>
配置
hdfs-site.xml
(hdfs
站点)<!-- 指定HDFS副本的数量 --> <property> <name>dfs.replication</name> <value>1</value> </property>
说明:
- 这里设置的副本的数量是指的将来在
HDFS
上存储的文件的副本. - 因为现在配置的是单节点伪分布模式, 所以把副本数量设置为
1
- 这里设置的副本的数量是指的将来在
启动集群
格式化
NameNode
.hdfs namenode -format
注意:
- 格式化的动作只需要执行一次即可. 以后再启动集群不需要重复执行这个动作.
- 多次格式化会出现异常, 务必不要多次格式化.
启动
namenode
hadoop-daemon.sh start namenode
启动
datanode
hadoop-daemon.sh start datanode
查看集群
查看
namenode
和datanode
是否启动成功jps
日志文件在
logs
目录下.如果启动失败可以在日志文件中查找失败的原因.使用
web
端查看hdfs
文件系统
web端地址是:
http://192.168.1.201:50070/注意:
- 地址其实就是
namenode
所在的主机的地址 50070
是web
端口. 和前面配置的9000
区别开来:9000
是datanode
与namenode
通讯时的端口.
- 地址其实就是
操作集群:在集群上运行wordcount
程序
在本地创建一个文件
words.txt
, 文件内容如下:(内容随意)hello world hello world atguigu hello I love atguigu hello world how are you
在
hdfs
系统的根目录下创建一个文件夹/input
.hdfs dfs -mkdir /input
把
words.txt
上传到hdfs
系统上的/input
目录下hdfs dfs -put words.txt /input
查看是否上传成功
- 方法1:
hdfs dfs -ls /input
- 方法2: 使用
web
端查看:http://hadoop201:50070
- 方法1:
在集群上运行
wordcount
程序hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output
查看输出结果
方法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
就可以了.
集群配置
在
etc/haddop/yarn-env.sh
上配置JAVA_HOME
(伪分布模式中不配置也可, 但是在全分布模式中就必须要配置了)export JAVA_HOME=/opt/module/jdk1.8.0_172
配置
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>
配置
/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>
启动
resourcemanager
yarn-daemon.sh start resourcemanager
启动
nodemanager
yarn-daemon.sh start nodemanager
集群操作
运行
MapReduce
程序:wordcount
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output2
查看执行结果
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
:远程同步工具,主要用于备份和镜像。
具有速度快、避免复制相同内容和支持符号链接的优点。
rsync
和scp
区别:用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
在当前用户的家目录下下创建一个目录
bin
测试
~/bin
有没有在path
路径中, 如果没有则添加到path
路径中.
在
~/bin
目录下创建文件my_rsync
, 并给改文件添加可执行权限
- 编辑
~/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 个服务器节点, 可以根据实际情况来合理每个服务器节点的功能.
安装如下意图来配置集群:
hadoop101 | hadoop102 | hadoop103 |
---|---|---|
HDFS | NameNode DataNode | DataNode |
YARN | NodeManager | ResourceManager NodeManager |
配置集群
配置
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>
配置
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>
配置
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>
配置
mapred-site.xml
如果没有这个文件就先复制:
mapred-site.xml.template
<!-- 指定MapReduce程序运行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
分别给 3 个
env
文件:hadoop-env.sh, yarn-env.sh, mapred-env.sh
配置JAVA_HOME
环境变量export JAVA_HOME=/opt/module/jdk1.8.0_172
把配置好的文件分发到集群其他节点(
hadoop202, hadoop203
)上my_rsync hadoop-2.7.2
注意:
copy
的过程中需要输入密码.
去其他节点查看文件分发情况.
集群单点启动
如果是集群第一次启动, 需要格式化
NameNode
hadoop namenode -format
在
hadoop201
上启动NameNode
hadoop-daemon.sh start datanode
分别在
hadoop201, hadoop202, hadoop203
上分别启动DateNode
hadoop-daemon.sh start datanode
在
hadoop203
上启动secondarynamenode
hadoop-daemon.sh start secondarynamenode
在
hadoop202
上启动resourcemanager
yarn-daemon.sh start resourcemanager
分别在
hadoop201, hadoop202, hadoop203
上启动nodemanager
yarn-daemon.sh start nodemanager
集群统一启动
上面单点启动方式最大的弊端就是需要到每个服务器节点上单独去启动, 非常的不方便.
如果能够在某一个服务器节点上启动, 则其他服务器节点上也能随着启动就好了.
如果想做到集群统一启动,我们需要先做 2 个配置:
SSH
无密登录etc/hadoop/slaves
文件配置上所有的服务器节点
SSH
无密登录
原理
生成秘钥和copy秘钥
hadoop201
可以免密登录到hadoop202, hadoop203
生成秘钥:
输入命令
ssh-keygen
, 然后连敲 3 次回车.
过程不要输入任何信息.
生成秘钥都存储在:~/.ssh
目录下:
copy
公钥到其他设备ssh-copy-id 主机
测试能否免密登录:
ssh hadoop202
配置etc/hadoop/slaves
vim etc/hadoop/slaves
分发到其他节点:
my_rsync hadoop-2.7.2
启动集群
有一点需要注意: 启动resourcemanager
, 必须去配置他的服务器上启动. 否则启动会失败.
所以, 对我们当前的配置来说, 最后去hadoop202
上启动所有的服务.
先在
生成秘钥, 然后分发给
hadoop202hadoop201, hadoop202, hadoop203
. 为了方便ssh
, 我们也给hadoop202
自己登录自己添加上免密登录.
统一启动
namenode, secondarynamenode,datanode
start-dfs.sh
这个命令可以做以下事情:
- 在配置的主机上启动
namenode
- 在配置的主机上启动
secondarynamenode
- 在每个
slave
主机上启动datanode
- 在配置的主机上启动
统一启动
resourcemanager, datamanager
start-yarn.sh
这个命令可以做如下事情:
如果当前主机配置了
resourcemanager
, 则在当前主机启动resourcemanager
. 否则就不启动resourcemanager
在每个
slave
主机上启动nodemanager
集群统一停止
stop-yarn.sh
停止resourcemanger和nodemanager
stop-dfs.sh
停止namendoe, secondarynamnode, datanode
以上是关于Hadoop三种运行模式详解的主要内容,如果未能解决你的问题,请参考以下文章