hadoop中的bash批重命名

lfapxunr  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(546)

如何重命名hdfs目录中的所有文件以获得 .lzo 分机? .lzo.index 不应重命名文件。
例如,此目录列表:

file0.lzo file0.lzo.index file0.lzo_copy_1

可以重命名为:

file0.lzo file0.lzo.index file0.lzo_copy_1.lzo

这些文件是lzo压缩的,我需要它们有 .lzo hadoop要识别的扩展。

56lgkhnf

56lgkhnf1#

我们创建了一个实用程序来批量重命名hdfs中的文件:https://github.com/tenaris/hdfs-rename. 这个工具是有限的,但是如果你想要的话,你可以用递归、awk regex语法等等来改进它。

gcuhipw9

gcuhipw92#

当我不得不重命名许多文件时,我正在寻找一个有效的解决方案,无意中发现了这个问题和thi duong nguyen关于重命名许多文件非常慢的评论。我实现了一个用于批量重命名操作的java解决方案,我强烈建议使用它,因为它的速度要快几个数量级。基本思想是 org.apache.hadoop.fs.FileSystemrename() 方法:

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master:8020");
FileSystem dfs = FileSystem.get(conf);
dfs.rename(from, to);

哪里 from 以及 toorg.apache.hadoop.fs.Path 物体。最简单的方法是创建一个要重命名的文件列表(包括它们的新名称),并将这个列表提供给java程序。
我已经发布了从 STDIN . 它在不到4秒内重命名了100个文件(重命名7000个文件需要相同的时间!)而 hdfs dfs -mv 基于前面描述的方法需要4分钟来重命名100个文件。

hgc7kmma

hgc7kmma3#

如果您不想为此编写java代码,我认为使用命令行hdfs api是最好的选择: mv 在hadoop中 hadoop fs -mv URI [URI …] <dest> 您可以使用一个小的单行线获得路径:

% hadoop fs -ls /user/foo/bar | awk  '!/^d/ {print $8}'

/user/foo/bar/blacklist
/user/foo/bar/books-eng
...

这个 awk 将从输出中删除目录..现在可以将这些文件放入变量中:

% files=$(hadoop fs -ls /user/foo/bar | awk  '!/^d/ {print $8}')

并重命名每个文件。。

% for f in $files; do hadoop fs -mv $f $f.lzo; done

你也可以使用 awk 为其他条件筛选文件。这将删除与regex匹配的文件 nolzo . 但是它还没有经过测试。但是这样你就可以编写灵活的过滤器了。

% files=$(hadoop fs -ls /user/foo/bar | awk  '!/^d|nolzo/ {print $8}' )

测试是否与更换 hadoop 命令 echo :

$ for f in $files; do echo $f $f.lzo; done

编辑:要使用的更新示例 awk 而不是 sed 更可靠的输出。
正确的方法可能是使用hdfs java api。。不过,对于大多数工作来说,使用shell可能更快、更灵活。

相关问题