如何为mrjob映射器的每次迭代获取并处理新的S3文件?

时间:2014-04-24 18:57:10

标签: python emr mrjob

我有一个status_changes的日志文件,每个文件都有一个driver_id,timestamp和duration。使用driver_id和timestamp,我想从S3获取适当的GPS日志。这些GPS日志以bucket_name / yyyy / mm / dd / driver_id.log的形式存储在S3存储桶中。

from mrjob.job import MRJob
class Mileage(MRJob):

    def get_s3_gpslog_path(self, driver_id, occurred_at, status):
        s3_path = "s3://gps_logs/{yyyy}/{mm}/{dd}/{driver_id}.log"
        s3_path = s3_path.format(yyyy=occurred_at.year,
                                 mm=occurred_at.month,
                                 dd=occurred_at.day,
                                 driver_id=driver_id)
        return s3_path

    def mapper(self, _, line):
        line = ast.literal_eval(line)
        driver_id = line['driverId']
        occurred_at = line['timestamp']
        status = line['status']
        s3_path = self.get_s3_gpslog_path(driver_id, occurred_at, status)
        # ^^ How do I fetch this file and read it?
        distance = calculate_distance_from_gps_log(s3_path, occurred_at, status)

        yield status, distance


if __name__ == '__main__':
    Mileage.run()

从命令行我使用status_change日志文件作为输入运行它:     $ python mileage.py status_changes.log

我的问题是:考虑到我构建的S3 URI字符串,我如何实际获取GPS日志?

1 个答案:

答案 0 :(得分:0)

您可以使用属于mrjob的S3Filesystem。您也可以在脚本中使用boto的S3实用程序。您可能需要对(秘密)访问密钥进行硬编码(或从每个节点中的Hadoop配置解析)。但是,映射器正在做的事情可能有点过多,可能会过多地请求获取S3资源。您可以通过在GPS日志中与其他日志一起流式传输来重写MapReduce算法,从而以较少资源密集的方式进行连接。