使用hadoop-0.23 搭建hdfs, namenode + datanode
1.HDFS-1052引入了多namenode, HDFS架构变化较大,可以参考hortonworks的文章:http://hortonworks.com/an-introduction-to-hdfs-federation/.
我将在接下来的博客里把此文章翻译一下(另外还有: http://developer.yahoo.com/blogs/hadoop/posts/2011/03/mapreduce-nextgen-scheduler/).
所有namenode共享datanode,各个namenode相互独立,互不影响,每个namenode都有一个backupNode和SecondaryNamenode,提供主备切换功能和备份元数据的功能.
下文的配置信息主要参考HDFS-2471.
2.环境:
a)五台机器 ,linux系统,
b)互相添加ssh-key,后应该可以不用密码互连
c)编译好的0.23版本的包: hadoop-0.23.0-SNAPSHOT.tar.gz
d)每台机器需要安装java1.6或以上版本.并把JAVA_HOME加到$PATH中.
e)最好加上pssh和pscp工具.
这里把五台机器命名为:
Myhost1
Myhost2
Myhost3
Myhost4
Myhost5
假设我们需要搭建如下集群:
Myhost1和Myhost2开启 namenode,另外三台机器启动datanode服务.
3.首先把分配到五台机器上,然后解压.(推荐使用pscp, pssh命令)
4.然后在五台机器上安装java,并把JAVA_HOME加到$PATH中
5.进入解压后的hadoop目录,编辑 etc/hadoop/hdfs-site.xml
a)Myhost1的配置如下(其中hadoop存放在/home/yuling.sh/目录下):
<property>
<name>fs.defaultFS</name>
<value>hdfs:// Myhost1:9000</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/yuling.sh/cluster-data</value>
</property>
b)Myhost2的配置如下(其中hadoop存放在/home/yuling.sh/目录下):
<property>
<name>fs.defaultFS</name>
<value>hdfs:// Myhost2:9000</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/yuling.sh/cluster-data</value>
</property>
c) 这里把Myhost1集群起名ns1, Myhost1集群起名ns2,三台slava的etc/hadoop/hdfs-site.xml配置如下:
<property>
<name>dfs.federation.nameservices</name>
<value>ns1,ns2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1</name>
<value>hdfs:// Myhost1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1</name>
<value> Myhost1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2</name>
<value>hdfs:// Myhost2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1</name>
<value> Myhost2:50070</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/yuling.sh/datanode</value>
</property>
d) 解释:namenode需要指定两个参数,用于存放元数据和文件系统的URL. Datanode需指定要连接的namenode的rpc-address和http-address.以及数据存放位置dfs.datanode.data.dir.
6.然后编辑两台namenode的hadoop目录下 etc/hadoop/slaves文件.加入三台slave机器名:
Myhost3
Myhost4
Myhost5
7.现在需要格式化namenode, 由于namenode共享datanode,因此它们的clusterid需要有相同的名字.这里我们把名字设为 yuling .命令如下:
bin/hdfs namenode –format –clusterid yuling
两台机器格式话之后会在/home/yuling.sh/cluster-data下生成元数据目录.
8.启动Myhost1和Myhost2上的namenode和slave上datanode服务.命令如下:
sbin/start-hdfs.sh
分别在Myhost1和Myhost2下运行.
9.启动之后打开浏览器, 分别查看两namenode启动后状态. URL为:
Myhost1:50070和Myhost2:50070
10.这期间可能会遇到许多问题, 但是可以根据抛出的异常自己解决, 我这里就不多说了.
-------------------------------------------------------------------------------------------------------------------------
上面是转载于这里:http://www.blogjava.net/shenh062326/archive/2011/11/28/363472.html,按照此文章操作后还是报错,于是摸索了半天,成功了,我碰到的问题如下:
1.要在hadoop-env.sh里面配置JAVA_HOME,(把注释exprot java_home改成你的目录)。注意:hadoop-0.23 里是yarn-env.sh 要改成hadoop-env.sh,具体原因在libexec的某脚本里面
2.把slaves跟这个hadoop-env都移动到etc/hadoop里面去。具体原因也在libexec的某个脚本里面(做了个判断,如果conf目录存在,则用此作为目录,否则用etc/hadoop为配置目录)。
还有些问题有待解决:
1,报错
log4j:ERROR Could not find value for key log4j.appender.NullAppender
log4j:ERROR Could not instantiate appender named "NullAppender".
在你的hadoop文件夹中找到etc/hadoop/log4j.properties文件,在文件中添加:
:log4j.appender.NullAppender=org.apache.log4j.varia.NullAppender
2.老要输入密码,我ssh-keygen弄过了,访问其他机器正常,但但访问本机反而要密码,怎么搞的呢
在本机的authorized_keys加入本机生成的id_rsa.pub:
cat id_rsa.pub >>autuorized_keys