Hadoop中的索引过程

时间:2016-03-03 12:17:32

标签: hadoop

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

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

提前致谢

2 个答案:

答案 0 :(得分: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程序的输出将是将存储在HDFS中的精简文件(包含基于InputSplits的索引)
  3. 仅对索引的InputSplits执行实际的MapReduce作业。 - 这可以通过Hadoop完成,因为它能够使用FileInputFormat.class检索要使用的InputSplit的数量。我们将创建自己的IndexFileInputFormat类,扩展默认的FileInputFormat.class,并覆盖其getSplits()方法。您必须读取您在上一步中创建的文件,将所有索引的InputSplits添加到列表中,然后将此列表与超类返回的列表进行比较。您将仅返回JobTracker在索引中找到的InputSplits。
  4. 在Driver类中,我们现在要使用此IndexFileInputFormat类。我们需要使用 - 设置为InputFormatClass - 要在我们需要提供的Driver类中使用我们的自定义IndexFileInputFormat job.setInputFormatClass(IndexFileInputFormat.class);
  5. 对于代码示例和其他详细信息,请参阅 -

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

答案 1 :(得分: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的索引,您最终可以使用7个InputSplit 7 对于这个特定的研究,我决定使用自定义的基于InputSplit的索引。我认为,这种方法应该在实施所需的努力,在性能优化方面可能带来的附加价值以及无论数据分布如何的预期适用性之间取得很好的平衡。