如果他们不存在,如何让hadoop创建目录

时间:2014-05-07 16:41:41

标签: hadoop hdfs cloudera put biginsights

我一直在使用Cloudera的hadoop(0.20.2)。 使用此版本,如果我将文件放入文件系统,但目录结构不存在,则会自动创建父目录:

例如,如果我在hdfs和typed中没有目录:

hadoop fs -put myfile.txt /some/non/existing/path/myfile.txt

它会创建所有目录:一些,非现有的路径并将文件放在那里。

现在,随着更新的hadoop(2.2.0)产品的出现,这种自动创建的目录不会发生。 上面的相同命令产生:

put:`/ some / non / existing / path /':没有这样的文件或目录

我有一个解决方法,就是每次放置 hadoop fs -mkdir ,但这不会很好。

这是可配置的吗? 有什么建议吗?

3 个答案:

答案 0 :(得分:26)

现在你应该使用     hadoop fs -mkdir -p <path>

答案 1 :(得分:3)

不推荐使用

YourCheckbox.Checked = sql_column == 1; ,而是使用:hadoop fs ...

答案 2 :(得分:0)

将文件放入hdfs中的非现存目录需要两个步骤。正如@ rt-vybor所说,使用&#39; -p&#39; 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