Hadoop集群搭建实践全记录
参考:http://www.open-open.com/lib/view/1328536842327
http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.html
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/
转载请标明出处SpringsSpace: http://springsfeng.iteye.com
安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。通常,集群里的一台机器被指定为
NameNode ,另一台不同的机器被指定为JobTracker ;这两台机器是masters 。而余下的机器即作
为DataNode 也 作为TaskTracker ,这些机器是slaves 。下面安装配置过程中使用HADOOP_HOME 指
代安装的根路径,一般情况下,集群里的所有机器的HADOOP_HOME 路径应该是的相同的。
1. 先决条件
确保集群中的每个节点上都安装了所有必需软件:SUN-JDK(jdk-6u33-linux-i586.bin) ,ssh,Hadoop
(hadoop-1.0.3.tar.gz):
其总JDK必须安装,ssh 必须安装并且保证sshd一直运行,以便用Hadoop脚本管理远端Hadoop守护进程。
2 实验环境搭建
2.1 准备工作
操作系统:Ubuntu10.10,虚拟机:Vmvare8.X:可在vmvare安装好一台Ubuntu虚拟机后,可以导出或
者克隆出另外两台虚拟机。
准备机器:一台master,2台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例
如:
192.168.1.102 HADOOP-MASTER(master)
192.168.1.103 HADOOP-SLAVE1 (slave1)
192.168.1.104 HADOOP-SLAVE2(slave2)
主机信息:
机器名 IP地址 作用
HADOOP-MASTER 192.168.1.102 NameNode、JobTracker
HADOOP-SLAVE1 192.168.1.103 DataNode、TaskTracker
HADOOP-SLAVE2 192.168.1.104 DataNode、TaskTracker
2.2 安装JDK
(1) 安装方式1:
右键选择jdk-6u33-linux-i586.bin中的权限Tab页,选中“允许以程序执行文件”;进入jdk-6u33-linux-i586.bin
所在目录,执行:./jdk-6u33-linux-i586.bin
(2) 安装方式2:
$ sudo apt-get install sun-java6-jdk
这个安装,java执行文件自动添加到/usr/bin/目录。
验证 shell命令 :java -version 看是否与你的版本号一致。
配置环境变量,请参考本博客Ubuntu下的Java开发环境搭建文章。
2.3 创建目录
在所有的机器上都建立相同的目录:
sudo mkdir /usr/program/
sudo chown hadoop:hadoop program/
以该目录作为JDK,HADOOP的安装目录。
2.4 安装ssh和配置
参考:Linux上安装使用SSH(ubuntu&&redhat) :
http://blog.csdn.net/zxs9999/article/details/6930736
1) 安装:sudo apt-get install ssh
2) 配置:
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个Datanode上的各种守护
进程的,这就需要在节点之间执行指令的时候是不须要输入密码的形式,故我们需要配置SSH运用无密码公
钥认证的形式。以本文中的三台机器为例,现在HADOOP-MASTER是主节点,他须要连接HADOOP-
SLAVE1和HADOOP-SLAVE2。需要确定每台机器上都安装了ssh,并且Datanode机器上sshd服务已经启动。
( 说明:hadoop@Ubuntu~]$ssh-keygen -t rsa
这个命令将为Ubuntu上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要
为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,
id_rsa.pub ,默认存储在/home/hadoop/.ssh 目录下然后将 id_rsa.pub的内容复制到每个机器(也包括本机)的
/home/hadoop/.ssh/authorized_keys 文件中,如果机器上已经有 authorized_keys这个文件了,就在文件末
尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行.)
3) 首先设置Namenode的ssh为无需密码的、自动登录
hadoop@HADOOP-MASTER :~$ ssh-keygen -t rsa 然后一直按回车
完成后,在home跟目录下会产生隐藏文件夹.ssh
hadoop@HADOOP-MASTER :~$ cd .ssh
hadoop@HADOOP-MASTER :~/.ssh$ ll
hadoop@HADOOP-MASTER :~/.ssh$ cat authorized_keys
测试:
ssh localhost 发现链接成功,并且无需密码。
4 ) 复制到HADOOP-SLAVE1 和HADOOP-SLAVE2上
hadoop@HADOOP-MASTER:~/.ssh$ scp authorized_keys HADOOP-SLAVE1:/home/hadoop/.ssh/
hadoop@HADOOP-MASTER:~/.ssh$ scp authorized_keys HADOOP-SLAVE2:/home/hadoop/.ssh/
输入 yes 来继续。这会把该服务器添加到你的已知主机的列表中
The authenticity of host 'hadoop-slave1 (192.168.1.103)' can't be established.
ECDSA key fingerprint is 77:9a:8a:91:bd:de:6b:0a:d3:3d:62:c2:de:13:4a:b4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop-slave1,192.168.1.103' (ECDSA) to the list of known hosts.
hadoop@hadoop-slave1's password:
这里会提示输入密码,输入hadoop账号密码就可以了。
改动你的 authorized_keys 文件的许可权限:
hadoop@HADOOP-MASTER:~/.ssh$ chmod 644 authorized_keys
hadoop@HADOOP-SLAVE1:~/.ssh$ chmod 644 authorized_keys
hadoop@HADOOP-SLAVE2:~/.ssh$ chmod 644 authorized_keys
检查下能不能配置成功,从hadoop机器上ssh到AHDOOP-SLAVE1和HADOOP-SLAVE2,如果不需要输
入密码则配置成功,如果还须要检查上面的配置能不能正确。例如:
hadoop@HADOOP-MASTER:~$ ssh HADOOP-SLAVE1
hadoop@HADOOP-MASTER:~$ ssh HADOOP-SLAVE2
2.5 安装Hadoop
下载安装包后,直接解压安装即可:
$ tar -zxvf hadoop-1.0.3.tar.gz
1) 安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。并且安装路径要一致,如果用HADOOP
_HOME =/usr/program/hadoop-1.0.3, 指代安装的根路径,通常,集群里的所有机器的HADOOP_HOME路
径相同。
2) 如果集群内机器的环境完全一样,可以在一台机器上配置好,然后把配置好的软件即hadoop-1.0.3整个文
件夹拷贝到其他机器的相同位置即可。
3) 可以将Master上的Hadoop通过scp拷贝到每一个Slave相同的目录下,同时根据每一个Slave的Java_
HOME 的不同修改其hadoop-env.sh 。
4) 为了方便,使用hadoop命令或者start-all.sh等命令。
修改Master和Slave上的/etc/profile :新增以下内容:
JAVA_HOME=/usr/program/jdk1.6.0_33
HADOOP_HOME=/usr/program/hadoop-1.0.3
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME HADOOP_HOME PATH CLASSPATH
修改完毕后,执行source /etc/profile 来使其生效。
5) 配置conf/hadoop-env.sh文件
配置conf/hadoop-env.sh 文件
#添加
export JAVA_HOME= /usr/program/jdk1.6.0_33
#这里修改为你的jdk的安装位置。
测试hadoop安装:
hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3$ bin/hadoop jar hadoop-examples-1.0.3.jar wordcount conf/ /tmp/out
3. 集群配置(所有节点相同)
3.1配置文件:conf/core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://HADOOP-MASTER:49000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-workspace/var</value>
</property>
</configuration>
1) fs.default.name是NameNode的URI。hdfs://主机名:端口/
2) hadoop.tmp.dir :Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的
DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就
需要重新执行NameNode格式化的命令。
3.2配置文件:conf/mapred-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>HADOOP-MASTER:49001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/hadoop-workspace/var</value>
</property>
</configuration>
1) mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
3.3配置文件:conf/hdfs-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/name1, /home/hadoop/name2</value> #hadoop的name目录路径
<description> </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/data1, /home/hadoop/data2</value>
<description> </description>
</property>
<property>
<name>dfs.replication</name>
<!-- 我们的集群又两个结点,所以rep两份 -->
<value>2</value>
</property>
</configuration>
1) dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分
割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。
2) dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目
录列表时,数据将被存储在所有目录下,通常分布在不同设备上。
3) dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。
注意: 此处的name1、name2、data1、data2目录不能预先创建,hadoop格式化时会自动创建,如果预先
创建反而会有问题。
3.4配置masters和slaves主从结点
配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以
互相访问,每个主机名一行。
hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3/conf$ gedit masters
输入:
HADOOP-MASTER #注意输入的内容前后不要有空格
hadoop@HADOOP-SLAVE1:/usr/program/hadoop-1.0.3/conf$ gedit masters
hadoop@HADOOP-SLAVE1:/usr/program/hadoop-1.0.3/conf$ gedit slaves
hadoop@HADOOP-SLAVE2:/usr/program/hadoop-1.0.3/conf$ gedit masters
hadoop@HADOOP-SLAVE2:/usr/program/hadoop-1.0.3/conf$ gedit slaves
输入:
HADOOP-SLAVE1
HADOOP-SLAVE2
配置结束,把配置好的hadoop-1.0.3文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而
言正确,例如:如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh
$ scp -r /usr/program/hadoop-1.0.3 hadoop@HADOOP-SLAVE1: /usr/program/hadoop-1.0.3
4 hadoop启动
4.1 格式化一个新的分布式文件系统
先格式化一个新的分布式文件系统,在Master机器上执行:
hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3$ bin/hadoop namenode -format
成功情况下系统输出:
12/06/29 02:50:31 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = HADOOP-MASTER/192.168.1.102 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 1.0.3 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1335192; compiled by 'hortonfo' on Tue May 8 20:31:25 UTC 2012 ************************************************************/ 12/06/29 02:50:32 INFO util.GSet: VM type = 32-bit 12/06/29 02:50:32 INFO util.GSet: 2% max memory = 19.33375 MB 12/06/29 02:50:32 INFO util.GSet: capacity = 2^22 = 4194304 entries 12/06/29 02:50:32 INFO util.GSet: recommended=4194304, actual=4194304 12/06/29 02:50:32 INFO namenode.FSNamesystem: fsOwner=hadoop 12/06/29 02:50:32 INFO namenode.FSNamesystem: supergroup=supergroup 12/06/29 02:50:32 INFO namenode.FSNamesystem: isPermissionEnabled=true 12/06/29 02:50:32 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100 12/06/29 02:50:32 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s) 12/06/29 02:50:32 INFO namenode.NameNode: Caching file names occuring more than 10 times 12/06/29 02:50:32 INFO common.Storage: Image file of size 112 saved in 0 seconds. 12/06/29 02:50:32 INFO common.Storage: Storage directory /home/hadoop/name1 has been successfully formatted. 12/06/29 02:50:32 INFO common.Storage: Image file of size 112 saved in 0 seconds. 12/06/29 02:50:32 INFO common.Storage: Storage directory /home/hadoop/name2 has been successfully formatted. 12/06/29 02:50:32 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at HADOOP-MASTER/192.168.1.102 ************************************************************/
查看输出保证分布式文件系统格式化成功。
执行完后可以到Master机器上看到/home/hadoop//name1和/home/hadoop//name2两个目录。在主节点
Master上面启动hadoop,主节点会启动所有从节点的hadoop。
4.2 启动所有节点
hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3/bin$ ./start-all.sh
运行正确输出:
starting namenode, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-namenode-HADOOP-MASTER.out HADOOP-SLAVE1: starting datanode, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-datanode-HADOOP-SLAVE1.out HADOOP-SLAVE2: starting datanode, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-datanode-HADOOP-SLAVE2.out HADOOP-MASTER: starting secondarynamenode, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-secondarynamenode-HADOOP-MASTER.out starting jobtracker, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-jobtracker-HADOOP-MASTER.out HADOOP-SLAVE2: starting tasktracker, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-tasktracker-HADOOP-SLAVE2.out HADOOP-SLAVE1: starting tasktracker, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-tasktracker-HADOOP-SLAVE1.out
执行完后可以到Master(HADOOP-MASTER)和Slave(HADOOP-SLAVE1,HADOP-SLAVE2)机器上看到
/home/hadoop/hadoopfs/data1和/home/hadoop/data2两个目录。
4.3 关闭所有节点
从主节点master关闭hadoop,主节点会关闭所有从节点的hadoop。
hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3/bin$ ./stop-all.sh
运行正确输出:
stopping jobtracker HADOOP-SLAVE2: stopping tasktracker HADOOP-SLAVE1: stopping tasktracker stopping namenode HADOOP-SLAVE1: stopping datanode HADOOP-SLAVE2: stopping datanode HADOOP-MASTER: stopping secondarynamenodeHadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).
${HADOOP_HOME}就是安装路径.
5 .测试
1) 浏览NameNode和JobTracker的网络接口,它们的地址默认为:
NameNode - http://HADOOP-MASTER:50070/
JobTracker - http://HADOOP-SLAVE1:50030/
2) 使用netstat –nat 查看端口49000和49001是否正在使用。
3) 使用jps 查看进程。
要想检查守护进程是否正在运行,可以使用 jps 命令(这是用于 JVM 进程的ps 实用程序)。这个命令列出
5 个守护进程及其进程标识符。
4) 将输入文件拷贝到分布式文件系统:
$ bin/hadoop fs -mkdir input
$ bin/hadoop fs -put conf/core-site.xml input
运行发行版提供的示例程序:
$ bin/ h adoop jar hadoop-examples-1.0.3.jar wordcount grep input output 'dfs[a-z.]+'
具体可参考:http://springsfeng.iteye.com/admin/blogs/1379237
6.补充
Q: bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+' 什么意思啊?
A: bin/hadoop jar(使用hadoop运行jar包) hadoop-examples-1.0.3.jar(jar包的名字) grep (要使用的类,
后边的是参数)input output 'dfs[a-z.]+'
整个就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。
Q: 什么是grep?
A: A map/reduce program that counts the matches of a regex in the input.
查看输出文件:
将输出文件从分布式文件系统拷贝到本地文件系统查看:
$ bin/hadoop fs -get output output
$ cat output/*
或者在分布式文件系统上查看输出文件:
$ bin/hadoop fs -cat output/*
统计结果:
root@v-jiwan-ubuntu-0:~/hadoop/hadoop-0.20.2-bak/hadoop-0.20.2#bin/hadoop fs -cat output/part-00000
3 dfs.class
2 dfs.period
1 dfs.file
1 dfs.replication
1 dfs.servers
1 dfsadmin
7. HDFS常用操作
hadoopdfs -ls 列出HDFS下的文件
hadoop dfs -ls in 列出HDFS下某个文档中的文件
hadoop dfs -put test1.txt test 上传文件到指定目录并且重新命名,只有所有的DataNode都接收完数据才
算成功
hadoop dfs -get in getin 从HDFS获取文件并且重新命名为getin,同put一样可操作文件也可操作目录
hadoop dfs -rmr out 删除指定文件从HDFS上
hadoop dfs -cat in/* 查看HDFS上in目录的内容
hadoop dfsadmin -report 查看HDFS的基本统计信息,结果如下
hadoop dfsadmin -safemode leave 退出安全模式
hadoop dfsadmin -safemode enter 进入安全模式
8.添加节点
可扩展性是HDFS的一个重要特性,首先在新加的节点上安装hadoop,然后修改$HADOOP_HOME/conf
/master文件,加入 NameNode主机名,然后在NameNode节点上修改$HADOOP_HOME/conf/slaves文
件,加入新加节点主机名,再建立到新加节点无密码的SSH连接, 运行启动命令:
start-all.sh
然后可以通过http://(Masternode的主机名):50070查看新添加的DataNode
9. 负载均衡
start-balancer.sh,可以使DataNode节点上选择策略重新平衡DataNode上的数据块的分布。