
- map side join
之所以存在 reduce side join,是因为在 map 阶段不能获取所有需要的 join 字段,即:同一个
key 对应的字段可能位于不同 map 中。Reduce side join 是非常低效的,因为 shuffle 阶段要进
行大量的数据传输。
Map side join 是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表
非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,让每个 map
task 内存中存在一份(比如存放到 hash table 中),然后只扫描大表:对于大表中的每一条
记录 key/value,在 hash table 中查找是否有相同的 key 的记录,如果有,则连接后输出即可。
为了支持文件的复制,Hadoop 提供了一个类 DistributedCache,使用该类的方法如下:
(1)用户使用静态方法 DistributedCache.addCacheFile()指定要复制的文件,它的参数是文
件的 URI(如果是 HDFS 上的文件,可以这样:hdfs://namenode:9000/home/XXX/file,其中
9000 是自己配置的 NameNode 端口号)。JobTracker 在作业启动之前会获取这个 URI 列表,
并 将 相 应 的 文 件 拷 贝 到 各 个 TaskTracker 的 本 地 磁 盘 上 。
( 2 ) 用 户 使 用
DistributedCache.getLocalCacheFiles()方法获取文件目录,并使用标准的文件读写 API 读取相应的文件。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)