|
1.5 Hadoop初体验
# X2 @5 u( j/ m9 |6 f2 \& O9 a一般而言, 我们想要深入学习一个新的系统时, 首先要尝试使用该系统, 了解系统对外提供的功能, 然后再通过某个功能逐步深
8 b0 E( g* f- f _ k0 A入其实现细节。 本节将介绍如何在 伪分布式工作模式 [4] 下使用Hadoop, 包括搭建Hadoop环境、 访问HDFS以及向YARN提交应用程序2 _. M: O4 P! P/ C2 ?
等最基本的操作。 本节只是有代表性地介绍Hadoop的一些基本使用方法, 使读者对Hadoop有一个初步认识, 并引导读者逐步进行更全% C3 Q y( N p, _& O9 D
面的学习。
- H" y3 S7 g+ K C8 f* Q# d7 ]1.5.1 搭建Hadoop环境- Z6 R, c- V# }$ h
本小节仅介绍单机环境的搭建方法, 更加完整的Hadoop安装步骤和配置方法可参考本书最后的附录A和附录B。 另外, 需要注意; ]1 g) x0 |) `% ^
的是, 由于不同用户拥有的Linux环境不尽相同( 比如已经安装的软件不同、 统一软件的版本不同等) , 每个人安装Hadoop过程中遇到
7 c% w$ u" ^! I K: C# h ` b的问题可能不同, 此时需要根据具体的日志提示解决问题。 本小节仅给出一般情况下, Hadoop 2.0的安装步骤。
6 [' P8 ^' B+ M& {5 c, d X6 r步骤1 修改Hadoop配置文件。
" o9 |' `( q# ?) {. v& o, i. P* H1) 设置环境变量。 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中, 添加JAVA安装目录, 命令如下:
5 T+ M% o- L9 n; w$ T; D/ \" I7 _; Bexport JAVA_HOME=/usrb/jvm/java-6-openjdk
, [# R' j$ j' S6 _( o6 @修改conf目录下的mapred-site.xml、 core-site.xml、 yarn-site.xml和hdfs-site.xml四个文件, 在<configuration>与</configuration>之间添加的内5 |4 l7 r9 y) n3 `; {$ j
容见下面的介绍。) B. _( t( m0 c1 W ?
2) 在${HADOOP_HOME}/etc/hadoop/下, 将mapred-site.xml.templat重命名成mapred-site.xml, 并添加以下内容:
! u+ J& q8 O6 l8 O1 n6 v( f& T2 ~<property>9 k1 F \ ~) Q1 Q- s! N, h0 ]
<name>mapreduce.framework.name</name>( h0 c- x9 |6 n+ C- D+ S
<value>yarn</value>% ]& k7 z. Z. M3 y1 l, U; _
</property>7 C' _# @0 K% X
【 解释】 相比于Hadoop1.0, 用户无须再配置mapred.job.tracker, 这是因为JobTracker相关实现已变成客户端的一个库( 实际上在
- L+ g% [. |8 H, f1 k& dHadoop 2.0中, JobTracker已经不存在, 它的功能由另外一个称为MRAppMaster的组件实现) , 它可能被随机调度到任何一个slave上,- t( F. K1 \: W. v
也就是它的位置是动态生成的。 需要注意的是, 在该配置文件中需用mapreduce.framework.name指定采用的运行时框架的名称, 在此指
0 L+ A7 ?. \! t; c. s4 |1 c1 r8 B定"yarn"。: t) S) C3 h7 K" c
3) 在${HADOOP_HOME}/etc/hadoop/中, 修改core-site.xml, 为了简单, 我们仍采用Hadoop 1.0中的HDFS工作模式( 不配置HDFS
# _7 [1 ?; ~5 K! B4 R# I' SFederation) , 修改后如下:
5 T T- j- y* N, ?: _<property>
) G. E2 X/ v, d* Z<name>fs.default.name</name>9 h% }; V! P G2 t$ G2 t S. h
<value>hdfs://YARN001:8020</value>" R$ T$ z# J, x8 j
</property>1 ]2 P7 M* O9 ~3 i l; c
其中, YARN001表示节点的IP或者host。5 j; [" S; ?, k* d: o
4) 在${HADOOP_HOME}/etc/hadoop/中, 修改yarn-site.xml, 修改后如下:$ W0 k5 R7 ]( u0 r' ]
<property>$ l! @! k W1 O: m* O
<name>yarn.nodemanager.aux-services</name>3 {" m5 d, Q- G2 A3 P
<value>mapreduce-shuffle</value>
X4 {9 U$ l' P* _</property>
! W% F: l8 a ~# L: m【 解释】 为了能够运行MapReduce程序, 需要让各个NodeManager在启动时加载shuffle server, shuffle server实际上是Jetty/Netty
3 ^9 K+ G9 [4 G. {! p2 aServer, Reduce Task通过该server从各个NodeManager上远程复制Map Task产生的中间结果。 上面增加的两个配置均用于指定shuffle8 P u* [. U+ d# S
server。
3 A j1 q. e9 q5 V5) 修改${HADCOP_HOME}/etc/hadoop中的hdfs-site.xml文件:, s5 U! e' C0 K% X9 Y
<property>
8 k, Y' H$ A" X) g7 ^4 u, U; N) H<name>dfs.replication</name>* t4 j, N2 E6 K
<value>1</value>8 S6 G: d# a" [! A9 D
</property>
. P" G. x" m+ R& }" e【解释】 默认情况下, HDFS数据块副本数是3, 而在集群规模小于3的集群中该参数会导致出现错误, 这可通过将dfs.replication调' u7 O: a3 J9 i8 l
整为1解决。
' R1 f( D( W: `注意 如果你是在虚拟机中搭建Hadoop环境, 且虚拟机经常关闭与重启, 为了避免每次重新虚拟机后启动Hadoop时出现各种问
* N# ~; _, x K8 l0 X题, 建议在core-site.xml中将hadoop.tmp.dir属性设置为一个非/tmp目录, 比如/data或者/home/dongxicheng/data( 注意该目录对当前用户需具- a# L4 ]; g) Z! o- f
有读写权限) 。
$ J* P- E. y; D步骤2 设置免密码登录。
9 C1 w$ u; t( b% v" s' q, @* `! i前面提到Hadoop启动/停止脚本需要通过SSH发送命令启动相关守护进程, 为了避免每次启动/停止Hadoop都要输入密码进行验8 }- U2 x$ I; F$ T( l1 Z
证, 需设置免密码登录, 步骤如下。1 u: t3 R" `$ P" c% W
1) 打开命令行终端, 输入以下命令:5 _3 d8 i0 m& W9 a* q6 Q
ssh-keygen -t rsa5 t3 \2 Y. N$ N# z) M7 C
将会在"~/.ssh/"目录下生成公钥文件id_rsa.pub和私钥文件id_rsa。/ \% K: }; R u% v5 y7 M
2) 将公钥文件id_rsa.pub中的内容复制到相同目录下的authorized_keys文件中:
+ ?7 n$ {! r1 a* H6 P/ icd ~/.ssh/
; L3 [( ]5 J9 A( Ccat id_rsa.pub >> authorized_keys
+ v' @' @8 g& n7 g* \2 ^步骤3 启动Hadoop。5 U5 c' f3 H3 `3 i( {1 z6 u/ d J
在Hadoop安装目录中, 按以下三步操作启动Hadoop, 我们单步启动每一个服务, 以便于排查错误, 如果某一个服务没有启动成
' l* z' X( Z* s+ F# K/ D功, 可查看对应的日志查看启动失败原因。
! ` B+ B1 u3 K3 A `1) 格式化HDFS, 命令如下:2 ?4 P# | c& O$ ^6 p
bin/hadoop namenode -format
8 Y+ c5 p2 @0 P2 ~$ L! w, Q, f2) 启动HDFS。 你可以使用以下命令分别启动NameNode和DataNode:
$ G8 m" l& `* K$ @6 Isbin/hadoop-daemon.sh start namenode
4 ? u" j+ R# F- C7 _1 lsbin/hadoop-daemon.sh start datanode: W; z2 C0 q- H8 S# c
如果有多个DataNode, 可使用hadoop-daemons.sh启动所有DataNode, 具体命令如下:
/ N m- \3 B; Bsbin/hadoop-daemons.sh start datanode- h; ~& ?; [2 G' S' O" } p
你也可以使用以下命令一次性启动NameNode和所有DataNode:
L5 |! [9 b9 vsbin/ start-dfs.sh4 T4 A& a( k/ j$ o$ H( I$ w$ p1 s/ v/ d
3) 启动YARN。 你可以使用以下命令分别启动ResourceManager和NodeManager:0 x5 F# P: k2 V1 K) ]$ O
sbin/hadoop-daemon.sh start namenode
0 w; n8 M( L* l8 X9 Z# x1 isbin/hadoop-daemon.sh start datanode
0 c. y2 g D2 c8 c如果有多个NodeManager, 可使用yarn-daemon.sh启动所有NodeManager, 具体命令如下:) ^ V1 t4 t7 X+ c/ I
sbin/yarn-daemon.sh start nodemanager
7 U3 |3 ~8 X8 j8 t% w" ?" ]你也可以使用以下命令一次性启动ResourceManager和所有NodeManager:
2 ~! C0 u/ r0 Q' J: N. Jsbin/start-yarn.sh
+ ^+ Y3 @7 B5 _! T# _) {) r通过如下jps命令查看是否启动成功:
0 P1 e5 u7 K5 a/ X: `* Q) ~' gdong@YARN001:/opt/hadoop/hadoop-2.0$ jps5 u0 r) `/ Z) T
27577 NameNode5 ^9 j Q$ v7 u/ q' i: L+ D6 V+ i
30315 ResourceManager
p f9 e# k8 i/ ~# @, H, l* T27924 SecondaryNameNode
& i+ W1 M4 _2 _1 K/ _% k2 S16803 NodeManager' t: A% Z. _/ h b }: B
通过以下URL可查看YARN是否启动成功:5 ~, H% e& b3 G2 }3 P& _, j' ~
http://YARN001:8080/# U2 h7 q6 G2 X( X
YARN对外提供的Web运行界面如图1-10所示。
3 t2 N* s( J- X& H图1-10 YARN对外提供的Web界面
" v2 `4 `% n# |, O9 [" b0 d; I如果安装过程中出现问题, 可通过查看日志发现问题所在。 Hadoop日志存放在$HADOOP_HOME/logs目录下的以".log"结尾的文件% p4 P% @8 n/ Z, Y5 V0 \. E% ]' \" y$ Q
中, 比如yarn-dongxicheng-resourcemanager-yarn001.log就是ResourceManager产生的日志。0 w, q% D/ w/ e( x7 p
经过以上三步操作, Hadoop成功启动后, 接下来可以通过Hadoop Shell或者Eclipse插件访问HDFS和提交MapReduce作业。 下面两小5 W* W L0 e8 z$ |3 c( k
节分别介绍Hadoop Shell和Eclipse插件使用方法。# m3 w- M+ E6 k% ^2 i
1.5.2 Hadoop Shell介绍
3 G$ L5 X/ o2 x; U9 Y! y: X" p/ C在1.4节我们曾提到, bin目录下是最基础的集群管理脚本, 用户可以通过该脚本完成各种功能, 如HDFS文件管理、 MapReduce作3 Z% O% F& L) q) }
业管理等, 更加详细的脚本使用说明, 可参考附录C。0 W! ~* |) d4 ]: ^' w, g+ `3 F8 l5 v
作为入门, 本节介绍的是bin目录下Hadoop脚本的使用方法。 如果你已经对Hadoop 1.0有所了解( 比如尝试安装和使用过Hadoop
( j0 w8 u! g! Y s( M t1.0) , 那么可直接使用该脚本, 因为该脚本的功能与Hadoop 1.0对应的Hadoop脚本功能完全一致。( T2 G" h0 C' V
该脚本的使用方法为:
4 B1 u0 t) o5 K; x* [- Uhadoop [--config confdir] COMMAND% |& g# x+ k/ m+ i3 P3 |+ w
其中, --config用于设置Hadoop配置文件目录。 默认目录为${HADOOP_HOME}/conf。 而COMMAND是具体的某个命令, 常用的4 a6 J- P# a. H/ I9 [0 N& h
有HDFS管理命令fs、 作业管理命令job和作业提交命令jar等, 它们的使用方法如下。- r' i% F! R+ m( A/ A/ u, m7 F+ z
( 1) HDFS管理命令fs和作业管理命令job
& \. I" y3 s' O- Z* H& t3 @' r它们的用法一样, 均为:
0 }; g4 ?" B* |" }" obin/hadoop command [genericOptions] [commandOptions]
& b% f0 r7 }3 s- I( x其中, command可以是fs或者job, genericOptions是一些通用选项, commandOptions是fs或者job附加的命令选项, 看下面两个例子。# p! h! B" i' X; _# ^/ E% X; M
❑在HDFS上创建一个目录/test, 命令如下:- p. s; P% I! v5 K3 x
bin/hadoop fs -mkdir /test
2 s/ t% ?5 k; x$ s- l❑显示所有Hadoop上正在运行的作业, 命令如下:
% f+ F- a% s w5 }: ~, dbin/hadoop job -list+ G+ X. g Q x n! N5 l9 H* e
( 2) 作业提交命令jar
# P3 @/ H0 _% v4 b0 Q这个命令的用法是:' X% V2 I8 j/ C
hadoop jar <jar> [mainClass] args..
9 Z6 Y b9 y9 }4 Z其中, <jar>表示JAR包名, mainClass表示main class名称, 可以不必输入而由jar命令自动搜索, args是main class输入参数。 举例如
" s8 d7 z& O7 S) D下:, A5 C- e9 U0 f- P) N
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 5 10' N# t+ ~, ^3 Y+ c v5 K* l
其中pi是hadoop-mapreduce-examples-*.jar 中一个作业名称, 该作业主要功能是采用拟蒙特卡罗法估算圆周率pi( 3.1415926…) 的大
3 k, ^! D8 l$ i/ a; a: _小, 它有两个整型输入参数: Map Task数目和样本数目。
* p3 e" ~) z( s其他更多命令, 读者可自行查阅Hadoop官方设计文档。- ?+ @: U' M( H9 _
[4] 单机环境中, Hadoop有两种工作模式: 本地模式和伪分布式模式。 其中, 本地模式完全运行在本地, 不会加载任何Hadoop服务,
/ U+ W0 v- Y. S5 H7 q/ _因而不会涉及Hadoop最核心的代码实现, 伪分布式即为“单点集群”, 在该模式下, 所有的守护进行均会运行在单个节点上, 因而本节
: U0 N; g- N" g$ Y选用该工作模式。 7 w0 q# c0 C- z, A: `% |7 q6 g
, S/ k4 G* k* Y& z/ `
+ T/ a+ |2 }$ o4 S7 U7 \; h
|
|