Hadoop中的索引过程

问题描述 投票:3回答:2

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

围绕这个主题搜索,但无法获得任何令人满意和详细的事情。任何指针都会有所帮助。

提前致谢

hadoop
2个回答
4
投票

Hadoop将数据存储在文件中,而不对其进行索引。要查找内容,我们必须运行MapReduce作业,遍历所有数据。 Hadoop在数据对于数据库来说太大的情况下是高效的。对于非常大的数据集,重新生成索引的成本非常高,您无法轻松索引更改的数据。

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

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

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

有关代码示例和其他详细信息,请参阅此

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


3
投票

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

指数

第一个例子:

first example

数据集中的2个文件适合25个块,并且已被识别为7个不同的InputSplits。您要查找的目标(灰色突出显示)在文件#1(块#2,#8和#13)和文件#2(块#17)上可用

使用基于文件的索引,您最终将得到2个文件(此处设置完整数据),这意味着您的索引查询将等同于完整扫描查询使用基于InputSplit的索引,您最终将获得7个可用的4个InputSplits。性能应该比执行完整扫描查询索引更好

我们来看第二个例子:

second example

这次,相同的数据集已按您要编制索引的列进行排序。您要查找的目标(灰色突出显示)现在可在文件#1(块#1,#2,#3和#4)上使用。

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

© www.soinside.com 2019 - 2024. All rights reserved.