网站访问数据ip地址分析--Spark技术

网站访问数据ip地址分析

一、 技术:

语言:python
分析技术:spark
技术路线:本地数据源–>spark 分析–>打印结果数据

二、 需求:

求出各个省份访问量。

三、数据解读:

数据路径分别为:
http://10.90.3.2/HUP/spark/ip.txt
http://10.90.3.2/HUP/spark/http.log
1、http.log 为某网站采集的用户访问数据。
访问时间信息|访问的主机ip|访问源
网站访问数据ip地址分析--Spark技术_第1张图片
2、ip.txt
为一个参照信息表,里面记载着每个省份对应的ip范围。
起始ip|结束ip|起始ip对应的Long类型数据|结束ip对应的Long类型数据|…
ip.txt

四、思路提示:

目标是计算每个省份访问的访问量

  1. 提取每条访问日志数据的,用户ip?
  2. 根据这个ip如何确定ip所属省份?
  3. 得到每个用户所属省份进行聚合?

五、代码编写思路

1、整体框架代码
网站访问数据ip地址分析--Spark技术_第2张图片

# coding=utf-8 
from pyspark import SparkConf , SparkContext
import os
# 初始化运行环境
os.environ["JAVA_HOME"]="/opt/jdk8/"
os.environ["PYSPARK_PYTHON"]="/opt/conda3/bin/python"

if __name__=="__main__":
    conf = SparkConf().SetAppName("IpSearch").setMaster("Local[2]")
    sc = SparkContext.getOrCreate(conf)
    # 设置日志级别
    sc.setLogLevel("WARN")
    #获取ip分布基础数据
    ipInfo = sc.textFile("file:///home/ubuntu/ip.txt")
    #切分数据==>(startIp, endIn nrovince)
    splitIpInfo = ipInfo.map(split_ipinfo)    # (startIp, end p,province)
    """
    ip基本信息,每个计算节点的executor都需要,在此需要进行广播,
    广播变量:对于经常用到的小批量的数据,为了避免调用时产生大量网络I0,最好把该变量广播
    在广播变量之前,需要调用action算子把数据提取到
    """
    arrIpInfo = splitIpInfo.collect()
    broadcastIpInfo = sc.broadcast(arrIpInfo)
    #获取用户点击流日志数据
    provinceInfo = sc.textFile("file:///home/ubuntu/http.log")
    #切分数据,找到该用户ip属于那个省并返回==)目标数据(每行访向记录的ip对应的省份,1)
    province_1 = provinceInfo.map(split.info)
    province_count = province_1.reduceByKey(lambda x,y:x+y)
    #打印结果数据
    print(province_count.collect())
    sc.stop()

2、实现需要实现的方法
实现split_ipinfo方法,split_info方法,写到if name==“main”:上面。
实现上面split_info中需要实现的2个方法,写到split_info上面。

def split_ipinfo(line):
    fields=line.split("|")
    startIp=fields[2]
    endIp=fields[3]
    province=fields[6]
    return (startIp, endIp, province)
def split_info(line):
    fields=line.split("|")
    ip=fields[1]
    #自定义一个ip2long方法,可将ip装换为对应的long类型
    ipToLong=ip2Long(ip)
    arrIpInfo=broadcastIpInfo.value   # 获取广播变量的值ip的基本信息
    index=binarySearch(arripInfo, ipToLong)   #根据ip分布基本信息,找到自己的ip所处的ip范围,进而定位所属省份
    #根据索引index找到对应省份
    province=arrIpInfo[index][2]
    return (province,1)
def ip2long(ip):
    import socket,struct
    packedIp=socket.inet_aton(ip)
    return struct.unpack("!L", packedIp)[0]
    #将long类型的ip转回字符串ip socket.inet_ntoa(struct.pack("!L",long类型的ip))
    
    #二分法检索:用于确定用户ip所属范围
def binarySearch(arrIpInfo, ipToLong):
    low = 0
    high = len(arrIpInfo)-1
    while(low<=high):
        middle=(low+high)//2
        if ipToLong>=int (arrIpInfo [middle][0]) and ipToLong<=int(arrIpInfo[middle][1]:
            return middle
        if ipToLong<int (arrIpInfo[middle][0]):
            high=middle-1
        else:
            low=middle+1
    return -1

至此代码主体大体结束。

运行结果
网站访问数据ip地址分析--Spark技术_第3张图片
实验总结:本实验通过某网站采集的用户访问数据求出各个省份访问量,具体思路为根据每条访问记录提取ip,根据ip确定所属省份,最后通过二分法来进行聚合计算。提取到的ip要转换为Long类型,与在ip参照信息表提取的ip对应的Long类型数据,用二分法来进行聚合计算。

你可能感兴趣的:(网站访问数据ip地址分析--Spark技术)