Grep跨Hadoop文件系统中的多个文件

时间:2012-07-28 02:38:51

标签: bash shell unix hadoop grep

我正在使用Hadoop,我需要找到我的Hadoop文件系统中的~100个文件中的哪一个包含某个字符串。

我可以看到我想要搜索的文件:

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

..返回几个这样的条目:

-rw-r--r--   3 b_dps mdhi-technology 1073741824 2012-07-18 22:50 /apps/mdhi-technology/b_dps/HADOOP_consolidated_RT_v1x0_20120716_aa
-rw-r--r--   3 b_dps mdhi-technology 1073741824 2012-07-18 22:50 /apps/mdhi-technology/b_dps/HADOOP_consolidated_RT_v1x0_20120716_ab

如何找到包含字符串bcd4bc3e1380a56108f486a4fffbc8dc的字符串?一旦我知道,我就可以手动编辑它们。

5 个答案:

答案 0 :(得分:30)

这是一个hadoop" filesystem"而不是POSIX,所以试试这个:

hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | \
while read f
do
  hadoop fs -cat $f | grep -q bcd4bc3e1380a56108f486a4fffbc8dc && echo $f
done

这应该可行,但它是连续的,因此可能很慢。如果你的集群可以解决问题,我们可以并行化:

hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | \
  xargs -n 1 -I ^ -P 10 bash -c \
  "hadoop fs -cat ^ | grep -q bcd4bc3e1380a56108f486a4fffbc8dc && echo ^"

请注意-P 10的{​​{1}}选项:这是我们要下载和并行搜索的文件数量。启动低电平并增加数字,直到您使磁盘I / O或网络带宽饱和,无论您的配置是否相关。

编辑:鉴于您已经使用了SunOS(有点脑死亡),请尝试以下方法:

xargs

答案 1 :(得分:0)

如果您只有两个1 GB的文件,那么使用hadoop fs -cat(或更通用的hadoop fs -text)可能是可行的。对于100个文件,虽然我会使用streaming-api因为它可以用于adhoc查询而无需借助完整的mapreduce作业。例如。在您的情况下,创建一个脚本get_filename_for_pattern.sh

#!/bin/bash
grep -q $1 && echo $mapreduce_map_input_file
cat >/dev/null # ignore the rest

请注意,您必须阅读整个输入,以避免获得java.io.IOException: Stream closed例外。

然后发出命令

hadoop jar $HADOOP_HOME/hadoop-streaming.jar\
 -Dstream.non.zero.exit.is.failure=false\
 -files get_filename_for_pattern.sh\
 -numReduceTasks 1\
 -mapper "get_filename_for_pattern.sh bcd4bc3e1380a56108f486a4fffbc8dc"\
 -reducer "uniq"\
 -input /apps/hdmi-technology/b_dps/real-time/*\
 -output /tmp/files_matching_bcd4bc3e1380a56108f486a4fffbc8dc
hadoop fs -cat /tmp/files_matching_bcd4bc3e1380a56108f486a4fffbc8dc/*

在较新的发布中,mapred streaming代替hadoop jar $HADOOP_HOME/hadoop-streaming.jar应该有效。在后一种情况下,您必须正确设置$HADOOP_HOME才能找到jar(或直接提供完整路径)。

对于更简单的查询,您甚至不需要脚本,只是可以直接向-mapper参数提供命令。但是对于任何稍微复杂的东西,最好使用一个脚本,因为获得正确的转义可能是一件苦差事。

如果您不需要缩减阶段,请为相应的NONE选项提供符号-reduce参数(或仅使用-numReduceTasks 0)。但在您的情况下,为了将输出合并到一个文件中,有一个减少阶段是有用的。

答案 2 :(得分:0)

您要在hdfs文件夹上应用grep命令

hdfs dfs -cat /user/coupons/input/201807160000/* | grep -c null

在这里cat递归浏览文件夹中的所有文件,我应用grep查找计数。

答案 3 :(得分:0)

要在hdfs位置内递归查找所有具有任何扩展名的文件:

hadoop fs -find  hdfs_loc_path  -name ".log"

答案 4 :(得分:0)

hadoop fs -find / apps / mdhi-technology / b_dps / real-time -name“ bcd4bc3e1380a56108f486a4fffbc8dc

hadoop fs -find / apps / mdhi-technology / b_dps / real-time -name“ bcd4bc3e1380a56108f486a4fffbc8dc”