【发布时间】:2012-07-31 02:45:49
【问题描述】:
我正在开发 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 files,每个文件的大小为1GB。我需要在所有这些1000 files 中找到一个String 以及哪些文件包含该特定字符串。我正在使用Hadoop File System,所有1000 files 都在Hadoop 文件系统中。
所有1000 files 都在real-time 文件夹下,所以如果我在下面这样做,我将得到所有1000 files。我需要找出哪些文件包含特定的字符串。
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 的所有文件。它对我来说工作正常,我能够获取包含特定字符串的文件名。
我的问题是-
但是上面命令的问题是,它非常非常慢。那么有什么办法可以parallelize上面的命令或者让上面的命令搜索文件更快吗?
任何建议将不胜感激。
【问题讨论】:
-
如果文件很大并且命中在文件的早期,
grep -l pattern file而如果grep pattern file >/dev/null && echo file已经提供了实质性的优化。grep -q将提供类似的好处。 -
所以你是说,我应该做这样的事情
grep -l cec7051a1380a47a4497a107fecb84c1 >/dev/null? -
如果您有输入文件名,
grep -l pattern file将打印文件名并在找到匹配项后立即退出。如果输入来自管道,grep -q pattern && print filename。无需重定向到/dev/null。当然,这是假设您有一个带有这些选项标志的grep。
标签: bash shell unix hadoop grep