基本都是参考网上的资料,进行搭建。过程中遇到的一些问题,也进行记录。
单机、伪分布的搭建
参考网站:http://www.cnblogs.com/tippoint/archive/2012/10/23/2735532.html
单机版或者伪分布模式的搭建,其实很简单。
首先对于用户,一般教程都会创建一个新的hadoop用户。这是由于,在进行集群时,会需要各电脑上有同样的user name。(本机的用户名是hadoop,有一次使用scp时,直接就连接到另一台电脑的hadoop用户上)。
新加的用户,可以在sudo gedit /etc/sudoers 里面,添加这个帐号与root具有相同的权限。
这时候,一般还需要更改系统的hostname。更改时,需要注意同时需要更改 /etc/hostname, /etc/hosts里的信息。还要重启后有效。
中间遇到连接不到datanode的情况,就是因为在/etc/hosts里,没有加上 127.0.0.1 hostname的对应关系。导致它不知道往哪里去找。
当跑起hadoop后,bin/start-all.sh, 可以使用jps命令,来看下是不是各个节点都跑起来的。或者到logs里面去查看信息。
单机版的话,运行的input 文件夹,是在本地,生成的文件夹output也是本地。但是当使用到伪分布或者全分布式,就需要先将本地的文件夹放进hdfs里面。
本地配置,其实主要就是更改conf/hadoop-env.sh的java环境。
还有conf下的core-sit.xml, hdfs-site.xml, mapred-site.xml。
还有ssh协议。将它添加到autherized_keys文件里。
全分布模式:
参考网站:http://blog.csdn.net/wangfaqiang/article/details/7244552
全分布模式,其实也差不多。其实可以在一台电脑上完成所有的配置后,在通过scp拷贝到其他电脑去。
配置的运行状态还是conf下的core-sit.xml, hdfs-site.xml, mapred-site.xml。
这次还添加了master,slaves这两个文件,表明谁是namenode和jobtasker。
然后注意在各电脑的/etc/hosts里面,添加机器名与他们的ip的对应关系。
这里注意的一点是,在namenode的电脑上,不再使用127.0.0.1 hostname对应,而应该改为实际ip hostname这样的对应。在我电脑的测试如此。不知道这样是不是有问题。。
开始hadoop文件系统跑不起来,总是报错“could only be replicated to 0 nodes, instead of 1”。
去datanode的节点,查看logs信息,发现报错是指连不上namenode。
去namenode的节点,查看logs信息,它说是:“INFO org.apache.hadoop.ipc.Server: IPC Server handler 3 on 49000, call addBlock(../mapred/system/jobtracker.info, DFSClient_NONMAPREDUCE_-570939224_1, null) from 127.0.0.1:47325: error: java.io.IOException:”,里面有127.0.0.1。
后来将/etc/hosts里面,本机的改为“实际ip hostname”这样的对应,成功。
如果是改成“127.0.1.1”也是提示datanode连不上namenode。
这个问题解决了,就很顺畅了。
可以先在一台电脑配好所有的东西,然后使用scp命令,通过ssh协议拷贝到其他电脑上,包括hadoop文件夹,和ssh的autherized_keys。仅需更改 java的位置。
另,附上core-site.xml等三个文件的程序,第二个网站上的有错.....这个也导致我郁闷了好久....
core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://light-ubuntu:49000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>
说明:
1)fs.default.name是NameNode的URI。hdfs://主机名:端口/
2)hadoop.tmp.dir :Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。
mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>light-ubuntu:49001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>
说明:
1)mapred.job.tracker,指明job tracker交互端口。
2)mapred.local.dir,MapReduce产生的中间数据存放目录,以,号隔开,hdfs会把数据存在这些目录下,一般这些目录是不同的块设备,不存在的目录会被忽略掉
hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/name1, /home/hadoop/name2</value>
<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>
<value>2</value>
</property>
</configuration>
说明:
1)dfs.name.dir,name node的元数据,以,号隔开,hdfs会把元数据冗余复制到这些目录,一般这些目录是不同的块设备,不存在的目录会被忽略掉
2)dfs.data.dir,data node的数据目录,以,号隔开,hdfs会把数据存在这些目录下,一般这些目录是不同的块设备,不存在的目录会被忽略掉
3)dfs.replication ,文件复制的副本数,如果创建时不指定这个参数,就使用这个默认值作为复制的副本数,默认值是3