Hadoop中的索引过程

Hadoop中的索引过程,hadoop,Hadoop,请任何人解释一下Hadoop中的索引过程是什么意思。 它是否有点像我们在RDBMS中对数据进行的传统索引,因此,在Hadoop中,我们对数据块进行索引,并将数据块的物理地址存储在某些数据结构中。 因此,这将是集群中的一个额外空间 谷歌搜索了这个话题,但没有得到任何令人满意和详细的东西。 任何指示都会有帮助 提前感谢我们可以确定创建索引的两种不同粒度级别:基于文件URI的索引或基于InputSplit的索引。让我们举两个不同的数据集示例 索引 第一个示例: 数据集中的2个文件可容纳25个块,并被

请任何人解释一下Hadoop中的索引过程是什么意思。 它是否有点像我们在RDBMS中对数据进行的传统索引,因此,在Hadoop中,我们对数据块进行索引,并将数据块的物理地址存储在某些数据结构中。 因此,这将是集群中的一个额外空间

谷歌搜索了这个话题,但没有得到任何令人满意和详细的东西。 任何指示都会有帮助


提前感谢

我们可以确定创建索引的两种不同粒度级别:基于文件URI的索引或基于InputSplit的索引。让我们举两个不同的数据集示例

索引

第一个示例:

数据集中的2个文件可容纳25个块,并被标识为7个不同的输入拆分。您要查找的目标(灰色突出显示)位于文件1(块2、块8和块13)和文件2(块17)中

使用基于文件的索引,您将得到2个文件(此处为完整数据集),这意味着您的索引查询将相当于完整扫描查询 使用基于InputSplit的索引,您将得到7个可用的4个InputSplit。性能肯定比执行完全扫描查询要好 索引

让我们再举一个例子:

这一次,相同的数据集已按要索引的列排序。您要查找的目标(灰色突出显示)现在位于文件1(块1、块2、块3和块4)中

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

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

然而,我们可以在HDFS中使用两种类型的索引,即。基于文件的索引和基于InputSplit的索引。 假设我们有2个文件要存储在HDFS中进行处理。第一个是500MB,第二个是250MB左右。因此,我们将在第一个文件上有4个128MB的输入拆分,在第二个文件上有3个输入拆分。 对于上述情况,我们可以应用两种类型的索引: 1.使用基于文件的索引,您将得到2个文件(此处为完整数据集),这意味着您的索引查询将相当于完整扫描查询 2.使用基于InputSplit的索引,您将得到4个InputSplit。性能肯定比执行完全扫描查询要好

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

  • 从您的完整数据集构建索引-这可以通过编写MapReduce作业来实现,以提取我们要索引的值,并将其与其InputSplit MD5哈希一起输出
  • 获取要查找的索引值的InputSplit-MapReduce程序的输出将是精简文件(包含基于InputSplit的索引),这些文件将存储在HDFS中
  • 仅在索引输入拆分上执行实际的MapReduce作业。-这可以由Hadoop完成,因为它能够使用FileInputFormat.class检索要使用的InputSplit的数量。我们将创建自己的IndexFileInputFormat类,扩展默认的FileInputFormat.class,并重写其getSplits()方法。您必须读取在上一步创建的文件,将所有索引的InputSplit添加到一个列表中,然后将此列表与超级类返回的列表进行比较。您将仅返回到JobTracker索引中找到的InputSplits
  • 在驱动程序类中,我们现在必须使用这个IndexFileInputFormat类。我们需要使用- 要在驱动程序类中使用自定义IndexFileInputFormat,我们需要提供 setInputFormatClass(IndexFileInputFormat.class) 有关代码示例和其他详细信息,请参阅此-