24

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

例如,如果我在 hdfs 中没有目录并输入:

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

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

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

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

我有一个解决方法,可以先对每个 put 执行hadoop fs -mkdir,但这不会很好。

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

4

4 回答 4

35

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

于 2014-10-07T15:28:21.377 回答
2

编者注:警告此答案不正确


hadoop fs ...已弃用,而是使用:hdfs dfs -mkdir ....

于 2016-12-07T09:42:33.440 回答
1

将文件放入 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
于 2017-03-23T01:32:15.790 回答
0

如果目录不存在,put操作不会创建目录。在进行put操作之前,我们需要创建目录。

您可以使用以下内容创建目录。

hdfs dfs -mkdir -p <path>

-p

如果父目录不存在,它将首先创建父目录。但如果它已经存在,那么它不会打印错误消息,而是会进一步创建子目录。

于 2022-01-04T07:32:25.377 回答