读书人

Hadoop集群环境配备

发布时间: 2012-07-05 07:59:18 作者: rapoo

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。

读书人网 >开源软件

热点推荐