开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-IP 段统计-总结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11697
爬虫识别-IP 段统计-总结
目录:
一、抽取出数据中的 IP
二、截取出 ip 的前两位
三、将前两位作为 key,1作为 value 输出
四、调用 reduceByKeyAndWindow 计算最终每个ip段的总量
五、将最终数据转换为 Map,便于后续提取、使用。
一、抽取出数据中的 IP
上节课5分钟范围内 IP 段的访问总量计算完毕。
拿到 processData 做遍历拿到某一条数据,数据为 processData,直接调用.remote 为 IP
val ip= message.remoteAddr
二、截取出 ip 的前两位
拿到第一个点位置,然后拿到第二个点位置,从0开始截取到第二个点位置为 IP 段
//获得到第一个.的位置
val one =ip.indexof(".")
//获得到第二个.的位置
val two =ip.indexof(str=".",one+1)
//ip 段的截取
val ipblock= ip.substring(0,two)
三、将前两位作为key,1作为value输出
(ipblock,1)
四、调用 reduceByKeyAndWindow 计算最终每个 ip 段的总量
.reduceByKeyAndWinow((a:Int)=>a+b,Seconds(6,Seconds(2))
默认窗口需求5分钟但实际窗口宽度6秒钟,窗口滑动的步长2秒钟,频繁计算大时间范围内需求调用 reduceByKeyAndWinow,a、b 数据类型加算法 a+b
五、将最终数据转换为 Map,便于后续提取、使用。
声明 map 类型变量进行接收
var ipBlockCountsMap :collection.Map[string,Int] =null
ipBlockCounts.foreachRDD(rdd=>{
ipBlockCountsMap=rdd.collectAsMap()
})
第一个指标5分钟内 IP 段访问总量总结完毕。
ipblock 怎样截取,是易错点
val ipblock=ip.substring(0,two)
reduceByKeyAndWinow
适用场景
reduceByKeyAndWinow((a:Int)=>a+b,Seconds(6,Seconds(2))
如果要计算一个小时数据,一分钟计算一次,每一分钟的计算都要计算新的一小时,从此时间节点向前推一个小时到下个时间节点再推一个小时,以一个小时为中心有59分钟重复数据,2秒钟同步一次,同步6秒钟的窗口时间,4秒钟数据重复,不是错误。需求要求每隔很短时间内做一次计算,必然有大量重复数据。reduceByKeyAndWin
ow 适用场景是关键点,恰好适用于某个场景下。