1

我正在研究 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使用上述命令或使上述命令更快地搜索文件?

任何建议将不胜感激。

4

3 回答 3

1

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

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

更新:

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

于 2012-07-31T02:57:48.533 回答
1

您可以从 grep 类中获得提示。它随示例文件夹中的分发一起提供。

./bin/hadoop jar hadoop-mapred-examples-0.22.0.jar grep 输入输出正则表达式

有关此类实现的详细信息源,您可以转到该目录。发行版附带的“src\examples\org\apache\hadoop\examples”

所以你可以在你的主课上这样做:

 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);
}
于 2012-07-31T16:59:37.530 回答
1

如果您有 1000 个文件,是否有任何理由使用细粒度并行化技术?为什么不直接使用 xargs 或 gnu 并行,并将工作拆分到文件中,而不是将工作拆分到文件中?

此外,您似乎在 grepping 一个文字字符串(不是正则表达式);您可以使用 -F grep 标志来搜索字符串文字,这可能会加快速度,具体取决于 grep 的实现/优化方式。

我没有专门使用 mapReduce,所以这篇文章可能会也可能不会。

于 2012-08-01T02:57:32.773 回答