我想确保我正确理解EMR。我想知道 - 我正在谈论的内容与EMR / Hadoop有什么关系吗?
我目前在我的应用程序上有一个推荐引擎,用于检查存储在MySQL和MongoDB中的数据(两者都在不同的EC2实例上),因此可以向用户建议内容。这已经很好了,但是现在我现在处于执行脚本所需的时间比它应该运行的时间间隔更长的时间点。这显然是个问题。
我正在考虑将此脚本移至EMR。我知道我将能够从我的映射脚本连接到MongoDB和MySQL(即它不需要成为S3上的文件)。我想知道的是 - 如果我开始检查MySQL / S3上的数据 - Hadoop是否有一些方法可以确保脚本不检查每个实例上的相同记录?我是否完全理解Hadoop的概念?对不起,如果这个问题真的是菜鸟。
答案 0 :(得分:1)
是的,hadoop会确保来自DB的输入记录被拆分,然后只传递给映射器,即不同的映射器不会读取相同的记录(即使它们在同一个实例上运行)。
一般来说,分割数据的任务取决于所选的InputFormat
,引用here:
InputFormat的另一项重要工作是划分输入数据 源(例如,输入文件)成为构成输入的片段 个别地图任务。这些片段被称为“分裂”并且是 封装在InputSplit接口的实例中。大多数文件,用于 例如,分裂在底层块的边界上 HDFS,由FileInputSplit类的实例表示。 其他文件可能是不可分割的,具体取决于特定于应用程序 数据。划分其他数据源(例如,数据库中的表) 分裂将在不同的,特定于应用程序中执行 时尚。将数据分成输入分割时,这很重要 这个过程快速而便宜。数据本身不应该 被访问以执行此过程(因为它全部由一个人完成 MapReduce作业开始时的机器。)
您可能已经阅读过this,但这对于hadoop的DBInputFormat来说是一个很好的初始资源。