2014-05-07 92 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 
相关问题