【问题标题】:Batch rename in hadoop在hadoop中批量重命名
【发布时间】:2016-08-04 21:00:34
【问题描述】:

如何将 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 识别。

【问题讨论】:

  • 使用 Java API 或命令行工具?
  • 命令行工具最好,谢谢
  • @beefyhalo,我们创建了一个命令行工具,您会在我们的答案中找到它。

标签: bash hadoop file-rename


【解决方案1】:

如果您不想为此编写 Java 代码 - 我认为使用命令行 HDFS API 是您最好的选择:

mv in 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 过滤文件以符合其他条件。这应该删除与正则表达式 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 可能更快、更灵活。

【讨论】:

  • 这绝对有帮助,虽然你的 cut 方法不能按预期工作,并且 sed 给了我错误
  • 是的,它远非完美。我想使用awk 或者想出一些更复杂的东西来解析hadoop fs -ls 应该可以解决...
  • 我将答案更新为使用awk。现在应该工作得更好。是时候为我学习awk 了;)
  • 酷,用 awk 看起来更好。我正在使用这个 awk 过滤器:!/^d|\.lzo|\.index|\_SUCCESS/,一切运行良好。谢谢!
  • 这行得通,但如果你要重命名数千个文件,它会很慢。
【解决方案2】:

当我不得不重命名许多文件时,我正在寻找一个有效的解决方案并偶然发现了这个问题和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);

其中fromtoorg.apache.hadoop.fs.Path 对象。最简单的方法是创建要重命名的文件列表(包括它们的新名称)并将此列表提供给 Java 程序。

have published 是从STDIN 读取这样一个映射的完整实现。它在不到 4 秒的时间内重命名了 100 个文件(重命名 7000 个文件需要同样的时间!),而前面描述的基于 hdfs dfs -mv 的方法需要 4 分钟来重命名 100 个文件。

【讨论】:

  • 我正面临着这个问题,使用上面提到的 Java 方法要快得多,这是完全有道理的 - 我想它是使用单个连接而不是创建和销毁一个独特的连接每个文件。但是,我想知道是否有人能够在 EMR 上运行这种类型的代码。我似乎无法让它工作。根据我在这里看到的 (docs.aws.amazon.com/emr/latest/ReleaseGuide/…),我必须在集群上构建代码。但这似乎只是为了移动一些文件。有人能在 EMR 上运行它吗?
【解决方案3】:

我们创建了一个实用程序来批量重命名 HDFS 中的文件:https://github.com/tenaris/hdfs-rename。该工具是有限的,但如果您愿意,您可以使用递归、awk 正则表达式等语法来改进它。

【讨论】:

    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 2011-04-17
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2015-12-13
    • 2013-12-16
    相关资源
    最近更新 更多