HDFS到HDFS完全移动文件

时间:2018-01-11 18:49:54

标签: hadoop hdfs cloudera

据我所知,在从一个HDFS位置移动到另一个HDFS位置时,没有直接选项可以覆盖HDFS中的文件,复制cp可以强制选择。我试图找出是否有任何黑客做到这一点?

我们可以做的是hdfs dfs -cp -f /hdfs/location1 /hdfs/location2但不是hdfs dfs -mv -f /hdfs/location1/ /hdfs/location2/

实现我的目的的一种方法是首先执行hdfs dfs -cp -f /hdfs/location1 /hdfs/location2,然后使用hdfs dfs -rm -r /hdfs/location1删除location1文件,但出于某种原因我不想这样做。使用单个命令的任何其他方法都将适用。

提前感谢!!

3 个答案:

答案 0 :(得分:0)

不是单个命令,而是一种解决方法:

对于在HDFS中合并文件夹,我实现了一个解决方案,因为cp与数据节点上的物理数据进行交互,而mv仅更改名称节点上的元数据。

for i in $(hdfs dfs -ls -R ${hdfs_src_dir} | grep "^-" | awk '{print $8}'); do
  i_dir=$(dirname "${i}")
  target_dir=${hdfs_tgt_dir}${i_dir#"$hdfs_src_dir"}
  hdfs dfs -mkdir -p $target_dir
  hdfs dfs -mv ${i} "${target_dir}"/ 2>&1
done

第一行递归选择目标中的所有文件。然后,将创建目标中每个文件的路径,并最终移动文件。

缺点是文件夹访问权限不会移动,而是在运行时设置。

答案 1 :(得分:0)

HDFS Shell命令不支持-f的{​​{1}}。

您将必须执行复制然后删除方法(如您所述)。

答案 2 :(得分:-3)

无法在单个命令中执行此操作,例如

hdfs dfs -rm {destination Uri}; hdfs dfs -mv {source Uri} {destination Uri}

将在一条线上实现这一目标。