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

0ve6wy6x  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(1678)

我一直在使用cloudera的hadoop(0.20.2)。在这个版本中,如果我将一个文件放入文件系统,但目录结构不存在,它会自动创建父目录:
例如,如果我在hdfs中没有目录并且键入:
hadoop fs-put myfile.txt/some/non/existing/path/myfile.txt
它将创建所有目录:some、non、existing和path,并将文件放在其中。
现在,随着hadoop(2.2.0)的更新,这种目录的自动创建不会发生。上面的相同命令产生:
put:`/some/non/existing/path/':没有这样的文件或目录
我有一个解决方法,只需为每个put首先执行hadoopfs-mkdir,但这不会有很好的性能。
这是可配置的吗?有什么建议吗?

r8uurelv

r8uurelv1#

将文件放入hdfs中不存在的目录需要两个步骤。如@rt vybor所述,使用mkdir的'-p'选项创建多个缺少的路径元素。但是由于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
wb1gzix0

wb1gzix02#

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

7hiiyaii

7hiiyaii3#

编辑注:警告此答案表示不正确 hadoop fs ... 已弃用,请改用: hdfs dfs -mkdir ....

相关问题