2014-05-07 131 views
11

我一直在使用Cloudera的hadoop(0.20.2)。 在這個版本中,如果我把一個文件到文件系統,但該目錄結構不存在,它會自動創建父目錄:如何讓hadoop創建目錄如果它們不存在

因此,舉例來說,如果我有在HDFS中沒有目錄,鍵入:

Hadoop的FS -put myfile.txt的/some/non/existing/path/myfile.txt

這將創建所有的目錄:一些,非,現有路徑並把文件在那裏。

現在,隨着更新的hadoop(2.2.0)產品,這種自動創建目錄不會發生。 相同的命令以上收益率:

地說:`/一些/不/現有/路徑/「:沒有這樣的文件或目錄

我有一個解決方法,只是做Hadoop的FS -mkdir第一,對於每一個投入,但這不會表現良好。

這是可配置的嗎? 有什麼建議嗎?現在

+0

爲什麼不會它表現良好? – climbage

+0

>>爲什麼它表現不好? 因爲對於每個'放'我做一個mkdir - 大多數時間可能不需要,所以它會影響高吞吐量情況下的性能。 – owly

+0

你有沒有考慮編寫自己的解決方案?我很驚訝'put'表現的很好,考慮到每次通話都必須啓動虛擬機,讀取配置等。 – climbage

回答

18

你應該使用 hadoop fs -mkdir -p <path>

+0

它的工作原理!謝謝 – ajkush

+0

這怎麼回答這個問題? – hlagos

1

hadoop fs ...已被棄用,而不是使用:hdfs dfs -mkdir ....

+0

hadoop dfs -mkdir/mnt/hdfs DEPRECATED:不建議使用此腳本執行hdfs命令。 改爲使用hdfs命令。 – Anshul

0

放置文件到HDFS中的非現存目錄需要兩個步驟的過程。正如@ rt-vybor所說的,使用'-p'選項來mkdir創建多個丟失的路徑元素。但是,由於OP詢問如何將文件放入hdfs中,下面還執行hdfs put,並且請注意,您還可以(可選)檢查put是否成功,並有條件地刪除本地副本。

首先在hdfs中創建相關目錄路徑,然後將該文件放入hdfs中。您希望在放入hdfs之前檢查文件是否存在。你可能想記錄/顯示文件已成功放入hdfs。以下內容組合了所有步驟。

fn=myfile.txt 
if [ -f $fn ] ; then 
    bfn=`basename $fn` #trim path from filename 
    hdfs dfs -mkdir -p /here/is/some/non/existant/path/in/hdfs/ 
    hdfs dfs -put $fn /here/is/some/non/existant/path/in/hdfs/$bfn 
    hdfs dfs -ls /here/is/some/non/existant/path/in/hdfs/$bfn 
    success=$? #check whether file landed in hdfs 
    if [ $success ] ; then 
    echo "remove local copy of file $fn" 
    #rm -f $fn #uncomment if you want to remove file 
    fi 
fi 

而且你可以把它變成一個shell腳本,走Hadoop的路徑和文件的列表(也只有一次創建路徑),

#!/bin/bash 
hdfsp=${1} 
shift; 
hdfs dfs -mkdir -p /here/is/some/non/existant/path/in/hdfs/ 
for fn in $*; do 
    if [ -f $fn ] ; then 
    bfn=`basename $fn` #trim path from filename 
    hdfs dfs -put $fn /here/is/some/non/existant/path/in/hdfs/$bfn 
    hdfs dfs -ls /here/is/some/non/existant/path/in/hdfs/$bfn >/dev/null 
    success=$? #check whether file landed in hdfs 
    if [ $success ] ; then 
     echo "remove local copy of file $fn" 
     #rm -f $fn #uncomment if you want to remove file 
    fi 
    fi 
done 
相關問題