【问题标题】:Splitting responsibilities of mappers on Elastic MapReduce (MySQL + MongoDB input)在 Elastic MapReduce 上拆分映射器的职责(MySQL + MongoDB 输入)
【发布时间】:2013-04-29 16:58:22
【问题描述】:

我想确保我正确理解 EMR。我想知道 - 我所说的对 EMR / Hadoop 有意义吗?

我的应用目前有一个推荐引擎,它检查存储在 MySQL 和 MongoDB(都在不同的 EC2 实例上)中的数据,因此可以向用户推荐内容。这工作得很好,但现在我正处于执行脚本的时间比它应该运行的时间间隔更长的地步。这显然是个问题。

我正在考虑将此脚本移至 EMR。我知道我将能够从我的映射脚本连接到 MongoDB 和 MySQL(即它不需要成为 S3 上的文件)。我想知道的是——如果我开始检查 MySQL / S3 上的数据——Hadoop 是否有某种方法可以确保脚本不会检查每个实例上的相同记录?我是否完全理解 Hadoop 的概念?对不起,如果这个问题真的是菜鸟。

【问题讨论】:

    标签: hadoop mapreduce hadoop-streaming elastic-map-reduce


    【解决方案1】:

    是的,hadoop 确实确保来自 DB 的输入记录被拆分,然后只传递给映射器,即不同的映射器不会读取相同的记录(即使它们在同一个实例上运行)。

    一般来说,拆分数据的任务取决于选择的InputFormat,引用here

    InputFormat 的另一个重要工作是对输入数据进行划分 源(例如,输入文件)到组成输入的片段中 单独的地图任务。这些片段被称为“分裂”并且是 封装在 InputSplit 接口的实例中。大多数文件,对于 例如,在底层块的边界上被分割 HDFS,并由 FileInputSplit 类的实例表示。 其他文件可能是不可拆分的,具体取决于特定于应用程序 数据。划分其他数据源(例如,数据库中的表) 拆分将在不同的、特定于应用程序的 时尚。将数据划分为输入拆分时,重要的是 这个过程既快又便宜。数据本身不应该需要 被访问来执行这个过程(因为它都是由一个单一的 MapReduce 作业开始时的机器)。

    您可能已经阅读过this,但这是一个很好的关于 hadoop 的 DBInputFormat 的初始资源。

    【讨论】:

    • 很好的答案,谢谢。你会推荐使用像 Sqoop 这样的东西,还是应该直接从我的 PHP 脚本连接到数据库?
    • 如果您的数据库足够大(50GB+),那么我建议您使用 Sqoop,当您需要在增量数据库上定期运行 hadoop 作业时,Sqoop 也很好。即使您的数据库不够大,使用 Sqoop 也可以让您更好地控制更新数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2016-01-21
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多