陌路茶色/

MapReduce学习笔记

记录MapReduce使用过程中的一些基础知识以及遇到的问题和对应的解决方案

基础知识

mapreduce过程中如果不需要使用

实践中遇到的一些问题

TASK1 --- key-value问题

1T uid映射(文件为A),映射表大小20G(文件为B),将文件A中的uid映射为文件B中对应的值
文件A中的每一行形式: uid1,uid2,...
文件B中的每一行形式: uid1,index1

想到的解决办法:
文件A做如下处理:为每一行生成一个唯一的random,然后和uid连接起来
uid1,uid2,... -> uid1,random,A n uid2,random,A
文件B做如下处理:
uid1,index1 -> uid1,index1,B
将文件A和文件B合并作为输入文件,reduce过程:
通过B找到uid1对应的index1,将uid1,random,A中对应的uid1换成index1 -> index1,random
最后合并:
index1,random -> random,index1 -> index1,index2,...

TASK2 加载较大文件

这里的以加载150M的词典文件为例,我的MapReduce参数都是默认的,对应的mapper代码为:

with open('big_fans_user.txt','r') as fr:
    fans_user={line.strip():1 for line in fr.readlines()}

报如下错误:

Container [pid=4110929,containerID=container_e167_1584536006073_489847_01_000292] is running 101916672B beyond the 'PHYSICAL' memory limit. 
Current usage: 2.1 GB of 2 GB physical memory used; 4.3 GB of 4.2 GB virtual memory used. Killing container. 

参考【Hadoop】运行MR任务,出现Container is running beyond physical memory limits错误提到上面的数字代表的含义依次如下:
2.1G:任务所占的物理内存
2G:mapreduce.map.memory.mb参数默认设置的大小(或设置大小)
4.3G:任务占用的虚拟内存
4.2G:mapreduce.map.memory.mb 乘以 yarn.nodemanager.vmem-pmem-ratio
yarn.nodemanager.vmem-pmem-ratio 是 虚拟内存和物理内存比例,在yarn-site.xml中设置,默认是2.1
参考中对虚拟内存和物理内存都做了详细的解释:

物理内存:内存条
虚拟内存:利用磁盘空间虚拟划出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。(为了满足物理内存的不足而提出的策略)
linux会在物理内存不足时,使用交换分区的虚拟内存。内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

参考中也给出了具体的解决方案,这里我就简单的将mapreduce.map.memory.mb参数调节为4096就好了。

留下一条评论

暂无评论