gpt4 book ai didi

bash - 在1000个文件中搜索一个String,每个文件大小为1GB

转载 作者:可可西里 更新时间:2023-11-01 15:07:15 25 4
gpt4 key购买 nike

我正在研究 SunOS(有点脑残)。下面是上述 Solaris 机器的磁盘吞吐量-

bash-3.00$ iostat -d 1 10
sd0 sd1 sd2 sd3
kps tps serv kps tps serv kps tps serv kps tps serv
0 0 0 551 16 8 553 16 8 554 16 8
0 0 0 701 11 25 0 0 0 1148 17 33
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0

问题陈述

我有大约 1000 个文件,每个文件的大小为 1GB。我需要在所有这些 1000 个文件 中找到一个 String 以及哪些文件包含该特定字符串。我正在使用 Hadoop 文件系统,所有这些 1000 个文件 都在 Hadoop 文件系统中。

所有 1000 个文件 都在 real-time 文件夹下,所以如果我这样做,我将获得所有 1000 个文件。我需要找到哪些文件包含特定字符串。

bash-3.00$ hadoop fs -ls /apps/technology/b_dps/real-time

所以对于上面的问题陈述,我使用下面的命令来查找包含特定字符串的所有文件-

hadoop fs -ls /apps/technology/b_dps/real-time | awk '{print $8}' | while read f; do hadoop fs -cat $f | grep cec7051a1380a47a4497a107fecb84c1 >/dev/null && echo $f; done

所以在上面的例子中,它会找到所有包含这个字符串 cec7051a1380a47a4497a107fecb84c1 的文件。它对我来说工作正常,我能够获得包含特定字符串的文件名。

我的问题是-

但是上面命令的问题是,它非常非常慢。那么有没有什么方法可以并行化上述命令或使上述命令更快地搜索文件?

如有任何建议,我们将不胜感激。

最佳答案

如果需要,您可以编写一个简单的 MapReduce 作业来实现此目的。但是您实际上不需要任何 reducer ,因此 reducer 的数量将设置为零。通过这种方式,您可以利用 MapReduce 的并行处理能力和分块处理文件,这比串行 grep 快得多。

只需设置一个可以配置为搜索所需字符串的映射器。您可能会使用 TextInputFormat 读入文件,拆分行并检查您正在搜索的值。然后,您可以为匹配的 Mapper 写出当前输入文件的名称。

更新:

要继续进行此操作,您可以从标准字数统计示例开始:http://wiki.apache.org/hadoop/WordCount .您可以删除 Reducer 并只修改 Mapper。它一次读取输入一行,其中该行作为文本对象包含在值中。我不知道您的数据是什么格式,但您甚至可以将文本转换为字符串并针对该值硬编码 .contains("") 以找到您正在搜索的字符串(为简单起见,而不是速度或最佳实践).您只需要在命中时确定 Mapper 正在处理哪个文件,然后写出文件名即可。

关于bash - 在1000个文件中搜索一个String,每个文件大小为1GB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11732396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com