请任何人解释一下hadoop中的索引过程是什么意思。它是否有点像我们在rdbms中所做的传统数据索引,所以在hadoop中我们做同样的类比,我们索引数据块,并将数据块的物理地址存储在某些数据结构中。因此它将是集群中的一个额外空间。谷歌搜索了一下这个主题,但没有得到任何令人满意和详细的东西。任何提示都会有帮助。提前谢谢
3okqufwl1#
我们可以确定创建索引的两种不同的粒度级别:基于文件uri的索引或基于inputsplit的索引。让我们举两个不同的数据集示例。指数第一个例子:数据集中的2个文件可容纳25个块,并被标识为7个不同的InputSplit。您要查找的目标(灰色突出显示)位于文件#1(块#2、#8和#13)和文件#2(块#17)中使用基于文件的索引,您将得到2个文件(此处为完整数据集),这意味着您的索引查询将相当于使用基于inputsplit索引的完整扫描查询,您将得到7个可用的4个inputsplit。它的性能肯定比执行完全扫描查询索引要好让我们举第二个例子:这一次,相同的数据集已按要索引的列排序。您要查找的目标(灰色突出显示)现在位于文件#1(块#1、#2、#3和#4)中。使用基于文件的索引,您的数据集中只会有一个文件使用基于inputsplit的索引,最后会有1个inputsplit on 7可用于此特定研究,我决定使用自定义的基于inputsplit的索引。我认为这种方法应该在实现所需的努力、在性能优化方面可能带来的附加值和预期的适用性(无论数据分布如何)之间取得很好的平衡。
gmxoilav2#
hadoop将数据存储在文件中,不为它们编制索引。为了找到一些东西,我们必须运行一个mapreduce作业来遍历所有的数据。hadoop在数据对于数据库来说太大的情况下是有效的。对于非常大的数据集,重新生成索引的成本非常高,您无法轻松地为更改数据编制索引。但是,我们可以在hdfs中使用两种类型的索引,即。基于文件的索引和基于输入分割的索引。假设我们有两个文件要存储在hdfs中进行处理。第一个是500MB,第二个是250MB左右。因此,我们将在第一个文件上有4个128mb的输入分割,在第二个文件上有3个输入分割。对于上述情况,我们可以应用两种类型的索引-1。使用基于文件的索引,您将得到2个文件(此处为完整数据集),这意味着您的索引查询将相当于完整扫描查询2。使用基于inputsplit的索引,您将得到4个inputsplit。性能肯定比执行完全扫描查询要好。现在,为了实现inputsplits索引,我们需要执行以下步骤:从完整的数据集中构建索引—可以通过编写mapreduce作业来提取要索引的值,并将其与其inputsplit md5哈希一起输出来实现。获取要查找的索引值的inputsplit-mapreduce程序的输出将是简化的文件(包含基于inputsplit的索引),这些文件将存储在hdfs中仅对索引的inputsplits执行实际的mapreduce作业。-这可以由hadoop完成,因为它能够使用fileinputformat.class检索要使用的inputsplit的数量。我们将创建自己的indexfileinputformat类,扩展默认的fileinputformat.class,并重写其getsplits()方法。您必须读取在上一步创建的文件,将所有索引的inputspits添加到一个列表中,然后将这个列表与超级类返回的列表进行比较。您将只返回到jobtracker索引中找到的inputsplits。在驱动程序类中,我们现在必须使用这个indexfileinputformat类。我们需要设置为inputformatclass using-要在驱动程序类中使用我们的自定义indexfileinputformat,我们需要提供job.setinputformatclass(indexfileinputformat.class);有关代码示例和其他详细信息,请参阅-https://hadoopi.wordpress.com/2013/05/24/indexing-on-mapreduce-2/
2条答案
按热度按时间3okqufwl1#
我们可以确定创建索引的两种不同的粒度级别:基于文件uri的索引或基于inputsplit的索引。让我们举两个不同的数据集示例。
指数
第一个例子:
数据集中的2个文件可容纳25个块,并被标识为7个不同的InputSplit。您要查找的目标(灰色突出显示)位于文件#1(块#2、#8和#13)和文件#2(块#17)中
使用基于文件的索引,您将得到2个文件(此处为完整数据集),这意味着您的索引查询将相当于使用基于inputsplit索引的完整扫描查询,您将得到7个可用的4个inputsplit。它的性能肯定比执行完全扫描查询索引要好
让我们举第二个例子:
这一次,相同的数据集已按要索引的列排序。您要查找的目标(灰色突出显示)现在位于文件#1(块#1、#2、#3和#4)中。
使用基于文件的索引,您的数据集中只会有一个文件使用基于inputsplit的索引,最后会有1个inputsplit on 7可用于此特定研究,我决定使用自定义的基于inputsplit的索引。我认为这种方法应该在实现所需的努力、在性能优化方面可能带来的附加值和预期的适用性(无论数据分布如何)之间取得很好的平衡。
gmxoilav2#
hadoop将数据存储在文件中,不为它们编制索引。为了找到一些东西,我们必须运行一个mapreduce作业来遍历所有的数据。hadoop在数据对于数据库来说太大的情况下是有效的。对于非常大的数据集,重新生成索引的成本非常高,您无法轻松地为更改数据编制索引。
但是,我们可以在hdfs中使用两种类型的索引,即。基于文件的索引和基于输入分割的索引。假设我们有两个文件要存储在hdfs中进行处理。第一个是500MB,第二个是250MB左右。因此,我们将在第一个文件上有4个128mb的输入分割,在第二个文件上有3个输入分割。对于上述情况,我们可以应用两种类型的索引-1。使用基于文件的索引,您将得到2个文件(此处为完整数据集),这意味着您的索引查询将相当于完整扫描查询2。使用基于inputsplit的索引,您将得到4个inputsplit。性能肯定比执行完全扫描查询要好。
现在,为了实现inputsplits索引,我们需要执行以下步骤:
从完整的数据集中构建索引—可以通过编写mapreduce作业来提取要索引的值,并将其与其inputsplit md5哈希一起输出来实现。
获取要查找的索引值的inputsplit-mapreduce程序的输出将是简化的文件(包含基于inputsplit的索引),这些文件将存储在hdfs中
仅对索引的inputsplits执行实际的mapreduce作业。-这可以由hadoop完成,因为它能够使用fileinputformat.class检索要使用的inputsplit的数量。我们将创建自己的indexfileinputformat类,扩展默认的fileinputformat.class,并重写其getsplits()方法。您必须读取在上一步创建的文件,将所有索引的inputspits添加到一个列表中,然后将这个列表与超级类返回的列表进行比较。您将只返回到jobtracker索引中找到的inputsplits。
在驱动程序类中,我们现在必须使用这个indexfileinputformat类。我们需要设置为inputformatclass using-要在驱动程序类中使用我们的自定义indexfileinputformat,我们需要提供job.setinputformatclass(indexfileinputformat.class);
有关代码示例和其他详细信息,请参阅-
https://hadoopi.wordpress.com/2013/05/24/indexing-on-mapreduce-2/