• 卡卡   2014/7/4 11:45:00
  • 如何正确配置hadoop环境
  • 关键字: hadoop 环境配置 集群
  •  hadoop的配置,个人感觉是非常容易出问题。一个原因是要配置的地方多,还有个原因就是集群配置要在几台机器上都配置正确,才能保证配置好hadoop,跑起任务。

    经过昨晚加今天上午的折腾,总算成功配好了集群模式,其中苦不堪言啊,中间好几次都想要放弃。这里总结了一下配置的几个要点,分享给大家,以使大家少走冤枉路。

    1.基本配置

    安装JDK1.6(这是必须的吧,无须解释)
    下载Hadoop包
    下载后放在用户主目录下解压

    配置JAVA_HOME路径
    conf/hadoop-env.sh


    # The java implementation to use.  Required.
    # export JAVA_HOME=/usr/lib/j2sdk1.5-sun

    改为

    # The java implementation to use.  Required.
    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk

    这里的java具体目录可能会有所不同)

    保存并关闭

    输入以下命令:

    $ bin/hadoop

    如果能看到hadoop的程序调用的使用说明,此时说明你已经成功配置好了这部分。(单机模式)


    2.集群模式配置

    配置好了单机模式后,即可配置集群模式。集群模式的结构是一台master机器+若干台slave机器。

    (1)编辑/etc/hosts文件(master,slave都要):

    假设master机器:

    IP:192.168.0.1        机器名:master

    假设slaves机器:

    IP:192.168.0.2        机器名:slave1

    IP:192.168.0.3        机器名:slave2

    IP:192.168.0.4        机器名:slave3

    IP:192.168.0.5        机器名:slave4

     加入如下项:

    # /etc/hosts
    192.168.0.1    master
    192.168.0.2    slave1

    192.168.0.3    slave2

    192.168.0.4    slave3

    192.168.0.5    slave4

    注意:这里的”master“和”slave1“等等均指你的机器名,如在终端中有[email protected]:~/hadoop$,则DY1-U09为机器名。

    (2)在hadoop目录下新建几个文件夹(master,slave都要):

    $ mkdir tmp

    $ mkdir hdfs

    $ mkdir hdfs/name

    $ mkdir hdfs/data

    (3)在conf目录中,编辑以下文件(目录path/to/your/hadoop为你自己的相应hadoop目录)(master,slave都要):

    conf/core-site.xml:

    <configuration>
        <property>
            <name>fs.default.name</name>
            <value>hdfs://(你的master机器名):9000</value>
        </property>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/path/to/your/hadoop/tmp</value>
        </property>

    </configuration>

    conf/hdfs-site.xml:

    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>3</value>
        </property>
        <property>
            <name>dfs.name.dir</name>
            <value>/path/to/your/hadoop/hdfs/name</value>
        </property>
        <property>
            <name>dfs.data.dir</name>
            <value>/path/to/your/hadoop/hdfs/data</value>
        </property>
    </configuration>

    conf/mapred-site.xml:

    <configuration>
        <property>
            <name>mapred.job.tracker</name>
            <value>(你的master机器名):9001</value>
        </property>
    </configuration>

    (4)SSH Access(仅对master)

    master必须能以passless ssh访问slaves

    [email protected]:~$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]

    [email protected]:~$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]

    [email protected]:~$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]

    [email protected]:~$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]


    执行以上的命令都需要输入对方的密码

    完成后,可以在master上分别运行:ssh slave1/slave2/slave3/slave4

    看是否不需要输入密码,如果不需要则设置正确。

    (5)配置conf/masters,conf/slaves(仅对master)

    更新conf/masters文件如下:

    master

    更新conf/slaves文件如下:

    slave1

    slave2

    slave3

    slave4

    (6)开启集群:

    在master上运行:$ bin/start-all.sh

    可以在master和slave上运行jps命令,查看开启的daemons:

    此时,master机器上应当有namenode,jobtracker,secondarynamenode,

    而slave机器上有datanode,tasktracker

    开启后要等一段时间使服务完全启动,否则命令将没有响应。具体什么时候完全启动可以查看

    http://localhost:50030/ – web UI for MapReduce job tracker(s)
    http://localhost:50060/ – web UI for task tracker(s)
    http://localhost:50070/ – web UI for HDFS name node(s)
    以上的几个网址可以让你获取Hadoop的运行状况信息。当网页可以载入的时候即可。

    (7)测试一下:

    首先需要Format namenode

    (格式化之前最好在所有机器上清空hdfs/data,hdfs/name,以免造成冲突)

    在master上运行: $ bin/hadoop namenode -format

    在master机器上运行WordCount:

    首先在dfs中创建input目录

    $ bin/hadoop dfs -mkdir input

    将conf中的文件拷贝到dfs中的input:

    $ bin/hadoop dfs -copyFromLocal conf/* input

    运行WordCount

    $ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount input output

    显示输出结果文件:

    $ bin/hadoop dfs -cat output/*

    3.配置过程问题归纳:

    (1)dfs可以ls,mkdir,但是copyFromLocal出错,提示could only be replicated to 0 nodes, instead of 1:

    这个问题非常容易遇到,而且原因可能也不相同,若出现此问题,请尝试以下步骤:

    使用jps检查master和slave上是否符合:master机器上应当有namenode,jobtracker,secondarynamenode,而slave机器上有datanode,tasktracker。

    若不符合请仔细检查master和slave上的/etc/hosts文件、conf/core-site.xml、conf/mapred-site.xml、conf/hdfs-site.xml。

    检查master和slave上的/etc/hosts文件,如果其中有127.0.0.1与你的相应机器名对应的项,请将其删掉,务必保证此文件中对应于你的机器名的ip地址为你在局域网中的ip。

    运行stop-all.sh关闭进程;

    Format namenode(格式化之前最好在所有机器上清空hdfs/data,hdfs/name,以免造成冲突)——在master上运行: $ bin/hadoop namenode -format

    运行start-all.sh开启服务;

    待服务完全开启后测试。

    (2)提示处于safemode,报错。

    运行命令bin/hadoop dfsadmin -safemode leave后重试。

    (3)其他问题:

    配置过程出错的大部分问题都出在hdfs不能正常使用,具体表现是http://localhost:50070查看namenode显示

    Configured Capacity     :     0 KB
    DFS Used    :    0 KB
    Non DFS Used    :    0 KB
    DFS Remaining    :    0 KB
    DFS Used%    :    100 %
    DFS Remaining%    :    0 %
    Live Nodes     :    0
    Dead Nodes     :    0

    若出现此问题,请仔细检查master和slave上的/etc/hosts文件,以及三个xml配置文件保证没有地方写错,所有机器上都有在hadoop目录执行

    $ mkdir tmp

    $ mkdir hdfs

    $ mkdir hdfs/name

    $ mkdir hdfs/data