Hadoop集群配置

来源:互联网 发布:mac最大化窗口的快捷键 编辑:程序博客网 时间:2024/05/19 03:18

该文大部分是转载自 真实的归宿 所写的  Hadoop集群配置(最全面总结),原文链接为

http://blog.csdn.net/hguisu/article/details/7237395

文章写的很好,我大体是按照他的方法进行配置的,最终配置成功了,不过之间走了很多弯路,也查了很多其它的资料,为了避免大家再走弯路,我

写了这篇笔记,完善了一些容易出错的细节,下面是修改后的文章:


红色是我添加的注记和容易出错的地方(至少我是吃过亏),还有一些相关资料的链接。


通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode作为TaskTracker,这些机器是slaves。


实验环境搭建


1  准备工作

     操作系统:Ubuntu
     部署:VirtualBox
     在VirtualBox安装好一台Ubuntu虚拟机后,可以导出或者克隆出其它台虚拟机。

    由于Slaves配置都相同,因此建议,开始时建立两台虚拟机,一台配置Master,一台配置Slave,然后其它Slave在配置完成后克隆,再稍作修改。

下面的例子是以node1、node2、node3为例的,你只需要先配置node1、node2即可。
     说明:
     保证虚拟机的ip和主机的ip在同一个ip段,这样几个虚拟机和主机之间可以相互通信。
     为了保证虚拟机的ip和主机的ip在同一个ip段,虚拟机连接设置为Host-Only模式,虚拟机ip不要DHCP,要手动设置,防止重新开机后下面的配置文件失效。虚拟机网络设置请参考本博客前面介绍虚拟机网络搭建的文章。

     准备机器:一台master,若干台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例如:
     192.168.56.101 node1(master)   
     192.168.56.102 node2 (slave1)   
     192.168.56.103 node3 (slave2)

     除了修改/etc/hosts文件,还要修改/etc/hostname,改为对应的node1或者node2、node3,否则测试时会出现Too many fetch-failures错误。
     主机信息:  

机器名  IP地址作用node1192.168.56.101NameNode、JobTrackernode2192.168.56.102DataNode、TaskTrackernode3192.168.56.103DataNode、TaskTracker


2 安装JDK

     你可以在主机上下载jdk的压缩文件,通过主机和虚拟机之间的共享文件夹传到虚拟机,然后在虚拟机上安装,具体方法请参考本博客前面的设置虚拟机共享文件夹和linux安装jdk的文章。


3下载、创建用户

    创建用户hadoop

    useradd -m hadoop

    创建的hadoop命令行前面的提示符可能很奇怪,在使用adduser/useradd新建用户时通过--shell参数指定使用bash,默认的/bin/sh是指向dash的对于已创建用户,自己修改/etc/passwd,将/bin/sh改成/bin/bash


    在所有的机器上都建立相同的目录,也可以就建立相同的用户,最好是以该用户的home路径来做hadoop的安装路径。
    例如在所有的机器上的安装路径都是:/home/hadoop/hadoop-0.20.203,这个不需要mkdir,在/home/hadoop/下解压hadoop包的时候,会自动生   成)
   解压时要以hadoop用户的身份,不能是root


4 安装ssh和配置

    注意:在所有机子都需要安装ssh。

    ssh的安装建议参考本博客前面的linux配置ssh实现无密码登录的文章。


5 安装Hadoop

#切换为hadoop用户

su hadoop

wgethttp://apache.mirrors.tds.net//hadoop/common/hadoop-0.20.203.0/hadoop-0.20.203.0rc1.tar.gz

也可以用前面安装jdk的方法,在本机下载压缩文件,然后通过共享文件夹传到虚拟机中安装,版本可能不同,这个应变能力相信你还是有的。。

另外再次强调一下,需要用hadoop身份操作。

下载安装包后,直接解压安装即可:

$ tar -zxvf hadoop-0.20.203.0rc1.tar.gz 

1 ) 安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。并且安装路径要一致,如果我们用HADOOP_HOME指代安装的根路径,通常,集群里的所有机器的     
     HADOOP_HOME路径相同。
2 )  如果集群内机器的环境完全一样,可以在一台机器上配置好,然后把配置好的软件即hadoop-0.20.203整个文件夹拷贝到其他机器的相同位置即可。
3 )  可以将Master上的Hadoop通过scp拷贝到每一个Slave相同的目录下,同时根据每一个Slave的Java_HOME 的不同修改其hadoop-env.sh 。
4)   为了方便,使用hadoop命令或者start-all.sh等命令,修改Master上/etc/profile 新增以下内容:仅需Master,即node1)
    export HADOOP_HOME=/home/hadoop/hadoop-0.20.203
    exportPATH=$PATH:$HADOOP_HOME/bin
   修改完毕后,执行source /etc/profile 来使其生效。  
5)配置conf/hadoop-env.sh文件(所有node)
#添加

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

这里修改为你的jdk的安装位置。



6 集群配置


    1)配置文件:conf/core-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
 <name>fs.default.name</name>
  <value>hdfs://node1: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格式化的命令。

2)配置文件:conf/mapred-site.xml

<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>mapred.job.tracker</name>
  <value>node1:49001</value>
</property>
<property>
  <name>mapred.local.dir</name>
 <value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>

1)mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。

3)配置文件:conf/hdfs-site.xml

<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/name1, /home/hadoop/name2</value> #hadoop的name目录路径
<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>
  <!-- 我们的集群又两个结点,所以rep两份 -->
  <value>2</vaue>
</property>
</configuration>

1)   dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。
2)   dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。
3)dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。

注意:此处的name1、name2、data1、data2目录不能预先创建,hadoop格式化时会自动创建,如果预先创建反而会有问题。

   4)配置masters和slaves主从结点

配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。

vi masters:
输入:

node1

vi slaves:

输入:
node2
node3

    

    5)完成其它slave的克隆与配置

    你可以选择在一台虚拟机完成jdk的安装后就进行克隆,或者在ssh配置完成后,也可以上一步完成后现在才进行克隆工作,我感觉最后者好,只要改改文件即可,不需要重新配置ssh,总之,克隆完成后,你要对克隆的虚拟机进行检查,并参照对node2这个slave的配置进行微调。
    以最后进行克隆(jdk、ssh不需要重新配置,如果你不是这个时候克隆需要自行重新配置ssh、安装hadoop等)为例,大概有以下易忽略的2个地方:
    1、根据 /etc/hosts 文件设置 ip
    2、 /etc/hostname 这个文件是主机名称,这个是不同的,需要修改
    另外,最好从头开始检查一遍,包括配置文件、环境变量、jdk、ssh登录的测试等。



7 格式化一个新的分布式文件系统

先格式化一个新的分布式文件系统

$ cd hadoop-0.20.203
$ bin/hadoop namenode -format

成功情况下系统输出:

12/02/06 00:46:50 INFO namenode.NameNode:STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = ubuntu/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.20.203.0
STARTUP_MSG:   build =http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203-r 1099333; compiled by 'oom' on Wed May 4 07:57:50 PDT 2011
************************************************************/

12/02/0600:46:50 INFO namenode.FSNamesystem: fsOwner=root,root
12/02/06 00:46:50 INFO namenode.FSNamesystem:supergroup=supergroup
12/02/06 00:46:50 INFO namenode.FSNamesystem:isPermissionEnabled=true
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name1 has been successfully formatted.
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name2 has been successfully formatted.
12/02/06 00:46:50 INFO namenode.NameNode:SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode atv-jiwan-ubuntu-0/127.0.0.1
************************************************************/


查看输出保证分布式文件系统格式化成功
执行完后可以到master机器上看到/home/hadoop/name1和/home/hadoop/name2两个目录。在主节点master上面启动hadoop,主节点会启动所有从节点的hadoop。



8 启动所有节点

启动方式1

$ bin/start-all.sh (同时启动HDFS和Map/Reduce)
系统输出:

starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-ubuntu.out
node2: starting datanode, loggingto /usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node3: starting datanode, loggingto /usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node1: starting secondarynamenode,logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-ubuntu.out
starting jobtracker, logging to/usr/local/hadoop/logs/hadoop-hadoop-jobtracker-ubuntu.out
node2: starting tasktracker,logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
node3: starting tasktracker,logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
As you can see in slave's output above, it will automatically format it's storage directory(specified by dfs.data.dir) if it is not formattedalready. It will also create the directory if it does not exist yet.


执行完后可以到master(node1)和slave(node1,node2)机器上看到/home/hadoop/data1和/home/hadoop/data2两个目录。

启动方式2

启动Hadoop集群需要启动HDFS集群和Map/Reduce集群。

在分配的NameNode上,运行下面的命令启动HDFS:
$ 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守护进程。



9 关闭所有节点

从主节点master关闭hadoop,主节点会关闭所有从节点的hadoop。

$ bin/stop-all.sh 

Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).

${HADOOP_HOME}就是安装路径.


如果7、8、9中出现了错误,请从头认真测试检查master和slave的配置,尤其是克隆的slave



测试

1)  使用jps查看进程

要想检查守护进程是否正在运行,可以使用 jps 命令(这是用于 JVM 进程的ps 实用程序)。这个命令列出 5 个守护进程及其进程标识符。

结果大致如下:

Master:

2112Jps

1916SecondaryNameNode

1650NameNode

1992JobTracker

Slave:

1915TaskTracker

2019Jps

1716DataNode

2)将输入文件拷贝到分布式文件系统:
$ bin/hadoop fs -mkdir input
$ bin/hadoop fs -put conf/core-site.xml input

可能会出现安全模式无法操作的错误,可以退出安全模式 hadoop dfsadmin -safemode leave

运行发行版提供的示例程序:
$ bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'name'

hadoop-0.20.2-examples.jar名称可能不同,是hadoop安装文件夹下的那个名称里有examples的jar文件

6.补充
Q: bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'name' 什么意思啊?
A: bin/hadoop jar(使用hadoop运行jar包) hadoop-0.20.2_examples.jar(jar包的名字) grep (要使用的类,后边的是参数)input output 'name'
整个就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。 
Q: 什么是grep?
A: A map/reduce program that counts the matches of a regex in the input.

查看输出文件:

将输出文件从分布式文件系统拷贝到本地文件系统查看:
$ bin/hadoop fs -get output output 
$ cat output/*

或者

在分布式文件系统上查看输出文件:
$ bin/hadoop fs -cat output/*

统计结果如下:

5 name


测试可能出现的错误与处理:

  1) Too many fetch-failures

  异常现象:

11/08/16 03:38:28 INFO mapred.JobClient: Task Id : attempt_201108160249_0001_m_000001_0, Status : FAILED

Too many fetch-failures

11/08/16 03:38:28 WARN mapred.JobClient: Error reading task outputConnection refused

11/08/16 03:38:28 WARN mapred.JobClient: Error reading task outputConnection refused

  解决方案:

  按上面介绍的配置要求修改集群中所有节点的计算机名,即修改/etc/hostname和/etc/hosts。

  2) Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out.

  异常现象:

11/08/16 03:37:41 INFO mapred.JobClient:  map 100% reduce 0%

11/08/16 03:37:58 INFO mapred.JobClient: Task Id : attempt_201108160249_0001_r_000000_0, Status : FAILED

Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out.

11/08/16 03:37:58 WARN mapred.JobClient: Error reading task outputConnection refused

11/08/16 03:37:58 WARN mapred.JobClient: Error reading task outputConnection refused

11/08/16 03:38:08 INFO mapred.JobClient:  map 100% reduce 16%

  解决方案:

  需要修改2个文件:

vi /etc/security/limits.conf

加上:

* soft nofile 102400

* hard nofile 409600

 

vi /etc/pam.d/login

加上:

session    required     /lib/security/pam_limits.so


更多的错误解决请参考:

http://tech.it168.com/a2011/0828/1238/000001238692_all.shtml

HDFS常用操作

hadoopdfs -ls 列出HDFS下的文件
hadoop dfs -ls in 列出HDFS下某个文档中的文件
hadoop dfs -put test1.txt test 上传文件到指定目录并且重新命名,只有所有的DataNode都接收完数据才算成功
hadoop dfs -get in getin 从HDFS获取文件并且重新命名为getin,同put一样可操作文件也可操作目录
hadoop dfs -rmr out 删除指定文件从HDFS上
hadoop dfs -cat in/* 查看HDFS上in目录的内容
hadoop dfsadmin -report 查看HDFS的基本统计信息,结果如下
hadoop dfsadmin -safemode leave 退出安全模式
hadoop dfsadmin -safemode enter 进入安全模式


添加节点

可扩展性是HDFS的一个重要特性,首先在新加的节点上安装hadoop,然后修改$HADOOP_HOME/conf/master文件,加入 NameNode主机名,然后在NameNode节点上修改$HADOOP_HOME/conf/slaves文件,加入新加节点主机名,再建立到新加节点无密码的SSH连接

运行启动命令:

start-all.sh

然后可以通过http://(Masternode的主机名):50070查看新添加的DataNode