1. 程式人生 > >ubuntu14.04 hadoop在兩臺電腦上的搭建

ubuntu14.04 hadoop在兩臺電腦上的搭建

筆記本IP 115.27.116.52 master
桌上型電腦IP 162.105.13.237 slave1

筆記本:ubuntu12.04 64bit, hadoop-2.5.0,JDK1.7.0_51, 機器名 ubuntu
桌上型電腦:ubuntu14.04 64bit, hadoop-2.5.0,JDK1.8.0_11, 機器名 Tank
兩臺機器的使用者名稱都是flmeng,並且hadoop,JDK都安裝在/usr/local下面

筆記本和桌上型電腦上的hadoop已經配置好,在單機偽叢集分佈下可以正常工作。我以筆記本作為namenode,以桌上型電腦作為datanode

I 這一步對每一臺電腦都要設定

1 對於每一個電腦,都要修改 /etc/hostname為相應的名字
例如,對筆記本
sudo vim /etc/hostname 之後改成master
對臺式機
sudo vim /etc/hostname 改成 slave1

PS:
注意,有時候設定完hostname之後需要重啟機器。同時,注意hostname檔案下只能有你設定的hostname一個量,多了會出現ubuntu桌面沒有辦法正常啟動的錯誤.

2 修改/etc/hosts檔案,增加IP和hostname的對映關係
115.27.116.52 master
162.105.13.237 slave1
(注意只需要追加即可,原來的127.0.0.0之類的可以不必修改)



3 設定無密碼登入。這一步在單機偽叢集分佈的時候已經做過了。

4 配置 xml
1) core-site.xml
-------------
<configuration>
    <property>
    <name>fs.default.name</name>
    <value>hdfs://master:8020</value>
    </property>


    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/tmp</value>
    </property>
</configuration>

2) hdfs-site.xml
-------------
<configuration>

    <property>
    <name>dfs.replication</name>
    <value>1</value>
    </property>

    <property>    
    <name>dfs.name.dir</name>
    <value>${hadoop.tmp.dir}/dfs/name</value>
    </property>


    <property>
    <name>dfs.data.dir</name>
    <value>${hadoop.tmp.dir}/dfs/data</value>
    </property>

    <property>
    <name>fs.checkpoint.dir</name>
    <value>${hadoop.tmp.dir}/dfs/namesecondary</value>
    </property>

</configuration>

3) mapred-site.xml
-----------------
<configuration>

    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>

    <property>
    <name>mapred.local.dir</name>
    <value>${hadoop.tmp.dir}/mapred/local</value>
    <final>true</final>
    </property>

    <property>
    <name>mapred.task tracker.map.tasks.maximum</name>
    <value>2</value>    
    <final>true</final>
    </property>

    <property>
    <name>mapred.task tracker.reduce.tasks.maximum</name>
    <value>2</value>
    <final>true</final>
    </property>


</configuration>


4) slaves
-------------
slave1


5) yarn-site.xml
-------------------------
<configuration>

    <property>
        <name>yarn.resourcemanager.address</name>
     <value>master:8021</value>
    </property>

    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>

    <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>

    

    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
        </property>

        <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
        </property>

        <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master:8033</value>
        </property>

        <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:8088</value>
        </property>


</configuration>


6) hadoop-env.sh 及 yarn-env.sh中設定JAVA_HOME

PS:

1 注意在設定hadoop.tmp.dir的時候,一定要建立相應的目錄,並且賦予相應的目錄足夠的許可權,以便hadoop系統能夠進行讀寫


III啟動hadoop

1 在筆記本端
hadoop namenode -format 進行格式劃

2 sbin/start-dfs.sh
使用jps會看見,在master上面啟動了NameNode,SecondaryNameNode
在slave1上使用jps檢視,會看見上面啟動了 DataNode

3 sbin/start-yarn.sh
master端多了一個ResourceManager,slave1端多了一個NodeManager。


IV 執行wordcount作業。顯示成功

VI增加一個節點







PS
1 如果出現 java.io.NameNode:java.io.IOException:Cannot create directory,這是因為許可權不夠的問題造成的。
sudo chmod -R a+w /${hadoop.tmp.dir}。為了方便起見,最好將這個目錄放在使用者有許可權的目錄下,以免的對叢集中的每個點都要進行如此操作

2 兩臺機器之間仍然無法免密碼登入。即使重新啟動了電腦也不可以。

3 sbin/start-dfs.sh後,無法啟動datanode.檢視日誌(注意,datanode的日誌是在臺式機的hadoop安裝目錄/etc下的),顯示
014-08-16 02:49:32,599 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: hadoop1:8020
(並且該日誌是不斷增長的,說明namenode仍在不斷試圖連結到datanode

之後又出現瞭如下的錯誤
java.net.UnknownHostException: Tank: Tank: unknown error
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484)
    at org.apache.hadoop.security.SecurityUtil.getLocalHostName(SecurityUtil.java:186)
    at org.apache.hadoop.security.SecurityUtil.login(SecurityUtil.java:206)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1780)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1829)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:2005)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:2029)
Caused by: java.net.UnknownHostException: Tank: unknown error
    at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479)

錯誤slave DataNode的機器 /etc/hosts 下增加一行: 127.0.0.1  Tank即可(源自 http://lvdccyb.iteye.com/blog/1757047)

4.sbin/start-yarn.sh無法啟動Resourcemanager和DodeManager
NodeManager輸出日誌如下所示
java.net.UnknownHostException: Tank: Tank: unknown error
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484)
    at org.apache.hadoop.metrics2.impl.MetricsSystemImpl.getHostname(MetricsSystemImpl.java:515)
    at org.apache.hadoop.metrics2.impl.MetricsSystemImpl.configureSystem(MetricsSystemImpl.java:454)
    at org.apache.hadoop.metrics2.impl.MetricsSystemImpl.configure(MetricsSystemImpl.java:450)
    at org.apache.hadoop.metrics2.impl.MetricsSystemImpl.start(MetricsSystemImpl.java:181)
    at org.apache.hadoop.metrics2.impl.MetricsSystemImpl.init(MetricsSystemImpl.java:157)
    at org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.init(DefaultMetricsSystem.java:54)
    at org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.initialize(DefaultMetricsSystem.java:50)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:228)
    at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:425)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:472)
Caused by: java.net.UnknownHostException: Tank: unknown error
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479)
    ... 11 more

原因是<property>
      <name>yarn.resourcemanager.address</name>
      <value> master:8032</value>
      </property>

第三行hadoop1前面多加了一個空格,把空格去掉,就不會出現這樣的錯誤.同時resourcemanager也啟動