IT技术博客大学习 共学习 共进步

hadoop笔记 (1):安装和配置

ou的笔记ou的笔记 2012-09-17 19:04:47 浏览 2,101 次

记录一下hadoop集群的搭建过程,一共3台机器,操作系统都是debian 6,hadoop版本是1.0.3,jre是源里的openjdk-6。hadoop官网的说明挺详细,就是不能快速搭建出一个能跑的环境。在网上找到一篇文章(见参考资料[1]),虽然文章中用的是0.20版本,但是在1.0.3上也适用。

这里使用master,slave1和slave2分别作为三台机器的主机名。为了操作方便,每台机器上都有一个用户hadoop,密码都一样。以下的配置操作都在master上进行。

hadoop的配置

把下载到的hadoop-1.0.3.tar.gz解压到hadoop的家目录下,建立一个软链接hadoop指向解压得到的目录hadoop-1.0.3,这样以后更新只需重新建立软链接指向新版本即可。

进入解压后的目录,根据实际情况修改conf/hadoop-env.sh中的JAVA_HOME,使其指向jdk的安装目录:

export JAVA_HOME=/usr/lib/jvm/java-6-openjdk

在1.0.3版本中不需要HADOOP_HOME这个环境变量,如果设置了这个变量执行命令的时候会提示”Warning: $HADOOP_HOME is deprecated.”。

然后修改conf/core-site.xml:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<!-- Put site-specific property overrides in this file. -->
 
<configuration>
    <property>
        <!-- 用于dfs命令模块中指定默认的文件系统协议 -->
        <name>fs.default.name</name>
        <value>hdfs://master:9000/</value>
    </property>
</configuration>

修改conf/hdfs-site.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<!-- Put site-specific property overrides in this file. -->
 
<configuration>
    <property>
        <!-- DFS中存储文件命名空间信息的目录 -->  
        <name>dfs.name.dir</name>  
        <value>/home/hadoop/data/dfs.name.dir</value>
    </property>
    <property>  
        <!-- DFS中存储文件数据的目录 -->  
        <name>dfs.data.dir</name>   
        <value>/home/hadoop/data/dfs.data.dir</value>  
    </property>  
    <property>  
        <!-- 是否对DFS中的文件进行权限控制(测试中一般用false)-->  
        <name>dfs.permissions</name>  
        <value>false</value>  
    </property>  
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

修改conf/mapred-site.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<!-- Put site-specific property overrides in this file. -->
 
<configuration>
    <property>
        <!-- 用来作JobTracker的节点的(一般与NameNode保持一致) -->
        <name>mapred.job.tracker</name>
        <value>master:9001</value>
    </property> 
    <property>
        <!-- map/reduce的系统目录(使用的HDFS的路径) -->
        <name>mapred.system.dir</name>
        <value>/</value>
    </property>
    <property>
        <!-- map/reduce的临时目录(可使用“,”隔开,设置多重路径来分摊磁盘IO) -->
        <name>mapred.local.dir</name>
        <value>/home/hadoop/data/mapred.tmp.dir</value>
    </property>
</configuration>

最后在conf/masters中添加master机器的ip或主机名:

master

在conf/slaves中添加所有salves,一行一个:

slave1
slave2

其它的配置项使用默认的即可,以上选项具体作用可以参考官网说明和参考资料[1]。

然后把配置好的hadoop-1.0.3整个目录分别复制到每台slave机器的hadoop的家目录下,并且建立软链接hadoop。至此hadoop的配置就完成了。

ssh的配置

因为master需要ssh登录到slave上进行某些操作,因此使用公钥认证的方式,避免手动输入密码。

使用命令

ssh-keygen -t rsa

在$HOME/.ssh下生成两个文件:id_rsa和id_rsa.pub。把id_rsa.pub的内容添加到authorized_keys中:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

把authorized_keys复制到每个slave上的~/.ssh目录下。完成后在master测试一下ssh登录slave1和slave2,这时应该能直接登录而不用手动输入密码了。

启动和停止hadoop

以上配置完后就可以启动hadoop了。先格式化新的hdfs:

$HOME/hadoop/bin/hadoop namenode -format

然后启动hdfs服务:

$HOME/hadoop/bin/start-dfs.sh

最后启动map/reduce:

$HOME/hadoop/bin/start-mapred.sh

停止hadoop时先停止map/reduce服务:

$HOME/hadoop/bin/stop-mapred.sh

再停止hdfs服务:

$HOME/hadoop/bin/stop-dfs.sh

另外也可以用$HOME/hadoop/bin下的start-all.sh和stop-all.sh来启动和停止。

一些问题和解决方法

从网上找到的答案,顺手做的笔记,没记下出处。

Q:执行hadoop -put 时报错:Name node is in safe mode.
A:hadoop dfsadmin -safemode leave

Q:reduce执行到16%或17%时停住不动,查看hadoop-{user}-jobtracker-{host}.log中有这样一条错误提示:Failed fetch notification #1 for map task:
A:在每台机器中的/etc/hosts中填写其它机器的ip和对应的主机名,不管在配置文件中写的是ip还是主机名。

Q:出现错误:File /user/hadoop/test could only be replicated to 0 nodes, instead of 1
A:停止hadoop,删除hdfs目录和/tmp/hadoop-{user}*和/tmp/hsperfdata_{user}/,重新格式化,然后重启hadoop服务。

Q:出现错误:org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for ttprivate/taskTracker/hadoop/jobcache/job_201207301453_0036/jobToken
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:381)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:146)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:127)
at org.apache.hadoop.mapred.TaskTracker.localizeJobTokenFile(TaskTracker.java:4271)
at org.apache.hadoop.mapred.TaskTracker.initializeJob(TaskTracker.java:1177)
at org.apache.hadoop.mapred.TaskTracker.localizeJob(TaskTracker.java:1118)
at org.apache.hadoop.mapred.TaskTracker$5.run(TaskTracker.java:2430)
at java.lang.Thread.run(Thread.java:636)
A:重启一下出问题的slave,不行的话同上操作

Q:Caused by: java.lang.OutOfMemoryError: Java heap space
A:修改conf/mapred-site.xml,修改mapred.child.java.opts的值为-Xmx512m或更大。

参考资料

[1] Hadoop集群安装详细步骤|Hadoop安装配置
[2] Hadoop Cluster Setup

建议继续学习

  1. Facebook的实时Hadoop系统 (阅读 11,402)
  2. hadoop rpc机制 && 将avro引入hadoop rpc机制初探 (阅读 6,082)
  3. Hadoop的map/reduce作业输入非UTF-8编码数据的处理原理 (阅读 5,546)
  4. 百度是如何使用hadoop的 (阅读 5,004)
  5. Hadoop超级安装手册 (阅读 4,662)
  6. Hadoop集群间Hadoop方案探讨 (阅读 4,443)
  7. 使用hadoop进行大规模数据的全局排序 (阅读 4,423)
  8. Hadoop安装端口已经被占用问题的解决方法 (阅读 3,881)
  9. Hadoop现有测试框架探幽 (阅读 3,803)
  10. 分布式计算平台Hadoop 发展现状乱而稳定的解读 (阅读 3,806)