spark+kafka+redis统计网站访问者IP-创新互联

*目的是为了防采集。需要对网站的日志信息,进行一个实时的IP访问监控。

公司主营业务:成都做网站、网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出安岳免费做网站回馈大家。

1、kafka版本是最新的0.10.0.0

2、spark版本是1.61

spark+kafka+redis统计网站访问者IP

3、下载对应的spark-streaming-kafka-assembly_2.10-1.6.1.jar放到spark目录下的lib目录下

下载地址 https://repo1.maven.org/maven2/org/apache/spark/

spark+kafka+redis统计网站访问者IP

4、利用flume将nginx日志写入到kafka(后续补充)

5、编写python脚本,命名为test_spark_collect_ip.py

# coding:utf-8
__author__ = 'chenhuachao'
'''
利用pyspark连接kafka,统计访问者的IP信息,做出的一个实时的防采集
'''
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import redis
import datetime
from pyspark.streaming.kafka import KafkaUtils
from pyspark.streaming import StreamingContext
from pyspark import SparkConf, SparkContext
def parse(logstring):
    try:
        infodict =  eval(logstring.encode('utf-8'))
        ip =infodict.get('ip')
        assert infodict['tj-event'] == 'onload'
        assert ip
        return (ip)
    except:
        return ()
def insert_redis(rdd):
    '''将符合条件的结果写入到redis'''
    conn = redis.Redis(host='redis的IP',port=6380)
    for i,j in rdd.collect():
        print i,j
        if j >=3 and j != "":
            conn.sadd('cheating_ip_set_{0}'.format(datetime.datetime.now().strftime("%Y%m%d")),i)
            conn.expire('cheating_ip_set',86400)
if __name__ == "__main__":
    topic = 'statis-detailinfo-pageevent'
    sc = SparkContext(appName="pyspark_kafka_streaming_chc")
    ssc = StreamingContext(sc,10)
    checkpointDirectory = '/tmp/checkpoint/cp3'
    ssc.checkpoint(checkpointDirectory)
    kvs = KafkaUtils.createDirectStream(ssc,['statis-detailinfo-pageevent'],kafkaParams={"auto.offset.reset": "largest","metadata.broker.list":"kafka-IP:9092,kafka-IP:9092"})
    #kvs.map(lambda line:line[1]).map(lambda x:parse(x)).pprint()
    #这里用到了一个滑动窗口的概念,需要深入了解的可以参考http://www.kancloud.cn/kancloud/spark-programming-guide/51567
    #ipcount = kvs.map(lambda line: line[1]).map(lambda x:parse(x)).map(lambda ip:(ip,1)).reduceByKey(lambda ips,num:ips+num)
    ipcount = kvs.map(lambda line: line[1]).map(lambda x:parse(x)).map(lambda ip:(ip,1)).reduceByKeyAndWindow(lambda ips,num:ips+num,30,10)
    # 预处理,如果需要多次计算则使用缓存
    # 传入rdd进行循坏,即用于foreachRdd(insertRedis)
    ipcount.foreachRDD(insert_redis)
    # 各节点的rdd的循坏
    # wordCounts.foreachRDD(lambda rdd: rdd.foreach(sendRecord))
    ssc.start()

6、执行命令

bin/spark-submit --jars lib/spark-streaming-kafka-assembly_2.10-1.6.1.jar test_spark_collect_ip.py

7、输出界面

spark+kafka+redis统计网站访问者IP

8、更多信息,请参考spark的官网http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html#module-pyspark.streaming.kafka

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:spark+kafka+redis统计网站访问者IP-创新互联
路径分享:http://azwzsj.com/article/diiogp.html