ars*_*nal 18 unix bash shell grep hadoop
我正在使用Hadoop,我需要找到我的Hadoop文件系统中的~100个文件中的哪一个包含某个字符串.
我可以看到我想要搜索的文件,如下所示:
bash-3.00$ hadoop fs -ls /apps/mdhi-technology/b_dps/real-time
Run Code Online (Sandbox Code Playgroud)
..which返回几个这样的条目:
-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
Run Code Online (Sandbox Code Playgroud)
如何找到哪些包含字符串bcd4bc3e1380a56108f486a4fffbc8dc?一旦我知道,我可以手动编辑它们.
phs*_*phs 32
这是一个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
Run Code Online (Sandbox Code Playgroud)
这应该工作,但它是连续的,所以可能很慢.如果您的群集可以解决问题,我们可以并行化:
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 ^"
Run Code Online (Sandbox Code Playgroud)
请注意以下-P 10选项xargs:这是我们将下载和并行搜索的文件数量.启动低电平并增加数字,直到您使磁盘I/O或网络带宽饱和,无论您的配置是否相关.
编辑:鉴于你是在SunOS(有点脑死亡),试试这个:
hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | while read f; do hadoop fs -cat $f | grep bcd4bc3e1380a56108f486a4fffbc8dc >/dev/null && echo $f; done
Run Code Online (Sandbox Code Playgroud)