【问题标题】:MultipleInputs with DBInputFormat in HadoopHadoop 中使用 DBInputFormat 的多输入
【发布时间】:2011-12-02 03:13:20
【问题描述】:

在我的数据库中,我有多个表,每个表都是不同的实体类型。我有一个在 hadoop 中使用的 Avro 模式,它是这些不同实体类型的所有字段的联合,加上它有一个实体类型字段。

我想做的是为每个实体类型设置一个 DBInputFormat 和一个 DBWritable,将实体类型映射到组合的 Avro 类型。然后将每个 DBInputFormat 赋予 MultipleInputs 之类的东西,以便我可以创建复合输入格式。然后可以将复合输入格式提供给我的 map reduce 作业,以便所有表中的所有数据都可以由同一个映射器类一次处理。

数据会不断地添加到这些数据库表中,因此我需要能够为每个实体类型/dbtable 配置 DBInputFormat,以便仅获取新数据并正确进行拆分。

基本上,我需要 DBInputFormat 或 DataDrivenDBInputFormat 的功能,还需要能够将它们组合起来,类似于使用路径和 MultipleInputs 可以做的事情。

【问题讨论】:

    标签: hadoop mapreduce rdbms avro database-table


    【解决方案1】:

    从 N 个输入表中创建一个视图,并在 DBInputFormat#setInput 中设置该视图。根据 Cloudera article。所以,我猜在作业完成时不应该更新表中的数据。

    Hadoop 可能需要多次执行相同的查询。每次都需要返回相同的结果。因此,对数据库等的任何并发更新都不应影响 MapReduce 作业正在运行的查询。这可以通过在 MapReduce 作业运行时禁止写入表、通过诸如“insert_date

    评估支持实时处理的框架,例如 StormHStreamingS4Strembases。其中有些位于 Hadoop 之上,有些则没有,有些是 FOSS,有些是商业的。

    【讨论】:

    • 恐怕这可能是唯一没有编写我自己的 InputFormat 的答案。这种方法的问题在于,所有映射器都将查询所有表,这将比映射器子集查询一个表、另一个子集查询另一个表等效率低得多。我必须做每个映射器抓取的窗口大小要小得多,因为它从每个表中抓取该窗口。每个窗口抓取都会对表进行一次全表扫描,因此全表扫描次数会多得多。
    • 或者使用导出实用程序将表转储到多个文件中并使用MultipleInputs。如果您碰巧编写了自己的输入格式,请尝试将其回馈给 Apache。
    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多