2013-04-17 54 views
1

首先,我安裝了Hadoop(0.15.2)並設置了3個節點的集羣:NameNode,DataNode和JobTracker各一個。所有的守護進程都在運行。但是當我發出任何命令時,我得到上述錯誤。例如,當我做一個copyFromLocal,我得到以下錯誤:在NFS上安裝Hadoop

我錯過了什麼?

更多詳細信息: 我試圖在NFS文件系統上安裝Hadoop。我已經安裝了1.0.4版本,並試圖運行它,但無濟於事。 1.0.4版本不啓動datanode。 datanode的日誌文件是空的。因此我轉回到0.15版本,它至少啓動了所有的守護進程。

我認爲這個問題是由於底層的NFS文件系統造成的,即所有datanode和master使用相同的文件和文件夾。但我不確定這是否屬實。 但我沒有看到任何理由,我不應該能夠在NFS上運行Hadoop(在適當地設置配置參數之後)。

目前我正在嘗試並計算出是否可以根據各個機器名稱爲不同機器設置不同的名稱和數據目錄。

配置文件:(Hadoop的site.xml中)使用Hadoop 1.0.4(DataNode會不上手)

<property> 
<name>fs.default.name</name> 
<value>mumble-12.cs.wisc.edu:9001</value> 
</property> 
<property> 
<name>mapred.job.tracker</name> 
<value>mumble-13.cs.wisc.edu:9001</value> 
</property> 
<property> 
<name>dfs.replication</name> 
<value>1</value> 
</property> 
<property> 
<name>dfs.secondary.info.port</name> 
<value>9002</value> 
</property> 
<property> 
<name>dfs.info.port</name> 
<value>9003</value> 
</property> 
<property> 
<name>mapred.job.tracker.info.port</name> 
<value>9004</value> 
</property> 
<property> 
<name>tasktracker.http.port</name> 
<value>9005</value> 
</property> 

錯誤:使用Hadoop 0.15.2

2013-04-22 18:50:50,438 INFO org.apache.hadoop.ipc.Server: IPC Server handler 7 on  9001, call addBlock(/tmp/hadoop-akshar/mapred/system/jobtracker.info, DFSClient_502734479, null) from 128.105.112.13:37204: error: java.io.IOException: File /tmp/hadoop-akshar/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1 
java.io.IOException: File /tmp/hadoop-akshar/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1 

錯誤:

[[email protected]-12] (38)$ bin/hadoop fs -copyFromLocal lib/junit-3.8.1.LICENSE.txt input 

13/04/17 03:22:11 WARN fs.DFSClient: Error while writing. 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:189) 
    at java.net.SocketInputStream.read(SocketInputStream.java:121) 
    at java.net.SocketInputStream.read(SocketInputStream.java:203) 
    at java.io.DataInputStream.readShort(DataInputStream.java:312) 
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.endBlock(DFSClient.java:1660) 
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.close(DFSClient.java:1733) 
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:49) 
    at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:64) 
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:55) 
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:83) 
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:140) 
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:826) 
    at org.apache.hadoop.fs.FsShell.copyFromLocal(FsShell.java:120) 
    at org.apache.hadoop.fs.FsShell.run(FsShell.java:1360) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
    at org.apache.hadoop.fs.FsShell.main(FsShell.java:1478) 
13/04/17 03:22:12 WARN fs.DFSClient: Error while writing. 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:189) 
    at java.net.SocketInputStream.read(SocketInputStream.java:121) 
    at java.net.SocketInputStream.read(SocketInputStream.java:203) 
    at java.io.DataInputStream.readShort(DataInputStream.java:312) 
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.endBlock(DFSClient.java:1660) 
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.close(DFSClient.java:1733) 
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:49) 
    at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:64) 
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:55) 
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:83) 
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:140) 
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:826) 
    at org.apache.hadoop.fs.FsShell.copyFromLocal(FsShell.java:120) 
    at org.apache.hadoop.fs.FsShell.run(FsShell.java:1360) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
    at org.apache.hadoop.fs.FsShell.main(FsShell.java:1478) 
13/04/17 03:22:12 WARN fs.DFSClient: Error while writing. 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:189) 
    at java.net.SocketInputStream.read(SocketInputStream.java:121) 
    at java.net.SocketInputStream.read(SocketInputStream.java:203) 
    at java.io.DataInputStream.readShort(DataInputStream.java:312) 
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.endBlock(DFSClient.java:1660) 
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.close(DFSClient.java:1733) 
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:49) 
    at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:64) 
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:55) 
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:83) 
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:140) 
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:826) 
    at org.apache.hadoop.fs.FsShell.copyFromLocal(FsShell.java:120) 
    at org.apache.hadoop.fs.FsShell.run(FsShell.java:1360) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
    at org.apache.hadoop.fs.FsShell.main(FsShell.java:1478) 
copyFromLocal: Connection reset 
+0

歡迎的StackOverflow!您可能需要提供更多關於您想要獲得有用反饋的信息。 – ASGM

+0

如果您剛開始使用Hadoop,我強烈建議您使用比0.15.2更新的版本。 1.0.4是目前的穩定版本。 –

+0

@MattD我已經在上面編輯的問題中提出了你的建議。 –

回答

0

我能夠使Hadoop通過使用1.1.2版的NFS運行。它可能適用於其他版本,但我不能保證任何內容。

如果你有一個NFS文件系統,那麼每個節點應該有權訪問文件系統。 fs.default.name告訴Hadoop要使用的文件系統URI,所以它應該指向本地磁盤。我假設你的NFS目錄被掛載到/ nfs的每個節點上。

在覈心的site.xml你應該定義:

<property> 
    <name>fs.default.name</name> 
    <value>file:///</value> 
</property> 

<property> 
    <name>hadoop.tmp.dir</name> 
    <value>/nfs/tmp</value> 
</property> 

在mapred-site.xml中,你應該定義:

<property> 
    <name>mapred.job.tracker</name> 
    <value>node1:8021</value> 
</property> 

<property> 
    <name>mapred.local.dir</name> 
    <value>/tmp/mapred-local</value> 
</property> 

由於hadoop.tmp.dir指向到NFS驅動器那麼mapred.system.dir和mapreduce.jobtracker.staging.root.dir的默認位置指向nfs驅動器上的位置。它可能會在保留mapred.local.dir的默認值的情況下運行,但它應該指向本地文件系統,以便安全地將其放入/ tmp中。

您不必擔心hdfs-site.xml。這個配置文件在啓動namenode時使用,但是在nfs驅動器上分配的所有內容都不應該運行HDFS。

現在,您可以在jobtracker節點上運行start-mapred.sh並運行hadoop作業。不要運行start-all.sh或start-dfs.sh,因爲這些將啓動HDFS。如果運行多個指向同一NFS目錄的DataNode,則一個DataNode將鎖定該目錄,其他DataNode將因爲無法獲取鎖定而關閉。

我測試與配置:

bin/hadoop jar hadoop-examples-1.1.2.jar wordcount /nfs/data/test.text /nfs/out 

請注意,您需要指定完整路徑輸入和輸出的位置。

我也試過:

bin/hadoop jar hadoop-examples-1.1.2.jar grep /nfs/data/loremIpsum.txt /nfs/out2 lorem 

它給我的輸出,當我在獨立運行它一樣的,所以我認爲它是正確執行。

這裏是fs.default.name的更多信息: http://www.greenplum.com/blog/dive-in/usage-and-quirks-of-fs-default-name-in-hadoop-filesystem