我一直在使用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 ,但这不会很好。
这是可配置的吗? 有什么建议吗?
答案 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