大数据mapreduce二分法ip定位之Python实现

时间:2022-09-13 12:43:00

ip定位数据大约12M,采用-chacheFile 分发

文件来源https://pan.baidu.com/s/1J0pwTafHgt4T0k3vV_gC-A

格式大致格式如下:

0.0.0.0 0.255.255.255 NULL IANA保留地址 NULL
1.0.0.0 1.0.0.255 亚洲 亚太地区 NULL
1.0.1.0 1.0.1.255 亚洲 中国 福建
1.0.2.0 1.0.3.255 亚洲 中国 福建
1.0.4.0 1.0.7.255 大洋洲 澳大利亚 NULL
1.0.8.0 1.0.15.255 亚洲 中国 广东
1.0.16.0 1.0.31.255 亚洲 日本 NULL
1.0.32.0 1.0.63.255 亚洲 中国 广东
1.0.64.0 1.0.127.255 亚洲 日本 NULL
1.0.128.0 1.0.255.255 亚洲 泰国 NULL

用户数据是应该是大量的,这个用于数据输入:

文件来源:https://pan.baidu.com/s/1l6qqr9U2YObl_pyM4r3VjA

数据大致格式如下:

ECEE8FBBBB      113.224.76.226
ED38780B1D 106.36.217.145
120BB4FB44 113.109.42.83
9D4EC87B4B 219.153.212.31
AF0E43C785 111.77.229.40
4AAAEB560B 60.13.190.132
53BAABADD8 124.167.254.130
6C1FADFF90 60.27.188.251
478A215D8C 101.47.19.207
0000000000 106.114.74.120
A7FDC270DF 112.26.70.229
1714BE65F3 36.63.12.44
0EFF6D7DCC 218.75.123.226
0000000000 211.161.248.231

map.py思路,每个计算节点都将ip定位数据加载到内存中,然后输入部分用户数据,进行分析,代码如下:

#!/usr/bin/python
ip_convert = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])#将ip转换为数字
def load_ip_lib_func(ip_lib_fd):#将ip定位信息加载到内存
ip_lib_list = []
file_in = open(ip_lib_fd, 'r')
for line in file_in:
ss = line.strip().split(' ')
if len(ss) != 5:
continue
start_ip = ss[0].strip()
end_ip = ss[1].strip()
area = ss[2].strip()
country = ss[3].strip()
province = ss[4].strip()
ip_lib_list.append((ip_convert(start_ip), ip_convert(end_ip), area, country, province))
return ip_lib_list def get_addr(ip_lib_list, ip_str):#二分查找获取地址信息
ip_num = ip_convert(ip_str)
low_index = 0
mid_index = 0
high_index = len(ip_lib_list) - 1
while (low_index < high_index):
mid_index = (low_index + high_index) / 2
sss = ip_lib_list[mid_index]
start_ip = sss[0]
end_ip = sss[1]
provice = sss[4].strip()
if ip_num < start_ip:
high_index = mid_index - 1
elif ip_num > start_ip:
low_index = mid_index + 1
if ip_num < start_ip:
provice = ip_lib_list[mid_index-1][4]
else:
provice = ip_lib_list[mid_index][4]
return provice
def mapper_func(ip_lib_fd):
ip_lib_list = load_ip_lib_func(ip_lib_fd) for line in sys.stdin:
ss = line.strip().split('\t')
if len(ss) != 2:
continue cookie = ss[0].strip()
ip_str = ss[1].strip() user_addr = get_addr(ip_lib_list, ip_str)
print '\t'.join([cookie, ip_str, user_addr]) if __name__ == "__main__":
module = sys.modules[__name__]
func = getattr(module, sys.argv[1])
args = None
if len(sys.argv) > 1:
args = sys.argv[2:]
func(*args)

run.sh如下:

HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop"
STREAM_JAR_PATH="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar" INPUT_FILE_PATH_1="/mapreduce/ip/cookie_ip.txt"
OUTPUT_PATH="/mapreduce/ip/out" $HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH # Step 1.
$HADOOP_CMD jar $STREAM_JAR_PATH \
-input $INPUT_FILE_PATH_1 \
-output $OUTPUT_PATH \
-mapper "python map.py mapper_func ABC" \
-reducer "cat" \
-jobconf "mapred.reduce.tasks=5" \
-jobconf "mapred.map.tasks=5" \
-jobconf "mapreduce.reduce.memory.mb=5000" \
-jobconf "mapred.job.name=ip_lib_demo" \
-cacheFile "hdfs://master:9000/mapreduce/ip/ip.lib.txt#ABC" \
-file "./map.py"

大数据mapreduce二分法ip定位之Python实现的更多相关文章

  1. 大数据mapreduce俩表join之python实现

    二次排序 在Hadoop中,默认情况下是按照key进行排序,如果要按照value进行排序怎么办?即:对于同一个key,reduce函数接收到的value list是按照value排序的.这种应用需求在 ...

  2. 大数据mapreduce全局排序top-N之python实现

    a.txt.b.txt文件如下: a.txt hadoop hadoop hadoop hadoop hadoop hadoop hadoop hadoop hadoop hadoop hadoop ...

  3. 大数据全栈式开发语言 – Python

    前段时间,ThoughtWorks在深圳举办一次社区活动上,有一个演讲主题叫做“Fullstack JavaScript”,是关于用JavaScript进行前端.服务器端,甚至数据库(MongoDB) ...

  4. 大数据 --&gt&semi; MapReduce原理与设计思想

    MapReduce原理与设计思想 简单解释 MapReduce 算法 一个有趣的例子:你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃? MapReduce方法则是: 给在座 ...

  5. 我要进大厂之大数据MapReduce知识点&lpar;2&rpar;

    01 我们一起学大数据 今天老刘分享的是MapReduce知识点的第二部分,在第一部分中基本把MapReduce的工作流程讲述清楚了,现在就是对MapReduce零零散散的知识点进行总结,这次的内容大 ...

  6. 我要进大厂之大数据MapReduce知识点(1)

    01 我们一起学大数据 老刘今天分享的是大数据Hadoop框架中的分布式计算MapReduce模块,MapReduce知识点有很多,大家需要耐心看,用心记,这次先分享出MapReduce的第一部分.老 ...

  7. 【大数据技术能力提升&lowbar;1】python基础

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  8. 大数据MapReduce相关的运维题

    1.在集群节点中/usr/hdp/2.4.3.0-227/hadoop-mapreduce/目录下,存在一个案例 JAR 包 hadoop-mapreduce-examples.jar.运行 JAR ...

  9. python学习--大数据与科学计算第三方库简介

    大数据与科学计算  库名称 简介 pycuda/opencl GPU高性能并发计算 Pandas python实现的类似R语言的数据统计.分析平台.基于NumPy和Matplotlib开发的,主要用于 ...

随机推荐

  1. 使用James搭建一个自己的邮箱服务器

    ---第一天开发--- 下载Apache James 3.0邮箱服务器,解压到响应的目录 可以看到目录结构: H:\code\JavaCode\James\apache-james-3.0-beta4 ...

  2. VS2013 解决方案文件结构分析

    http://www.cnblogs.com/haogj/p/4248030.html Visual Studio 的解决方案文件是一个文本文件,其中的内容不是太复杂,有些时候 Visual Stud ...

  3. html中的框架

    1.总的代码 <frameset rows=20%,*> <frame src="top.html" /> <frameset cols=30%,*& ...

  4. 抛弃EF,20分构建一个属于自己的ORM框架

    Poiuyt_cyc 博客园首页新随笔联系订阅管理随笔 - 11  文章 - 0  评论 - 111 抛弃EF,20分构建一个属于自己的ORM框架 相信EF大家都不陌生了,因为数据库表跟程序实体是一一 ...

  5. hdu 4612 Warm up(缩点&plus;树上最长链)

    本来就是自己负责图论,结果水了= = 题目其实很裸,就是求桥的数量,只是要新加上一条边罢了.做法:先缩点.再在树上搜最长链(第一场多校的hdu 4607Park Visit就考了最长链,小样,套个马甲 ...

  6. WPF下的视频录制界面设计

    原文:WPF下的视频录制界面设计 在去年12月份,我曾经写过三篇文章讨论C#下视频录制.播放界面的设计.这三篇文章是:利用C#画视频录制及播放的界面(一) 利用C#画视频录制及播放的界面(二)利用C# ...

  7. &lpar;NO&period;00002&rpar;iOS游戏精灵战争雏形&lpar;八&rpar;

    子弹的初始化工作前2篇基本做好了,下面就是如何射出子弹. 通常来说,子弹射向目标对象,需要走一条直线.直线由2点定位,分别为发射点和目标点. 发射点就是开枪精灵自身的位置,目标点则为敌方精灵的位置,大 ...

  8. JavaScript之八皇后问题(递归)

      八皇后问题,是一个古老而著名的问题,该问题最早由国际西洋棋棋手马克斯·贝瑟尔(Max Bezzel)于1848年提出.八皇后问题的具体描述为:在\(8\times8\)的国际象棋上摆放8个皇后,使 ...

  9. PHP、Lua中的 尾调用

    在程序设计中,递归(Recursion)是一个很常见的概念,合理使用递归,可以提升代码的可读性,但同时也可能会带来一些问题. 下面以阶乘(Factorial)为例来说明一下递归的用法,实现语言是PHP ...

  10. 摄像机内参相关(3ds max)

    一般的原理参考:http://ksimek.github.io/2012/08/13/introduction/ 对于3ds max建模时使用的target camera,如果想得到它的内外参,可以利 ...