开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第六阶段:爬虫识别-Redis 爬虫数据备份-准备数据】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11730
爬虫识别-Redis 爬虫数据备份-准备数据
准备数据
将爬虫数据写到 Redis 中后,流程中的第六步进行完成:
识别出来的爬虫写到 Redis 中后,爬虫识别的最终目标已经完成,要实现反爬虫,就需要将爬虫计算出来,此时已经计算完成,后续如何反爬虫较为简单,例如离线计算。第六阶段除了实现计算识别之外,还要实现其他事情。从总体流程上看,爬虫识别已经完成。回到第六阶段的最初模块,最初模块如下:
1、规则匹配和打分并进行阈值判断
2、剔除非黑名单数据
3、黑名单数据去重
4、黑名单 Redis 数据恢复
5、黑名单数据备份到 Redis
6、黑名单数据实时存储 hdfs,用于 Redis 数据恢复
7、存储规则计算结果RDD到HDFS
已经实现前三步,即黑名单数据备份到 Redis,第四步黑名单radius数据恢复和第六步黑名单数据实时存储 hdfs,用于 Redis 数据恢复和第七步存储规则计算结果Rdd 到 HDFS 中还未完成。将数据写入到 Redis 中,数据可能会丢失,所以就需要将其备份到 HDFS 中,所以就需要完成第六步数据的备份。第四步和第六步完成之后,一整套的Redis数据写入、防止丢失、备份就已经存在,第七步就是存储规则计算结果 Rdd 到 HDFS 中。最核心的是爬虫识别,爬虫识别完成之后,其他功能模块的代码都不太重要。但是面试时如果询问Redis如果丢失了数据,需要知道写入时做了备份,如果丢了,可以进行恢复。
黑名单数据实时存储 hdfs,用于Redis数据恢复。由于 Redis 是基于内存的爬虫数据,写入 Redis 有数据丢失的风险,所以需要将爬虫数据写入 Redis 的同时也写入hdfs,用于当Redis丢失数据时的恢复。设计过程如下:
1、构建 data Fream
2、存储 data Fream
最后将 data Fream 的数据写入到 HDFS 中,此时涉及到构建 date Fream 的过程。首先准备数据,其次填充 array,最后调用写入方法。最关键的是调用写入方法。首先准备存储数据的 array,由于需要写入到 HDFS 中,使用 sparksql 计数。代码如下:
//
黑名单DatpFrame-备份到HDFS
//
写入Redis前,准备存储数据的Array
val antiBlackListDFR= new ArrayBuffer[Row]()
在写入 Redis 的同时封装数据。在数据入库的源代码中,首先遍历 Rdd,其次将Rdd序列化,然后遍历 BLACKdata数据。在遍历出数据之后,加上黑名单DatpFrame-备份到 HDFS。首先准备 array buffer,由于需要写入到radius,所以需要使用变量接收数据。准备好变量之后,将 key 和 value 写入 Redis 中,写入到Redis 中后,立刻将其进行封装,也就是填充 array,代码如下:
//
添加黑名单DataFrame-备份到ArrayBuffer
//
写入redis后立刻将数据添加到antiBlackListDFR
antiBlackListDFR.append(Row(((
PropertiesUtil.getStringByKey(
"cluster.exptime.anti black list",
"jedisConfig.properties").toLong)
* 1000
+ System.currentTimeMilsl().toString,
blackListKey,
blackListValue))
将数据添加到 Redis 中之后,立马将数据写入到之前创建的变量中。添加的数据有Key和value,首先在其中定义了row,在之前声明变量时就是row。由于使用了 Sparksql,需要有一行,其中Key, value就是一行,遍历一次就有一行,而此时套用了for循环,遍历遍历时,将array填满,填充的动作在for循环之中,要注意代码添加的位置。添加的数据有读取工具,读取了反扒黑名单数据有效期。在写入数据写入了3600。所以此时也需要使用这个时间。将时间读取之后转换为long乘以1000,再加上当前时间。还有Key和value。在该array buffer中第1个是时间,第2个是Key,第3个是value,此时将其添加到array中,数据准备完成。接下来将数据写入,调用写入方法。此时需要注意调用写入方法不能在for循环中写,因为是为了封装数据填充array,之前的array在for循环外。代码如下:
//增加黑名单数据实时存储到HDFS的功能黑名单数据持久化用于Redis数据恢复BlackListToHDFS.saveAntiBlackList(sc.parallelize(antiBlackListDFR), sqlContext)
首先引入 array list。在util中的 hdfs 有 BLACKlistHDFS,也就是代码中对应的BLACKlistHDFS。此时需要一个参数 SQLcontext,需要创建该参数,回到计算方法最上方实例SQLcontext:
//
实例SQLcontext
val sqlContext=new SQLContext(sc)
SQLcontext
实例完成,此时已经不报错。