我强烈劝阻您不要将所描述的方法与 EMR 配对,因为它显然违反了 map-reduce 范式。您可能会克服网络流量瓶颈(如果有的话),但会遇到负载平衡映射器的困难。Map-reduce 方法是记录处理,当记录数量无限增长时可以很好地扩展。话虽如此,您的架构是可行的,但更好地与不同的任务处理工具一起使用,例如celery。
如果您希望在 map-reduce 范例中处理您的数据(使用 EMR 和 mrjob),例如,您可以压缩和base64
编码每个页面,以确保将页面存储为文本文件中的一行。有关工作示例,请参阅以下 mrjob 兼容协议:
import cPickle
import zlib
import base64
from mrjob import protocol
class CompressedPickleProtocol(protocol.PickleProtocol):
"""
Protocol that compresses pickled `key` and `value` with
`zlib.compress` and encodes result with `base64.b64encode`.
"""
@classmethod
def encode(cls, value):
return base64.b64encode(value)
@classmethod
def decode(cls, raw_value):
return base64.b64decode(raw_value)
@classmethod
def _writes(cls, value):
return cls.encode(zlib.compress(cPickle.dumps(value)))
@classmethod
def _reads(cls, raw_value):
return cPickle.loads(zlib.decompress(cls.decode(raw_value)))
@classmethod
def read(cls, line):
raw_key, raw_value = line.split('\t', 1)
return (cls._reads(raw_key), cls._reads(raw_value))
@classmethod
def write(cls, key, value):
return '%s\t%s' % (cls._writes(key),
cls._writes(value))