这次做了一个ip段匹配的mapreduce程序,记录下来,所遇到的一些问题,这次共做了几次尝试:
将login日志全部加在到内存,然后对总数据在myinputformat中进行处理和分区,首先统计数据总量,然后将数据大致均匀的分成几个split。然后在map的setup()方法中读取小表ip段的数据,放入list中,此时在map函数中一条条读取消息,进行匹配算法。但是这个的话,当数据量小的时候还可以,当数据量大的时候,就会报内存溢出。
先在inputformat当中将所有的去重之后的userid查询出来,分布到不同的split中当做map的key,然后在每个mapper中,setup方法中读取小表,在map方法中取出当前key的所有登录记录,将此记录与ip段数据一一比对,生成结果。此方法与上面的通病,将数据加载到内存中去,很容易导致内存溢出。
为了防止内存溢出,可以将数据放在hdfs中去,然后将小表中的数据放入内存中区,将登录日志一条条读出与小表匹配,此时没有什么影响,但是数据结果迟迟出不来,推算是因为匹配的循环太多了,数据处理速度太慢。
还是将数据存储在hdfs当中,然后将login中的ip地址的前两位当做key,与ip段中的前两位也当做key,例如实际的登录ip为10.8.16.24,而ip段为 10.8.16.0-------10.8.17.25,此时两个表同时将10.8当做key值,这样就可以做左右join,而此时循环的次数大大降低,效率比较快。
原文地址:http://alentain.blog.51cto.com/3572099/1606147