今天,我们还是在介绍spark的小练习,这次的小练习还是基于IP相关的操作,我们可以先看一下今天的需求,我们有两个文件,

  第一个文件,是IP的字典,也就是我们上一篇介绍过的,就是表明了所有IP字段所属的位置,以及最大值以及最小值(例如)

1.0.1.0|1.0.3.255|16777472|16778239|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.0.8.0|1.0.15.255|16779264|16781311|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.0.32.0|1.0.63.255|16785408|16793599|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.1.0.0|1.1.0.255|16842752|16843007|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302

  例如第一行的数据,
  1.0.1.0|1.0.3.255|16777472|16778239|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302

  这个里面16777472以及16778239就是当我们把IP转换成Long类型的值之后,如果那个值在这个里面,我们就可以确定这个IP实在中国 的福建

  第二个文件,是一个日志,这个日志里面的内容大致是这个用户访问的时间,以及IP,以及浏览网址以及浏览器所带的一些信息(例如)

20090121000132095572000|125.213.100.123|show.51.com|/shoplist.php?.....
20090121000132124542000|117.101.215.133|www.jiayuan.com|/19245971|Mozilla/4.0 (compatible; MSIE 6.0;.......
20090121000132406516000|117.101.222.68|gg.xiaonei.com|/view.jsp?p=389|Mozilla/4.0 (compatible; MSIE 7.0; .....
20090121000132581311000|115.120.36.118|tj.tt98.com|/tj.htm|Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TheWorld)|http://www.tt98.com/|

  则此时我们就可以开始写程序了,

package cn.wj.spark.day04

import org.apache.spark.{SparkConf, SparkContext}

/**
* Created by WJ on 2017/1/4.
*/
object IPLocation { //将IP转换成为Long类型
def ip2Long(ip: String): Long = {
val fragments = ip.split("[.]")
var ipNum = 0L
for (i <- until fragments.length){
ipNum = fragments(i).toLong | ipNum << 8L
}
ipNum
} //使用二分法,对IP进行查找,让ip与start_num以及end_num做对比
def binarySearch(lines: Array[(String, String, String)], ip: Long) : Int = {
var low =
var high = lines.length -
while (low <= high) {
val middle = (low + high) /
if ((ip >= lines(middle)._1.toLong) && (ip <= lines(middle)._2.toLong))
return middle
if (ip < lines(middle)._1.toLong)
high = middle -
else {
low = middle +
}
}
-
} def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[2]").setAppName("IPLocation")
val sc = new SparkContext(conf) val ipRulesRdd = sc.textFile("e://Test/ip.txt").map(lines =>{
val fields = lines.split("\\|")
val start_num = fields()
val end_num = fields()
val province = fields()
(start_num,end_num,province)
})
//全部的IP映射规则
val ipRulesArrary = ipRulesRdd.collect() //广播规则,这个是由Driver向worker中广播规则
val ipRulesBroadcast = sc.broadcast(ipRulesArrary) //加载要处理的数据
val ipsRDD = sc.textFile("e://Test/access_log").map(line =>{
val fields = line.split("\\|")
fields()
}) val result = ipsRDD.map(ip =>{
val ipNum = ip2Long(ip)
val index = binarySearch(ipRulesBroadcast.value,ipNum)
val info = ipRulesBroadcast.value(index)
info
}) println(result.collect().toBuffer)
sc.stop()
}
}

则以上的结果会显示为:

  

  但是对于大数据来说,我们可能更想知道的是关于IP的一个总的计算,那么这个就会很简单,

  

val result = ipsRdd.map(ip =>{
val ipNum = ip2Long(ip)
val index = binarySearch(ipRulesBroadcast.value,ipNum)
val info = ipRulesBroadcast.value(index)
info
}).map(t => {(t._3,)}).reduceByKey(_+_)

  我们只需要在上面的代码中把最后的输出结果在进行一个reduceByKey即可,则效果显示为:

  

对于这个里面,有一下几点想说

  1.特殊转义的字符串:xxx.split("\\|")

  2.为什么我们有些时候在写spark的程序的时候,我们要写

    val conf = new sparkConf().setAppName("xxx").setMaster("local[2]")

    val sc = new SparkContext(conf)

   这个是由于,我们要在main里面要使用spark的算子进行计算,所以我们需要写,如果不需要使用算子,完全没必要写这个

  3.一般从RDD中变为Action,我们此时可以println(result.collect().toBuffer)
  4.如果是要返回一个元祖,我们可以加上一个括号,然后类似于(province,start_num,end_num)

  5.将IP的值转化为Long类型的数
  

 //将IP转换成为Long类型
def ip2Long(ip: String): Long = {
val fragments = ip.split("[.]")
var ipNum = 0L
for (i <- until fragments.length){
ipNum = fragments(i).toLong | ipNum << 8L
}
ipNum
}

  6.上述程序为什么会有广播的概念,因为当我Master接到一个任务的时候,他要把这个任务放到Worker的Excutor中执行,对于匹配的规则,是我们在main中得到,如果要把这个规则让每一个worker都可以得到,所以我们需要 Master把这些信息广播到Worker上

  

spark练习---ip匹配以及广播的特性的更多相关文章

  1. PHP Swoole 基于纯真IP库根据IP匹配城市

    把纯真IP库读到内存,纯真IP库本来就是有序的,然后每次请求二分查找就行,44WIP查找十几次就搞定了 dispatch_mode最好写3,不然做服务的时候,会导致进程任务分配不均匀. max_req ...

  2. Spark性能调优:广播大变量broadcast

    Spark性能调优:广播大变量broadcast 原文链接:https://blog.csdn.net/leen0304/article/details/78720838 概要 有时在开发过程中,会遇 ...

  3. Spark之RDD的定义及五大特性

    RDD是分布式内存的一个抽象概念,是一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,能横跨集群所有节点并行计算,是一种基于工作集的应用抽象. RDD底层存储原理:其数据分布存储于多台机器上 ...

  4. Update(Stage4):Spark原理_运行过程_高级特性

    如何判断宽窄依赖: =================================== 6. Spark 底层逻辑 导读 从部署图了解 Spark 部署了什么, 有什么组件运行在集群中 通过对 W ...

  5. 【Spark】如何用Spark查询IP地址?

    文章目录 需求 思路 ip地址转换为Long类型的两种方法 ip地址转换数字地址的原理 第一种方法 第二种方法 步骤 一.在mysql创建数据库表 二.开发代码 需求 日常生活中,当我们打开地图时,会 ...

  6. 【Spark调优】Broadcast广播变量

    [业务场景] 在Spark的统计开发过程中,肯定会遇到类似小维表join大业务表的场景,或者需要在算子函数中使用外部变量的场景(尤其是大变量,比如100M以上的大集合),那么此时应该使用Spark的广 ...

  7. 0429---每日习题 菲薄纳西数列 正则ip匹配

    #8.打印斐波拉契数列前n项 def fib(n): if n==1 or n==2: return 1 return fib(n-1)+fib(n-2) for i in range(1,9): p ...

  8. Spark的RDD原理以及2.0特性的介绍

    转载自:http://www.tuicool.com/articles/7VNfyif 王联辉,曾在腾讯,Intel 等公司从事大数据相关的工作.2013 年 - 2016 年先后负责腾讯 Yarn ...

  9. spark新能优化之广播共享数据

    如果你的算子函数中,使用到了特别大的数据,那么,这个时候,推荐将该数据进行广播.这样的话,就不至于将一个大数据拷贝到每一个task上去.而是给每个节点拷贝一份,然后节点上的task共享该数据. 这样的 ...

随机推荐

  1. Android监听安装卸载

    需要通过receiver来监听: 在AndroidManifest.xml文件中注册的receiver中必须加上<data android:scheme="package"/ ...

  2. Spark资源管理

    Spark资源管理 1.介绍 Spark资源管控分为spark集群自身可支配资源配置和job所用资源配置. 2.spark集群支配资源控制 在spark的conf/spark-env.sh文件中可以指 ...

  3. IOS通讯录的隐藏标签【电话】的特殊功能(在IOS11已失效)

    这功能比较适合有强迫症,爱折腾的人哈!! 规范了通讯录标签,以后可以轻松的知道别人是用短号还是亲情网给你打电话. 如果是长号还可以显示归属地. 也许从IOS8(不太清楚)开始自带了号码归属地显示功能, ...

  4. Python-Django框架学习笔记——第二课:Django的搭建

    Django 环境搭建 一. 版本选择 Django 1.5.x 支持 Python 2.6.5 Python 2.7, Python 3.2 和 3.3. Django 1.6.x 支持 Pytho ...

  5. Ajax的学习笔记(一)

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),ajax并不是一门单独的语言,而是一种技术,是指一种创建交互式网页应用的网页开发技术. ...

  6. deep learning书的阅读

    最近坚持读书,虽然大多数读的都是一些闲书,传记.历史或者散文之类的书籍,但是也读了点专业书.闲书是散时间读的,放车里,有时间就拿起来读读,专业书则更多的靠得是专注.因为我给自己的规定是一定时间内读完几 ...

  7. 前端JavaScript之DOM事件操作

    DOM:文档对象模型,操作网页上的元素的API.比如让盒子移动.变色.轮播图等. 1.DOM(Document Object Moduel):文档对象模型 定义了访问和操作HTML文档的标准法,把HT ...

  8. Mantle--国外程序员最常用的iOS模型&字典转换框架

    Mantle简介 Mantle是iOS和Mac平台下基于Objective-C编写的一个简单高效的模型层框架. Mantle能做什么 Mantle可以轻松把JSON数据.字典(Dictionary)和 ...

  9. vue学习之路 - 0.背景

    1 单页面应用程序 Single Page Application (SPA) 从字面意义来看就是一个网站就一个页面,如: coding 网易云音乐 极致的用户体验,就像nativeapp一样 优点: ...

  10. vue2.0之监听属性的使用心得及搭配计算属性的使用

    我们在工作中常常需要监听某一个属性值的变化,这个时候我们就需要用到了监听属性watch,在这里我总结watch属性的三种场景使用希望对你有所帮助: 1.基础版监听: 场景如下:输入框输入你的年龄,如果 ...