gpt4 book ai didi

postgresql - hadoop——大型数据库查询

转载 作者:可可西里 更新时间:2023-11-01 15:06:44 25 4
gpt4 key购买 nike

情况:我有一个 Postgres 数据库,其中包含一个包含几百万行的表,我正在尝试查询所有这些行以进行 MapReduce 作业。

根据我对 DBInputFormat 所做的研究,Hadoop 可能会尝试对新的映射器再次使用相同的查询,并且由于这些查询需要花费大量时间,所以我想通过以下两种方式之一来防止这种情况发生想到了:

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) 在理论上听起来不错,但我不知道我将如何跟踪正在制作的映射器,以及是否有可能检测到并重新配置。

感谢您的帮助,我正在寻找一种方法来提取所有数据库表数据,而不是运行多个相同的查询,因为那会浪费时间。

最佳答案

DBInputFormat 基本上已经完成了您的选项 2。它确实在其查询中使用 LIMIT 和 OFFSET 来划分工作。例如:

  • Mapper 1 执行:SELECT field1, field2 FROM mytable ORDER BY keyfield LIMIT 100
  • Mapper 2 执行:SELECT field1, field2 FROM mytable ORDER BY keyfield LIMIT 100 OFFSET 100
  • Mapper 3 执行:SELECT field1, field2 FROM mytable ORDER BY keyfield LIMIT 100 OFFSET 200

因此,如果您在关键字段上有适当的索引,您可能不应该介意正在运行多个查询。您确实得到一些可能的返工的地方是推测执行。有时 hadoop 会安排多个相同的任务,并且只使用先完成的那个的输出。如果您愿意,可以通过设置以下属性来关闭此功能:

mapred.map.tasks.speculative.execution=false

但是,如果您没有可以有效地执行这些 ORDER、LIMIT、OFFSET 查询的合理 key ,那么所有这一切都是不可能的。这就是您可以考虑使用选项编号 1 的地方。您绝对可以进行该配置。设置属性:

mapred.map.tasks=1

从技术上讲,InputFormat 对运行多少个 Map 任务有“最终决定权”,但 DBInputFormat 始终遵守此属性。

您可以考虑使用的另一个选项是名为 sqoop 的实用程序它是为在关系数据库和 hadoop 之间传输数据而构建的。然而,这将使这个过程分为两步:首先将数据从 Postgres 复制到 HDFS,然后运行您的 MapReduce 作业。

关于postgresql - hadoop——大型数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19693663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com