2011-03-14 24 views
58

我在EC2中創建了一個Ubuntu單節點hadoop集羣。HDFS錯誤:只能複製到0個節點,而不是1個

測試一個簡單的文件上傳到hdfs可以從EC2機器上運行,但是不能在EC2之外的機器上運行。

我可以通過Web界面從遠程機器瀏覽文件系統,並顯示一個報告爲服務的datanode。已經打開安全從0到60000(!)的所有TCP端口,所以我不認爲這是。

我得到的錯誤

java.io.IOException: File /user/ubuntu/pies could only be replicated to 0 nodes, instead of 1 
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1448) 
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:690) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.hadoop.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:342) 
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1350) 
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1346) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:396) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:742) 
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1344) 

at org.apache.hadoop.ipc.Client.call(Client.java:905) 
at org.apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:198) 
at $Proxy0.addBlock(Unknown Source) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82) 
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59) 
at $Proxy0.addBlock(Unknown Source) 
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:928) 
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:811) 
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:427) 

NameNode的日誌只是給出了同樣的錯誤。其他人似乎沒有什麼有趣的東西

任何想法?

乾杯

+2

我在設置單節點虛擬機時遇到了問題。我從'conf/core-site.xml','conf/mapred-site.xml'和'conf/hdfs-site.xml'中刪除了配置屬性。它在我的虛擬機上工作正常。 免責聲明:我是一個絕對的初學者。我認爲這些更改會導致單個實例的默認值,並使其工作。 HTH。 – vrrathod 2011-07-18 06:45:57

回答

0

你試過從維基http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment的建議?

我在將數據放入dfs時出現此錯誤。這個解決方案很奇怪,可能不一致:我刪除了所有臨時數據以及namenode,重新設置了namenode的格式,啓動了一切,並訪問了我的「集羣的」dfs健康頁面(http:// your_host:50070/dfshealth.jsp)。最後一步,訪問健康頁面,是我能夠解決錯誤的唯一方法。一旦我訪問了該頁面,將文件放入和退出dfs工作得非常好!

+0

我遇到了問題中描述的相同問題,找到並使用了這種方法,但沒有成功。 – Nigini 2012-06-27 18:26:43

8

我有一個類似的問題設置單個節點羣集。我意識到我沒有配置任何datanode。我將我的主機名添加到conf/slaves,然後解決。希望能幫助到你。

+0

我有完全相同的問題,你的解決方案幫助。謝謝! – 2012-01-29 21:44:09

+0

我在最後的奴隸/主文件中有一個空行,並且因此失敗:/ – blackuprise 2013-05-23 13:06:00

+0

@blackuprise在這裏相同。您的評論幫助了我很多,謝謝 – user4052054 2016-05-05 16:04:24

2

而我認爲你應該確保所有的datanode在複製到dfs時都啓動。在某些情況下,它需要一段時間。我認爲這就是爲什麼解決方案'檢查健康狀況'的原因,因爲你進入健康狀態網頁並等待一切,我的5美分。

8

請看以下內容:

通過觀察此異常(只能被複制到0節點,而不是1),數據節點不可用名稱節點..

這是下列情況下的數據節點不得提供給名稱節點

  1. 數據節點的磁盤已滿

  2. 數據節點忙於塊報告塊scannin g

  3. 如果塊大小爲負值(hdfs-site中的dfs.block.size。XML)

  4. 而正在進行中主數據節點寫入出現故障(不限N/W fluctations的B/W名稱節點和數據節點機)

  5. 當自從我們附加任何部分塊,並調用同步用於隨後的部分塊追加客戶端應該將先前的數據存儲在緩衝區中。

例如追加「了」我已要求同步,當我試圖將追加緩衝區應該有「AB」

和服務器端,當塊是不是512多那麼之後將嘗試對塊文件中存在的數據以及元文件中存在的crc進行Crc比較。不過,雖然建設CRC對存在於塊它總是比較,直到初始Offeset數據或瞭解更多分析,請在數據節點日誌

參考:http://www.mail-archive.com/[email protected]/msg01374.html

+0

也會發生,如果datanode無法到達其偵聽端口namenode(例如:9000)。請參閱http://stackoverflow.com/a/19522882/1577626 – vpathak 2013-10-22 16:05:19

+0

端口問題是什麼導致了OP的錯誤。我沒有打開'dfs.datanode.address'端口地址(CDH默認爲'50010')。 – 2013-12-10 17:43:48

75

警告:以下將破壞HDFS上的所有數據。除非你不關心銷燬現有的數據,否則不要執行這個答案中的步驟!

你應該這樣做:

  1. 停止所有的Hadoop服務
  2. 刪除DFS /名稱和DFS /數據目錄
  3. hdfs namenode -format答案用大寫Ÿ
  4. 開始的Hadoop服務

此外,請檢查系統中的磁盤空間並確保日誌不是warni對你說。

+1

現在我明白了這一點,我記得以前類似的東西救了我。今天又救了我,謝謝。我一直假設'namenode -format'消除了一切,但有一些混亂的狀態倖存下來。 – 2012-02-11 16:26:40

+5

我想使這個答案我的主頁。 – 2013-05-06 21:34:47

+0

這很好,謝謝。 – Jirapong 2013-06-06 11:13:22

0

我意識到我對晚會有點遲,但是我想發佈這個 這個頁面的未來訪問者。當我將文件從本地複製到hdfs並重新格式化 namenode沒有解決我的問題時,我遇到了非常類似的問題 。原來,我的NameNode 日誌有以下錯誤信息:

2012-07-11 03:55:43,479 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-920118459-192.168.3.229-50010-1341506209533, infoPort=50075, ipcPort=50020):DataXceiver java.io.IOException: Too many open files 
     at java.io.UnixFileSystem.createFileExclusively(Native Method) 
     at java.io.File.createNewFile(File.java:883) 
     at org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:491) 
     at org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:462) 
     at org.apache.hadoop.hdfs.server.datanode.FSDataset.createTmpFile(FSDataset.java:1628) 
     at org.apache.hadoop.hdfs.server.datanode.FSDataset.writeToBlock(FSDataset.java:1514) 
     at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.java:113) 
     at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:381) 
     at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:171) 

顯然,這是在Hadoop集羣和 Cloudera suggests一個比較普遍的問題,增加了NOFILE和epoll的限制(如果 2.6.27內核)解決它。棘手的是,設置 nofile和epoll的限制是高度依賴系統。我的Ubuntu 10.04 server required a slightly different configuration爲此正常工作 ,因此您可能需要相應地改變您的方法。

3

由於數據節點未啓動,我在MacOS X 10.7(hadoop-0.20.2-cdh3u0)上發生了同樣的錯誤。
start-all.sh產生以下輸出:

starting namenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/... 
localhost: ssh: connect to host localhost port 22: Connection refused 
localhost: ssh: connect to host localhost port 22: Connection refused 
starting jobtracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/... 
localhost: ssh: connect to host localhost port 22: Connection refused 

經由System Preferences -> Sharing -> Remote Login 它開始工作使ssh登錄之後。
start-all.sh輸出改爲以下(注意數據節點的開始):

starting namenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/... 
Password: 
localhost: starting datanode, logging to /java/hadoop-0.20.2-cdh3u0/logs/... 
Password: 
localhost: starting secondarynamenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/... 
starting jobtracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/... 
Password: 
localhost: starting tasktracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/... 
11

這是你的問題 - 客戶端無法與數據管理部溝通。因爲客戶端爲Datanode收到的IP是內部IP而不是公共IP。看看這個

http://www.hadoopinrealworld.com/could-only-be-replicated-to-0-nodes/

看從DFSClient $ DFSOutputStrem(Hadoop的1.2.1)

// 
// Connect to first DataNode in the list. 
// 
success = createBlockOutputStream(nodes, clientName, false); 

if (!success) { 
    LOG.info("Abandoning " + block); 
    namenode.abandonBlock(block, src, clientName); 

    if (errorIndex < nodes.length) { 
    LOG.info("Excluding datanode " + nodes[errorIndex]); 
    excludedNodes.add(nodes[errorIndex]); 
    } 

    // Connection failed. Let's wait a little bit and retry 
    retry = true; 
} 

在這裏明白的是,Namenode會只提供的Datanode的到列表中的關鍵的源代碼存儲塊。 Namenode不會將數據寫入Datanodes。使用DFSOutputStream將數據寫入Datanodes是客戶的工作。在任何寫入操作開始之前,請確保客戶端可以與Datanode進行通信,並且如果通信未能通過Datanode,則將Datanode添加到excludedNodes中。

+0

如果確實是這個問題,那麼在連接到AWS羣集時如何獲得公共IP地址? 謝謝 – cyberjoac 2016-07-05 15:41:44

1

如果所有數據節點都在運行,還有一件事要檢查HDFS是否有足夠的空間存儲數據。我可以上傳一個小文件,但未能將大文件(30GB)上傳到HDFS。 'bin/hdfs dfsadmin -report'顯示每個數據節點只有幾個可用的GB。

-1

這是關於SELINUX。在我的情況下,CentOS的6.5

所有節點(名字,第二,數據....)

service iptables stop

+0

SELINUX〜= iptables – dfc 2017-02-02 21:16:33

3

我會盡力來形容我的設置&解決方案: 我的設置:RHEL 7,hadoop- 2.7.3

我試圖設置standalone Operation第一個然後Pseudo-Distributed Operation後者失敗的同一個問題。

雖然,當我開始使用Hadoop:

sbin/start-dfs.sh 

我有以下幾點:

Starting namenodes on [localhost] 
localhost: starting namenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-namenode-localhost.localdomain.out 
localhost: starting datanode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-datanode-localhost.localdomain.out 
Starting secondary namenodes [0.0.0.0] 
0.0.0.0: starting secondarynamenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-secondarynamenode-localhost.localdomain.out 

這看起來很有希望(從數據節點..無故障) - 但數據管理部不確實存在。

另一個跡象是看到有操作上的數據節點(固定的工作狀態之下快照所示):

enter image description here

我已經這樣做解決這個問題:

rm -rf /tmp/hadoop-<user>/dfs/name 
rm -rf /tmp/hadoop-<user>/dfs/data 

然後重新開始:

sbin/start-dfs.sh 
... 
+1

感謝@ItayB節省時間。 – Sam 2017-01-17 05:20:30

+0

不客氣@Sam,謝謝你告訴我這一點;-) – ItayB 2017-01-17 05:22:55

+0

我沒有任何/ tmp/hadoop/*文件,但是yu顯示的內容與我的問題相符 – Kailegh 2018-03-05 20:21:50

0

我有也有同樣的問題/錯誤。當我使用hadoop namenode -format格式化時,問題首先發生

因此,在重新啓動hadoop使用start-all.sh之後,數據節點未啓動或初始化。你可以使用jps來檢查這個,應該有五個條目。如果數據節點丟失,那麼你可以這樣做:

Datanode process not running in Hadoop

希望這有助於。

0

不要立即格式化名稱節點。嘗試stop-all.sh並使用start-all.sh啓動它。如果問題仍然存在,請轉到格式化名稱節點。

0

按照以下步驟操作: 1.停止dfs和紗線。 2.刪除core-site.xml中指定的datanode和namenode目錄。 3.啓動DFS和紗線如下:

start-dfs.sh 
start-yarn.sh 
mr-jobhistory-daemon.sh start historyserver 
1

它把我一個星期在我的情況,以找出問題。

當客戶端(您的程序)詢問nameNode進行數據操作時,nameNode選擇一個dataNode並通過將dataNode的ip給客戶端導航到客戶端。

但是,當dataNode主機被配置爲具有多個IP,並且nameNode爲您提供了一個您的客戶端無法訪問的客戶端時,客戶端將添加dataNode以排除列表,並要求nameNode換一個新的,最後所有的dataNode被排除,你會得到這個錯誤。

因此,在你嘗試一切之前檢查節點的ip設置!

相關問題