2016-03-03 51 views
1

任何机构都可以解释我在Hadoop中索引过程的含义。 它是否像我们在RDBMS中执行的传统数据索引那样,因此在Hadoop中我们使用相同的类比来索引数据块并将块的物理地址存储在某些数据结构中。 因此,它将成为群集中的一个额外空间。Hadoop中的索引过程

围绕这个话题搜索,但没有得到任何满意和详细的东西。 任何指针都会有所帮助。

在此先感谢

回答

0

我们可以找出创建索引2不同的粒度级别:基于指数上的文件URI或索引基于InputSplit。我们来看两个不同的数据集示例。

索引

this第一示例中,2个文件数据中的在25个块设置配合,并且已被确定为7个不同InputSplits。您正在寻找的目标(灰色突出显示)在文件#1(块#2,#8和#13)和文件#2(块#17)上可用

使用基于文件的索引,您将结束与2个文件(在这里完整的数据集),这意味着您的索引查询将相当于一个完整的扫描查询 使用基于InputSplit的索引,您将最终有7个可用的4个InputSplits。性能应该肯定比全面扫描查询要好 索引

我们以second为例。这次,相同的数据集已经按您想索引的列进行排序。您正在查找的目标(灰色突出显示)现在可在文件#1(块#1,#2,#3和#4)上找到。

使用基于文件的索引,你最终会与您的数据只有1文件中设置 使用基于InputSplit索引,你将最终获得1个InputSplit 7可用 对于这个特定的研究,我决定使用自定义InputSplit基于指数。我认为这种方法应该在实现所需的努力,性能优化带来的附加价值以及预期适用性之间取得很好的平衡,无论数据分布如何。

1

Hadoop将数据存储在文件中,并且不对它们编制索引。为了找到一些东西,我们必须运行一个MapReduce作业来处理所有的数据。对于数据库来说数据太大的Hadoop非常有效。对于非常大的数据集,再生索引的成本非常高,您无法轻松索引更改的数据。

但是,我们可以在HDFS中使用两种类型的索引。基于文件的索引&基于InputSplit的索引。 让我们假设我们有2个文件存储在HDFS中进行处理。第一个是500 MB,第二个是250 MB。因此,我们将在第一个文件中有4个InputSplits,每个在第2个文件中有3个InputSplits。 我们可以为上述案例应用两种索引 - 1.使用基于文件的索引,最终将包含2个文件(此处为完整数据集),这意味着您的索引查询将等同于完整扫描查询 2 。使用基于InputSplit的索引,您最终将得到4个InputSplits。性能应该比完整扫描查询更好。

现在,为了实现InputSplits指数,我们需要执行以下步骤:

  1. 构建指数从完整的数据集 - 这可以通过编写MapReduce工作来提取我们要索引值achived,并将其与InputSplit MD5散列一起输出。
  2. 得到InputSplit(个),你正在寻找的索引值 - 的MapReduce程序的输出将减少文件(包含基于InputSplits指数),这将被存储在HDFS
  3. 执行对索引InputSplits实际的MapReduce工作只要。 - 这可以通过Hadoop完成,因为它可以使用FileInputFormat.class检索要使用的InputSplit的数量。我们将创建自己的IndexFileInputFormat类,扩展默认的FileInputFormat.class,并覆盖getSplits()方法。您必须阅读您在上一步创建的文件,将所有索引的InputSplits添加到列表中,然后将该列表与超类返回的列表进行比较。您只会返回在您的索引中找到的InputSplits到JobTracker。
  4. 在Driver类中,我们现在使用这个IndexFileInputFormat类。我们需要设置为InputFormatClass使用 - 要使用我们的自定义IndexFileInputFormat在Driver类中,我们需要提供 job.setInputFormatClass(IndexFileInputFormat.class);

代码示例和其他详细信息请参阅本 -

https://hadoopi.wordpress.com/2013/05/24/indexing-on-mapreduce-2/