搜索在1000个文件字符串和每个文件大小为1GB(Search for a String in 10

2019-10-17 02:44发布

我的工作在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 。 我需要找到一个String在所有这些1000 files ,并哪些文件包含特定字串。 我有工作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上面的命令,或者上面的命令来搜索文件的速度快了很多?

任何建议将不胜感激。

Answer 1:

你可以写一个简单的MapReduce工作,如果你想实现这一目标。 你实际上并不需要任何减速的,所以减速器的数量将被设置为零。 这样,您就可以使用的MapReduce并行处理能力和块虽然文件比串行的grep快得多。

刚刚成立,可用于搜索你想要的字符串映射。 你会在使用的TextInputFormat文件可能读,分割线,并检查您正在搜索的值。 然后,您可以写出来供相匹配的映射当前输入文件的名称。

更新:

为了让事情这样你可以开始用标准字数例如: http://wiki.apache.org/hadoop/WordCount 。 您可以删除的减速,只是修改映射。 它读取输入在其中线被包含在值作为文本对象的时间的线。 我不知道你的数据是什么格式,但你甚至可以将文本只是转换为字符串和硬编码。载有(“”),针对该值来找到你要搜索的字符串(为简单起见,没有速度或最佳实践)。 你只需要锻炼哪些文件,当您得到一击,然后写出来的文件名映射器正在处理。



Answer 2:

你可以从grep的类的提示。 它配备了在该示例文件夹中的分布。

./bin/hadoop罐Hadoop的mapred-例子-0.22.0.jar grep的输入输出的正则表达式

对于这个类的实现细节源,你可以进入目录。 “SRC \例子\组织\阿帕奇\ Hadoop的\实例”随附分布

所以,你可以在你的主类做到这一点:

 Job searchjob = new Job(conf);    
 FileInputFormat.setInputPaths("job Name", "input direcotory in hdfs");
      searchjob.setMapperClass(SearchMapper.class);    
      searchjob.setCombinerClass(LongSumReducer.class);
      searchjob.setReducerClass(LongSumReducer.class);

在你SearchMapper.class,你可以做到这一点。

   public void map(K key, Text value,
                      OutputCollector<Text, LongWritable> output,
                      Reporter reporter)
        throws IOException {
        String text = value.toString();
        Matcher matcher = pattern.matcher(text);
        if(matcher.find()) {
          output.collect(key,value);
}


Answer 3:

如果你有1000个文件,是没有任何理由的精细细粒度并行的技术? 为什么不使用xargs的,或GNU平行,并拆分工作过的文件,而不是文件中拆分工作?

此外,它看起来像你grepping文本字符串(不是正则表达式); 您可以使用-F标志的grep搜索字符串文字,可以加快速度,这取决于grep的是如何实现/优化。

我还没有和MapReduce的工作特别,所以这个帖子可能会或可能不会对点。



文章来源: Search for a String in 1000 files and each file size is 1GB