据我所知,在从一个 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文件,但出于某种原因我不想这样做。任何其他使用单个命令的方法都将适用。
提前致谢!
不是一个命令,而是一个解决方法:
为了合并 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
第一行递归选择目标中的所有文件。然后创建目标中每个文件的路径并最终移动文件。
一个缺点是文件夹访问权限不会移动,而是在运行时设置。
HDFS shell 命令不支持
-f
表示 mv
。
您必须执行复制然后删除的方法(如您所述)。
无法通过类似的单个命令来执行此操作
hdfs dfs -rm {目标 Uri} ; hdfs dfs -mv {源 Uri} {目标 Uri}
只需一行即可实现此目的。