Hadoop 在弹性MapReduce(MySQL&x2B;MongoDB输入)上拆分映射者的职责

Hadoop 在弹性MapReduce(MySQL&x2B;MongoDB输入)上拆分映射者的职责,hadoop,mapreduce,hadoop-streaming,elastic-map-reduce,Hadoop,Mapreduce,Hadoop Streaming,Elastic Map Reduce,我想确保我正确理解电子病历。我想知道——我所说的对EMR/Hadoop有意义吗 目前,我的应用程序上有一个推荐引擎,可以检查MySQL和MongoDB中存储的数据(都在单独的EC2实例上),因此可以向用户推荐内容。这工作得很好,但现在我们正处于执行脚本所需的时间比它应该运行的时间间隔要长的地步。这显然是个问题 我正在考虑将此脚本移动到EMR。我知道我将能够从映射脚本连接到MongoDB和MySQL(也就是说,它不需要是S3上的文件)。我想知道的是,如果我开始检查MySQL/S3上的数据,Hado

我想确保我正确理解电子病历。我想知道——我所说的对EMR/Hadoop有意义吗

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


我正在考虑将此脚本移动到EMR。我知道我将能够从映射脚本连接到MongoDB和MySQL(也就是说,它不需要是S3上的文件)。我想知道的是,如果我开始检查MySQL/S3上的数据,Hadoop是否有某种方法确保脚本不会检查每个实例上的相同记录?我理解Hadoop的概念吗?很抱歉,如果这个问题真的是noob。

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

一般来说,拆分数据的任务取决于所选的
InputFormat
,引自:

InputFormat的另一项重要工作是分割输入数据 将源(例如,输入文件)转换为组成输入的片段 单个地图任务。这些片段被称为“分裂”,并且 封装在InputSplit接口的实例中。大多数文件,例如 例如,在中的基础块边界上拆分 HDF和由FileInputSplit类的实例表示。 其他文件可能不可丢弃,具体取决于应用程序 数据。划分其他数据源(例如,数据库中的表) 拆分将以不同的、特定于应用程序的方式执行 时尚将数据划分为输入拆分时,这一点很重要 这一过程是快速和廉价的。数据本身不应该需要 被访问以执行此过程(因为它是由单个 MapReduce作业开始时的机器)


您可能已经阅读了,但这是一个关于DBInputFormat for hadoop的不错的初始资源

回答得很好,谢谢。您建议使用类似Sqoop的东西,还是直接从PHP脚本连接到数据库?如果数据库的大小足够大(50GB+),那么我建议使用Sqoop,当您需要在增量数据库上定期运行hadoop作业时,Sqoop也很好。即使数据库不够大,使用Sqoop也可以更好地控制数据更新。