说明:本文档是个人研究配置Hadoop 集群过程后产生的,参考了别人的配置文档,同时结合自己实际的情况,解决遇到的问题后最终配置成功。
1准备机器 :没有多余机器,安装了vmware7.0 后模拟的 2 台系统,操作系统是 Ubuntu10.10
所有的系统必须有相同的用户和密码,这里两个系统都是用hadoop:hadoop 作用户名和密码
以下操作均是以hadoop 身份进行的。
2 根据机器 IP 地址更改 hosts 文件
说明:master 代表第一台机器,主节点( IP:202.112.1.50 ), slave 代表第二台机器,数据节点( IP:202.112.1.49 ),以下可能直接使用此名称。
Master上的 hosts 文件
127.0.0.1 hadoop1 localhost
202.112.1.50 hadoop1 hadoop1
202.112.1.49 hadoop2 hadoop2
Slave上的 hosts 文件
127.0.0.1 hadoop2 localhost
202.112.1.50 hadoop1 hadoop1
202.112.1.49 hadoop2 hadoop2
另外:需要将/etc/hostname文件内容更改为hadoop1或者hadoop2(不知道是否是必须,我这个该了的,OK)
(引用别人的:对于hadoop 来说,从 hdfs 来看,节点分为 namenode 和 datanode ,其中 namenode 只有一个, datanode 有多个;从 mapreduce 来看,节点分为 jobtracker 和 tasktracker ,其中 jobtracker 只有一个, tasktracker 有多个;)
3 安装 ssh (为什么要安装这个东西,我不知道,或者说可以去百度一下看看别人怎么说的,他们好像说集群中通信用 ssh ,谁在乎呢,安装吧)
Master和 Slave 机器上都要 ssh
命令: apt-get install ssh (没有多余配置了,哦,有一个需要输入Y 表示同意安装:::)
在master 机器上做以下操作
安装成功后执行以下命令:
[hadoop@hadoop1:~]$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
然后是
[hadoop@hadoop1:~]$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
在slave 机器上建立 .ssh 文件夹, master 上通过以上命令自己创建了一个, slave 就要自己动手了,毕竟是 slave 嘛。
[hadoop@hadoop2:~]$ mkdir .ssh
然后将master 上的 authorized_keys 拷贝到 slave 的 .ssh 文件夹下,可以通过以下命令:
[hadoop@hadoop1:~]$ scp ~/.ssh/authorized_keys hadoop2: /home/hadoop/.ssh/
测试一下:[hadoop@hadoop1:~] ssh hadoop2
提示是否连接,输入yes ,连接成功。以后就不需要输入 yes 了。只需要从 master 到 slave 的无密码连接,而不需要测试从 slave 到 master 的无密码连接;在 master 和 slave 机器上 .ssh 文件夹下的内容也是不完全一样的。
4安装 jdk
Ubuntu下执行 [hadoop@hadoop1:~] sudo apt-get instal sun-java6-jdk
Master和 Slave 机器都需要 jdk 环境。在 ubuntu 下 10.10 下是不需要再去设置 java_home 等环境变量的,安装完后直接输入 java -version 和 javac -version 测试一下, OK 。
至于其他Linux 环境,需要安装 jdk 和配置 jdk 环境变量的,请百度 /Google 吧,直到 java -version 返回正确结果为止。
5 下载 hadoop0.20.2
http://mirror.bjtu.edu.cn/apache/hadoop/core/hadoop-0.20.2/
6 部署 Hadoop
在master 机器上更改配置,然后再拷贝到 slave 机器上,这样所有机器上的 hadoop 就能保证一模一样了。
假定放到hadoop 用户根目录下:
首先解压 hadoop-0.20.2.tar.gz
[hadoop@hadoop1:~]$ tar -zxvf hadoop-0.20.2.tar.gz
Ok,更改配置开始了,包括 hadoop-env.sh , masters , slaves , core-site.xml, hdfs-site.xml, mapred-site.xml 一共 6 个文件。
hadoop-env.sh
添加以下两行(根据实际路径可能有变化哦):
export JAVA_HOME=/usr/lib/jvm/java-6-sun
export HADOOP_HOME=/home/hadoop/hadoop-0.20.2
masters:
hadoop1
slaves:
hadoop2
core-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://202.112.1.50:9000</value>
<description>这里 202.112.1.50 这个是指 master 机器 IP 地址,当然可以使用 hadoop1 主机名,条件是 DNS 能够解析,否则会有问题, datanode 连接 namenode 时会报连接不上的错误。所以实际应用中根据 master 机器的 IP 来更改吧,最好使用 IP 这样就不存在问题了。 The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri's authority is used to determine the host, port, etc. for a filesystem.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/HadoopTemp</value>
<description>这里这个 HadoopTemp 目录需要自己手动建立,在 master 和 slave 机器上都需要手动创建 </description>
</property>
</configuration>
hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>这里指定数据文件默认保留几份备份,默认的是 3 ,自己可以指定,测试时可以指定 1 减少空间需求。 Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.
</description>
</property>
</configuration>
mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value> 202.112.1.50 :9001</value>
<description>同意这里指定 Master 的 IP 或者 host ,最好指定 IP 。 The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task.
</description>
</property>
</configuration>
至此,所有配置已经完成,hadoop 的配置文件只需要更改自己需要更改的,以上就仅仅更改了很少属性,而其自身有相当多的属性, hadoop 在工作时如果用户更改了,则使用更改后的属性值,如果没有在 *-site.xml 文档里出现,则 hadoop 使用默认的属性,默认属性值 *-default.xml 文档里(默认文档中 /hadoop-0.20.2/src/ 目录下);当然也可以将整个 -default.xml 文档内容拷贝过来,修改需要更改的属性。
以上配置是在master 上进行的,现在将整个 hadoop-0.20.2 文件夹拷贝到 slave 机器上,使用命令:
[hadoop@hadoop1:~]$ scp -r ~/hadoop-0.20.2 hadoop2:/home/hadoop/
7 启动 hadoop
Hadoop的命令在 /hadoop-0.20.2/bin/ 目录下,启动过程在 master 机器上进行。
启动之前需要进行格式化,类似于Windows 文件系统格式化, hadoop 的文件系统也需要格式化后才能被 hadoop 使用。
[hadoop@hadoop1:hadoop-0.20.2]$ bin/hadoop namenode -format
此时配置文件里设置的HadoopTemp 目录会发生变化, check 一下了。如果此命令出错,请百度 /Google 了。
启动:
[hadoop@hadoop1:hadoop-0.20.2]$ bin/start-all.sh
如果有错误,请查看log 文件
测试:
[hadoop@hadoop1:hadoop-0.20.2]$ bin/hadoop dfs -mkdir testdir #创建一个文件夹
[hadoop@hadoop1:hadoop-0.20.2]$ bin/hadoop dfs -put /home/hadoop/test.txt /testdir/test.txt
#上传一个文件
[hadoop@hadoop1:hadoop-0.20.2]$ bin/hadoop dfs -ls #列出文件目录
当然也可以访问:http://202.112.1.50:50070
http://202.112.1.50:50030
8 问题及解决
1 安装 jdk 时找不到 jdk
我在终端输入:sudo apt-get install sun_java6_jdk
出现了问题:package sun_java6_jdk 不能被找到
apt-get提示了以下信息:
Package sun-java6-jdk is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package sun-java6-jdk has no installation candidate
解决办法如下:
1. 在终端输入: sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" 回车
2. 在终端输入: sudo apt-get update, 回车
3. 在终端输入: sudo apt-get install sun_java6_jdk
OK
问题解决了
2 虚拟机上不能联网问题,即不能自动获得 IP
解决办法:设置固定IP
更改/etc/network/interfaces 文件内容如下:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 9.186.54.50
netmask 255.255.255.0
gateway 9.186.54.1
然后重新启��新IP : sudo /etc/init.d/networking restart
3最严重的问题是启动 hadoop 后一切都表现正常 ,然而执行 bin/hadoop dfs -put /home/hadoop/test.txt /testdir/test.txt命令时出错:
10/01/07 19:50:23 INFO hdfs.DFSClient: org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /user/administrator/chen3/NOTICE.txt could only be replicated to 0 nodes, instead of 1
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1270)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:351)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:452)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:892)
百度一下有很多相关的解决办法,当然这些办法都没有解决我的错误,也就是说有其它原因引起了该错误,最后查得该错误就是配置文件里使用了 hostname而不是 IP 地址,因为没有 DNS 服务器来解析,所以 ...
推荐阅读文章