Hadoop集群环境配置
参考:http://hadoop.apache.org/common/docs/r1.0.1/cn/quickstart.html
http://dawn-sky.iteye.com/blog/1396607
http://blog.csdn.net/lee_leefox/article/details/7061964
http://www.yanjiuyanjiu.com/2012/01/03/hadoop-cluster-setup/
?
设置固定IP和hosts和hostname
本人在windows7和ubuntu11.10下都试过了,用VirtualBox安装3台Ubuntu10.10的虚拟机,一台作为namenode起名为master,另外两台作为datanode起名为slave1和slave2。三台ubuntu都采用桥接网络模式,主要可以使用192.168.1.xxx的IP,都固定IP地址(如何固定查看:http://jayghost.iteye.com/blog/1458865)。
?
修改计算机名称:
sudo gedit /etc/hostname
作为master的机器就只输入master。作为slave的机器就只输入slave1或slave2.
?
然后:
sudo gedit /etc/hosts
添加:
?
192.168.1.47 master #NameNode、JobTracker192.168.1.51 slave1 #DataNode、TaskTracker192.168.1.50 slave2 #DataNode、TaskTracker
严重注意:这里一定要注释掉127.0.1.1这行,不然的话后面有问题,还得我好惨啊,浪费了几个小时!!!
最后我的hosts:
?
hadoop@master:~/program/hadoop-1.0.1$ cat /etc/hosts127.0.0.1localhost.localdomainlocalhost::1masterlocalhost6.localdomain6localhost6#127.0.1.1master# The following lines are desirable for IPv6 capable hosts::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allroutersff02::3 ip6-allhosts192.168.1.47 master #NameNode、JobTracker192.168.1.51 slave1 #DataNode、TaskTracker192.168.1.50 slave2 #DataNode、TaskTracker
安装配置JDK和SSH
安装jdk6(http://jayghost.iteye.com/blog/1245095)
?
安装配置ssh:
?
sudo apt-get install ssh
sudo apt-get install rsync
?在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个datanode上的各种守护进程的,这就须要在节点之间执行指令的时候是不须要输入密码的形式,故我们须要配置SSH运用无密码公钥认证的形式。
?
以本文中的三台机器为例,现在node1是主节点,他须要连接node2和node3。须要确定每台机器上都安装了ssh,并且datanode机器上sshd服务已经启动。?
确认sshserver是否启动了:
?
ps -e |grep ssh
?如果只有ssh-agent那ssh-server还没有启动,需要:
?
/etc/init.d/ssh start?
如果看到sshd那说明ssh-server已经启动了。
?
( 说明:hadoop@hadoop~]$ssh-keygen ?-t ?rsa?
这个命令将为hadoop上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/hadoop/.ssh目录下然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/dbrg/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行.)?
?
首先设置namenode的ssh为无需密码的、自动登录。?
?
cd /home/hadoop/
ssh-keygen -t rsa
?
然后一直按回车,完成后,在home跟目录下会产生隐藏文件夹.ssh
cd .ssh
之后ls查看文件,
cp id_rsa.pub authorized_keys
测试:
ssh localhost
发现链接成功,并且无需密码。
?
?
将authorized_keys复制到slave1和slave2上?
?
[hadoop@hadoop .ssh]$ scp authorized_keys slave1:/home/hadoop/.ssh/?
?
[hadoop@hadoop .ssh]$ scp authorized_keys slave2:/home/hadoop/.ssh/?
?
输入 yes 来继续。这会把该服务器添加到你的已知主机的列表中?
The authenticity of host ‘test (192.168.1.51)’ can’t be established.?
RSA key fingerprint is 03:e0:30:cb:6e:13:a8:70:c9:7e:cf:ff:33:2a:67:30.?
Are you sure you want to continue connecting (yes/no)??
?
? ? 这里会提示输入密码,输入hadoop账号密码就可以了。?
?
改动你的 authorized_keys 文件的许可权限:?
[hadoop@hadoop .ssh]$chmod 644 authorized_keys?
?
检查下能不能配置成功,从hadoop机器上ssh到slave1和slave2上,如果不须要输入密码则配置成功,如果还须要请检查上面的配置能不能正确。?
?
?
注意,我在后来使用ssh时出现了WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED错误,我的解决办法是rm .ssh/known_hosts,就可以了。
?
配置hadoop1.0.1
1.配置conf/hadoop-env.sh文件,修改:
?
# The java implementation to use. Required.export JAVA_HOME=/home/hadoop/jdk1.6.0_30
# The directory where pid files are stored. /tmp by default.export HADOOP_PID_DIR=/home/hadoop/program/hadoop-1.0.1/pids
?
2.配置conf/core-site.xml:
?
<configuration><property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/program/hadoop-1.0.1/tmp</value> </property> </configuration>
1)fs.default.name是NameNode的URI。hdfs://主机名:端口/?
2)hadoop.tmp.dir :Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。??
?
3.配置hdfs-site.xml:
?
<configuration><property><name>dfs.name.dir</name><value>/home/hadoop/name1,/home/hadoop/name2</value></property><property><name>dfs.data.dir</name><value>/home/hadoop/data1,/home/hadoop/data2</value></property><property><name>dfs.replication</name><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格式化时会自动创建,如果预先创建反而会有问题。
?
?4.配置mapred-site.xml:
?
<configuration><property> <name>mapred.job.tracker</name> <value>master:9001</value> </property> <property> <name>mapred.local.dir</name> <value>/home/hadoop/program/hadoop-1.0.1/tmp</value> </property> </configuration>
1)mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
?
5.配置conf/masters:
?
master
?6.配置conf/slaves:
?
slave1slave2
?注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。
?
配置结束,把配置好的hadoop文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而言正确,例如:如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh
如果配置好了ssh,可采用:
?
$ scp -r /home/hadoop/program/hadoop-1.0.1 slave1: /home/hadoop/program/$ scp -r /home/hadoop/program/hadoop-1.0.1 slave2: /home/hadoop/program/
??然后配置环境变量:sudo gedit /etc/envirinment
JAVA_HOME="/home/hadoop/jdk1.6.0_30"HADOOP_HOME="/home/hadoop/program/hadoop-1.0.1"PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:$JAVA_HOME/bin:$HADOOP_HOME/bin"CLASSPATH=".:$JAVA_HOME/lib"
或者:sudo gedit /etc/profile添加:
?
#set java environmentJAVA_HOME=/home/hadoop/jdk1.6.0_30export JRE_HOME=/home/hadoop/jdk1.6.0_30/jreexport CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATHexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
其实使用虚拟机,完全可以先搭建好一个master,然后直接clone出两个slave,对于slave记得修改固定IP就行了。
至此,Hadoop的集群环境配置已经完成!
?
Hadoop启动
在master上先格式化一个新的分布式文件系统?
?
$ cd program/hadoop-1.0.1/
$ bin/hadoop namenode -format
?
?
查看输出保证分布式文件系统格式化成功?
执行完后可以到master机器上看到/home/hadoop/name1和/home/hadoop/name2两个目录。在主节点master上面启动hadoop,主节点会启动所有从节点的hadoop。
?
?
启动所有节点?
?
启动方式1:?
$ cd program/hadoop-1.0.1/
$ bin/start-all.sh (同时启动HDFS和Map/Reduce)?
执行完后可以到slave1和slave2机器上看到/home/hadoop/data1和/home/hadoop/data2两个目录。?
?
启动方式2:?
?
启动Hadoop集群需要启动HDFS集群和Map/Reduce集群。?
?
在分配的NameNode上,运行下面的命令启动HDFS:?
$ cd program/hadoop-1.0.1/
$ bin/start-dfs.sh(单独启动HDFS集群)?
?
bin/start-dfs.sh脚本会参照NameNode上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动DataNode守护进程。?
?
在分配的JobTracker上,运行下面的命令启动Map/Reduce:?
$bin/start-mapred.sh (单独启动Map/Reduce)?
?
bin/start-mapred.sh脚本会参照JobTracker上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动TaskTracker守护进程。?
?
关闭所有节点?
?
从主节点master关闭hadoop,主节点会关闭所有从节点的hadoop。?
$ cd program/hadoop-1.0.1/
$ bin/stop-all.sh?
?
Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).?
${HADOOP_HOME}就是安装路径.?
?
浏览NameNode和JobTracker的网络接口,它们的地址默认为:
NameNode - http://master:50070/
JobTracker - http://master:50030/
?
测试Hadoop
?
将输入文件拷贝到分布式文件系统:?
$ bin/hadoop fs -mkdir input?
$ bin/hadoop fs -put conf/*.xml input?
?
可以用$ bin/hadoop fs -lsr查看所有分布式系统中的文件
Hadoop Shell命令查看:http://hadoop.apache.org/common/docs/r1.0.1/cn/hdfs_shell.html
?
运行发行版提供的示例程序:?
hadoop@master:~/program/hadoop-1.0.1$ bin/hadoop jar hadoop-examples-1.0.1.jar grep input output 'dfs[a-z.]+'
或者
hadoop@master:~/program/hadoop-1.0.1$ bin/hadoop jar hadoop-examples-1.0.1.jar wordcount input outputCount
?
查看输出文件:?
?
将输出文件从分布式文件系统拷贝到本地文件系统查看:?
$ bin/hadoop fs -get output output?
$ cat output/*?
?
或者?
?
在分布式文件系统上查看输出文件:?
$ bin/hadoop fs -cat output/*
?
?
统计结果:?
hadoop@master:~/program/hadoop-1.0.1$ bin/hadoop fs -cat output/part-00000
1dfs.data.dir
1dfs.name.dir
1dfs.replication
1dfsadmin
?
负载均衡
start-balancer.sh,可以使DataNode节点上选择策略重新平衡DataNode上的数据块的分布
?
关闭安全模式
?
hadoop@master:~/program/hadoop-1.0.1/bin$ hadoop dfsadmin -safemode leave
>Warning: $HADOOP_HOME is deprecated.
?
>Safe mode is OFF
?
hadoop执行stop-all.sh的时候总是出现 “no namenode to stop”
?
?
这个原因其实是因为在执行stop-all.sh时,找不到pid文件了。
在 HADOOP_HOME/conf/ hadoop-env.sh 里面,修改配置如下:
export HADOOP_PID_DIR=/home/hadoop/program/hadoop-1.0.1/pids
pid文件默认在/tmp目录下,而/tmp是会被系统定期清理的,所以Pid文件被删除后就no namenode to stop”
?
?
1、先把服务都停掉?
$ bin/stop-all.sh
2、格式化namenode?
$ bin/hadoop namenode -format
3、重新启动所有服务?
$ bin/start-dfs.sh?
?
?
Re-format filesystem in /tmp/hadoop-root/dfs/name ? (Y or N) y
Format aborted in /tmp/hadoop-root/dfs/name
把/tmp/hadoop-hadoop/dfs/下 name文件夹整个删除,再进行格式化。
或者输入大写的Y。