hadoop-大型数据库查询

pnwntuvh  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(341)

情况:我有一个postgres数据库,它包含一个有几百万行的表,我正试图为mapreduce作业查询所有这些行。
根据我对dbinputformat所做的研究,hadoop可能会尝试在新的Map器中再次使用相同的查询,由于这些查询需要花费大量的时间,我想用我想到的两种方法之一来防止这种情况:

1) Limit the job to only run 1 mapper that queries the whole table and call it 
   good.

2) Somehow incorporate an offset in the query so that if Hadoop does try to use
   a new mapper it won't grab the same stuff.

我觉得选项(1)似乎更有希望,但我不知道这样的配置是否可行。选项(2)理论上听起来不错,但我不知道如何跟踪正在生成的Map器,以及是否有可能检测到并重新配置。
非常感谢您的帮助,我正在寻找一种方法来提取所有db表数据,而不是运行几个相同的查询,因为那样会浪费时间。

camsedfj

camsedfj1#

dbinputformat实际上已经完成了选项2。它在查询中使用limit和offset来划分工作。例如:
Map器1执行:从mytable order by keyfield limit 100中选择field1、field2
Map器2执行:从mytable order by keyfield limit 100 offset 100中选择field1、field2
Map器3执行:从mytable order by keyfield limit 100 offset 200中选择field1、field2
因此,如果您在键字段上有适当的索引,您可能不应该介意正在运行多个查询。在这里,你得到一些可能的重新工作是与投机执行。有时hadoop会调度同一任务的多个任务,并且只使用最先完成的任务的输出。如果需要,可以通过设置以下属性来关闭此功能:

mapred.map.tasks.speculative.execution=false

但是,如果您没有一个合理的键来有效地执行这些顺序、限制和偏移查询,那么所有这些都是不可能的。这就是你可以考虑使用你的选项1的地方。你绝对可以这样做。设置属性:

mapred.map.tasks=1

从技术上讲,inputformat对运行多少map任务有“最终决定权”,但dbinputformat始终尊重此属性。
您可以考虑使用的另一个选项是名为sqoop的实用程序,它是为在关系数据库和hadoop之间传输数据而构建的。不过,这将使这一过程分为两步:首先将postgres中的数据复制到hdfs,然后运行mapreduce作业。

相关问题