|
1.5 Hadoop初体验; g+ l3 i/ P" g: X5 Z/ t
一般而言, 我们想要深入学习一个新的系统时, 首先要尝试使用该系统, 了解系统对外提供的功能, 然后再通过某个功能逐步深2 f' l7 v6 @/ y0 [- g3 T5 P; `
入其实现细节。 本节将介绍如何在 伪分布式工作模式 [4] 下使用Hadoop, 包括搭建Hadoop环境、 访问HDFS以及向YARN提交应用程序4 h" V& r- p# y% u2 M' L
等最基本的操作。 本节只是有代表性地介绍Hadoop的一些基本使用方法, 使读者对Hadoop有一个初步认识, 并引导读者逐步进行更全
* c( C/ d! i5 v/ |) o! e+ I面的学习。
: E/ \) C7 ~( Y" @: l, V) i+ z1.5.1 搭建Hadoop环境2 U/ t0 m8 p9 Y1 ?0 `: Y
本小节仅介绍单机环境的搭建方法, 更加完整的Hadoop安装步骤和配置方法可参考本书最后的附录A和附录B。 另外, 需要注意" \: D1 Q9 M7 g0 j+ g5 [- k
的是, 由于不同用户拥有的Linux环境不尽相同( 比如已经安装的软件不同、 统一软件的版本不同等) , 每个人安装Hadoop过程中遇到2 g% K* U! @' ~4 L3 s1 i" i
的问题可能不同, 此时需要根据具体的日志提示解决问题。 本小节仅给出一般情况下, Hadoop 2.0的安装步骤。
. O& j& O. |: X' r7 U! B. ^# v步骤1 修改Hadoop配置文件。% A4 C9 i! h) z* e
1) 设置环境变量。 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中, 添加JAVA安装目录, 命令如下:
! h: n; c( _( k; q* ?export JAVA_HOME=/usrb/jvm/java-6-openjdk+ h d% T8 M- i. {2 s4 k
修改conf目录下的mapred-site.xml、 core-site.xml、 yarn-site.xml和hdfs-site.xml四个文件, 在<configuration>与</configuration>之间添加的内
4 Z/ y. D6 S- O5 \& f" U* a7 t容见下面的介绍。
" _+ G1 P2 ]7 G8 n' b6 a3 e" |% y+ y2) 在${HADOOP_HOME}/etc/hadoop/下, 将mapred-site.xml.templat重命名成mapred-site.xml, 并添加以下内容:
5 M/ z8 G, w* Z<property>$ `0 H& q- ]; D6 J
<name>mapreduce.framework.name</name>
# G; Y4 {7 l) { {1 C* a) g7 d<value>yarn</value>/ L3 o, Y. d$ A
</property>8 ~. ~( ]! c" H2 V" _
【 解释】 相比于Hadoop1.0, 用户无须再配置mapred.job.tracker, 这是因为JobTracker相关实现已变成客户端的一个库( 实际上在
, r% Q; p& d) @5 ~+ w! m) y5 }Hadoop 2.0中, JobTracker已经不存在, 它的功能由另外一个称为MRAppMaster的组件实现) , 它可能被随机调度到任何一个slave上," F1 Q& L+ Y; j8 }
也就是它的位置是动态生成的。 需要注意的是, 在该配置文件中需用mapreduce.framework.name指定采用的运行时框架的名称, 在此指
2 e5 G p) h, v( h定"yarn"。9 N- d3 r2 E1 {( M7 B" a1 P( ?) c
3) 在${HADOOP_HOME}/etc/hadoop/中, 修改core-site.xml, 为了简单, 我们仍采用Hadoop 1.0中的HDFS工作模式( 不配置HDFS
, {( d' a8 M6 E \: D& z; M* XFederation) , 修改后如下:( R/ L- b# L. [' R* J4 y
<property>: \* V# T3 v; o+ N' O y" L
<name>fs.default.name</name>
9 e3 E9 F" A9 C, `4 o<value>hdfs://YARN001:8020</value>
) Y( k1 ^! d% {+ h2 a, C</property>. R/ I) d' U1 h, R9 j7 r3 z- t
其中, YARN001表示节点的IP或者host。
, @: |2 _8 y( o% r4) 在${HADOOP_HOME}/etc/hadoop/中, 修改yarn-site.xml, 修改后如下:
6 E* W0 Y" A+ Y: @<property>5 y4 A" C* p; o0 K" T0 C% M4 Z
<name>yarn.nodemanager.aux-services</name>9 f/ ]( N0 c3 ^2 G1 o9 [
<value>mapreduce-shuffle</value>. l& j1 U7 e- h v
</property>
- R, A, E: w- f& B# i6 ]【 解释】 为了能够运行MapReduce程序, 需要让各个NodeManager在启动时加载shuffle server, shuffle server实际上是Jetty/Netty
% F/ |& [( W/ U8 @1 y7 i$ U" `Server, Reduce Task通过该server从各个NodeManager上远程复制Map Task产生的中间结果。 上面增加的两个配置均用于指定shuffle
: _; I- Z* k2 Y3 J9 e5 Rserver。
9 }" T) J# r% s, v+ }5) 修改${HADCOP_HOME}/etc/hadoop中的hdfs-site.xml文件:0 D# y+ O. `% a% Z
<property>
; ]# ], `! Y9 |$ K" W- H<name>dfs.replication</name>+ F2 v& v; a$ x' d9 l
<value>1</value>9 X: Z) K: q0 E- _5 E' Y
</property>
& y( B& K$ R. p0 c9 q【解释】 默认情况下, HDFS数据块副本数是3, 而在集群规模小于3的集群中该参数会导致出现错误, 这可通过将dfs.replication调$ u/ f k4 j2 V' d+ h% O1 f
整为1解决。( W8 v# k$ u9 {! n7 z( ]
注意 如果你是在虚拟机中搭建Hadoop环境, 且虚拟机经常关闭与重启, 为了避免每次重新虚拟机后启动Hadoop时出现各种问
* h8 ^: v1 V: a+ j题, 建议在core-site.xml中将hadoop.tmp.dir属性设置为一个非/tmp目录, 比如/data或者/home/dongxicheng/data( 注意该目录对当前用户需具
$ G! ]. S4 y+ n, q+ T9 e. B( H1 _0 i有读写权限) 。
/ l+ J& m" L% ]3 b- d1 _% A0 `步骤2 设置免密码登录。 e# n0 j& M7 `: c8 O) v5 Z- W
前面提到Hadoop启动/停止脚本需要通过SSH发送命令启动相关守护进程, 为了避免每次启动/停止Hadoop都要输入密码进行验
! r5 Y* t( x0 a; Z2 m9 N+ w# o3 ~: d证, 需设置免密码登录, 步骤如下。: a* p' ~) f1 J4 Z* m
1) 打开命令行终端, 输入以下命令:+ [9 F+ M0 D) b% I% W
ssh-keygen -t rsa, x0 I1 n' D4 i8 J) z# }- X
将会在"~/.ssh/"目录下生成公钥文件id_rsa.pub和私钥文件id_rsa。9 r) L( k& K* k# v+ l/ W, O
2) 将公钥文件id_rsa.pub中的内容复制到相同目录下的authorized_keys文件中:
9 w& o2 a, q) [! W; X3 ecd ~/.ssh/
6 H! U" |/ \; [9 fcat id_rsa.pub >> authorized_keys- Q- \+ e- K0 s, {% E
步骤3 启动Hadoop。9 J a5 a% N% e: z9 M+ F( N
在Hadoop安装目录中, 按以下三步操作启动Hadoop, 我们单步启动每一个服务, 以便于排查错误, 如果某一个服务没有启动成& {( y$ ?3 ]0 \' m. u( i2 ]. ^
功, 可查看对应的日志查看启动失败原因。: k2 b4 I n7 ^' n
1) 格式化HDFS, 命令如下:. G7 @& U# k; Z* b* K9 M( P
bin/hadoop namenode -format5 B1 e3 X- A- e( o$ v0 Z
2) 启动HDFS。 你可以使用以下命令分别启动NameNode和DataNode:1 E# Y1 X, _+ ~+ y6 O N! Z- _
sbin/hadoop-daemon.sh start namenode, |& Q$ M O7 ?+ d4 R
sbin/hadoop-daemon.sh start datanode) \' q* [# y5 U; _! {/ t m! n% t) `
如果有多个DataNode, 可使用hadoop-daemons.sh启动所有DataNode, 具体命令如下:
, S% y' `$ {2 Zsbin/hadoop-daemons.sh start datanode
; N- o! u: ~! ~. f你也可以使用以下命令一次性启动NameNode和所有DataNode:# S; f8 Z- f+ S( V' `
sbin/ start-dfs.sh- s% C- B: z6 C7 v1 O5 g+ X( M: @ ]8 U
3) 启动YARN。 你可以使用以下命令分别启动ResourceManager和NodeManager:
! D7 W- [8 d5 t$ N7 isbin/hadoop-daemon.sh start namenode4 t6 n' N' c- o& I
sbin/hadoop-daemon.sh start datanode9 `3 ^' |3 D, E; \6 L1 `
如果有多个NodeManager, 可使用yarn-daemon.sh启动所有NodeManager, 具体命令如下:2 s3 ]$ @) V( _$ M9 m$ y# w3 `
sbin/yarn-daemon.sh start nodemanager/ p0 [7 L s* p( S4 b
你也可以使用以下命令一次性启动ResourceManager和所有NodeManager:
7 c; R# L \. f* P- ^: [( xsbin/start-yarn.sh1 Y: R1 C/ o% c
通过如下jps命令查看是否启动成功:
5 E5 G4 W0 ]& s) Q2 Ldong@YARN001:/opt/hadoop/hadoop-2.0$ jps
9 C0 b5 A) N1 Y1 a+ j/ L3 t" u27577 NameNode
8 y, p8 R2 V' n5 X8 q30315 ResourceManager
9 r' p- I3 b2 M" U/ ^* Q27924 SecondaryNameNode$ E! ^: a M; v, q: Z; X+ d
16803 NodeManager
9 ]* r& R- M+ u. H通过以下URL可查看YARN是否启动成功:
. f2 C# M8 B( N$ m( j7 D! ghttp://YARN001:8080/3 ]8 A5 Z6 E: F
YARN对外提供的Web运行界面如图1-10所示。
! M$ g7 t5 _- d( n7 y; m图1-10 YARN对外提供的Web界面
8 n" r2 p$ B3 L* D如果安装过程中出现问题, 可通过查看日志发现问题所在。 Hadoop日志存放在$HADOOP_HOME/logs目录下的以".log"结尾的文件6 d7 D- ?) q7 I( q
中, 比如yarn-dongxicheng-resourcemanager-yarn001.log就是ResourceManager产生的日志。
' \% ]/ x6 \$ o7 p6 U% L$ y5 ?经过以上三步操作, Hadoop成功启动后, 接下来可以通过Hadoop Shell或者Eclipse插件访问HDFS和提交MapReduce作业。 下面两小
: z/ z' |4 |) W6 B K8 h1 C% Z: g+ k节分别介绍Hadoop Shell和Eclipse插件使用方法。% k" C; }" C" p5 Z! c7 q
1.5.2 Hadoop Shell介绍
! Z2 I/ E4 D6 a在1.4节我们曾提到, bin目录下是最基础的集群管理脚本, 用户可以通过该脚本完成各种功能, 如HDFS文件管理、 MapReduce作
2 K0 ?8 s- f% h4 G" ~" R* j; R业管理等, 更加详细的脚本使用说明, 可参考附录C。* f W D; K3 D8 H! [- H+ K; `+ y
作为入门, 本节介绍的是bin目录下Hadoop脚本的使用方法。 如果你已经对Hadoop 1.0有所了解( 比如尝试安装和使用过Hadoop
/ ^/ N4 x5 a( J% s' m0 m8 f1.0) , 那么可直接使用该脚本, 因为该脚本的功能与Hadoop 1.0对应的Hadoop脚本功能完全一致。, S1 Z3 T" s. d8 f
该脚本的使用方法为:5 a3 s& a$ i8 P" T% J; {
hadoop [--config confdir] COMMAND
! k. y' `2 h# W5 ]8 Q2 @6 k* V其中, --config用于设置Hadoop配置文件目录。 默认目录为${HADOOP_HOME}/conf。 而COMMAND是具体的某个命令, 常用的) M6 L# J3 @/ s5 M" K- ?
有HDFS管理命令fs、 作业管理命令job和作业提交命令jar等, 它们的使用方法如下。
l. |- t7 z: Q( 1) HDFS管理命令fs和作业管理命令job
; z# a. m$ z$ a4 c, S它们的用法一样, 均为:/ k. E- `0 T% |3 x
bin/hadoop command [genericOptions] [commandOptions]8 v/ ?5 G" Q1 q [ K' e
其中, command可以是fs或者job, genericOptions是一些通用选项, commandOptions是fs或者job附加的命令选项, 看下面两个例子。+ t) C/ `( \& L
❑在HDFS上创建一个目录/test, 命令如下:
4 W1 G- J) x5 \7 n" p* r$ bbin/hadoop fs -mkdir /test5 {7 S. ~) [! B& b3 n8 V
❑显示所有Hadoop上正在运行的作业, 命令如下:6 B8 J; Q. M) z6 ]: q# G
bin/hadoop job -list, q: T# u2 X9 _. h/ p2 r
( 2) 作业提交命令jar" o$ ?) ~5 [/ T* y D4 x
这个命令的用法是:
$ D' V# E$ [+ e5 \) T3 J! bhadoop jar <jar> [mainClass] args..) ~- r) ?7 m' A( k7 F0 C6 s, a6 d
其中, <jar>表示JAR包名, mainClass表示main class名称, 可以不必输入而由jar命令自动搜索, args是main class输入参数。 举例如: p4 V9 S. B6 M9 P5 K
下:6 `* x% R1 f3 {' S' [- [
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 5 10
* P- b ], f- m/ [, t其中pi是hadoop-mapreduce-examples-*.jar 中一个作业名称, 该作业主要功能是采用拟蒙特卡罗法估算圆周率pi( 3.1415926…) 的大
) T0 d/ s; r+ C' W' I/ o: q5 y小, 它有两个整型输入参数: Map Task数目和样本数目。
2 @: @4 v- L% z( A其他更多命令, 读者可自行查阅Hadoop官方设计文档。3 s* T0 |( Z8 J" G9 l0 e
[4] 单机环境中, Hadoop有两种工作模式: 本地模式和伪分布式模式。 其中, 本地模式完全运行在本地, 不会加载任何Hadoop服务,
1 G5 _- X* W# y. \因而不会涉及Hadoop最核心的代码实现, 伪分布式即为“单点集群”, 在该模式下, 所有的守护进行均会运行在单个节点上, 因而本节
3 [$ e7 w- P7 f3 u: H选用该工作模式。 & t. }: Z+ L$ [- k3 H# k4 }
; _. }6 ?% K, D6 H
+ }! v, e" \2 Q7 P. ^; K7 ^ |
|