尚硅谷大数据项目之实时项目4预警需求文档格式.docx
- 文档编号:22593386
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:19
- 大小:2.86MB
尚硅谷大数据项目之实时项目4预警需求文档格式.docx
《尚硅谷大数据项目之实时项目4预警需求文档格式.docx》由会员分享,可在线阅读,更多相关《尚硅谷大数据项目之实时项目4预警需求文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
领取优惠券(行为)
没有浏览商品(行为)
同一设备每分钟只记录一次预警(去重)
3.2数据处理流程图
3.3代码开发
3.3.1事件日志样例类–EventInfo
caseclassEventInfo(mid:
String,
uid:
appid:
area:
os:
ch:
`type`:
evid:
pgid:
npgid:
itemid:
varlogDate:
varlogHour:
varts:
Long)
3.3.2预警日志样例类–CouponAlertInfo
caseclassCouponAlertInfo(mid:
uids:
java.util.HashSet[String],
itemIds:
events:
java.util.List[String],
ts:
3.3.3预警业务类–AlertApp
importcom.alibaba.fastjson.JSON
importcom.atguigu.gmall.constant.GmallConstants
importcom.atguigu.gmall2019.realtime.bean.{CouponAlertInfo,EventInfo}
importcom.atguigu.gmall2019.realtime.util.{MyEsUtil,MyKafkaUtil}
importorg.apache.kafka.clients.consumer.ConsumerRecord
importorg.apache.spark.SparkConf
importorg.apache.spark.streaming.dstream.{DStream,InputDStream}
importorg.apache.spark.streaming.{Seconds,StreamingContext}
importscala.util.control.Breaks._
objectAlertApp{
defmain(args:
Array[String]):
Unit={
valsparkConf:
SparkConf=newSparkConf().setMaster("
local[*]"
).setAppName("
event_app"
)
valssc=newStreamingContext(sparkConf,Seconds(5))
valinputDstream:
InputDStream[ConsumerRecord[String,String]]=MyKafkaUtil.getKafkaStream(GmallConstants.KAFKA_TOPIC_EVENT,ssc)
//1格式转换成样例类
valeventInfoDstream:
DStream[EventInfo]=inputDstream.map{record=>
valjsonstr:
String=record.value()
valeventInfo:
EventInfo=JSON.parseObject(jsonstr,classOf[EventInfo])
eventInfo
}
//2开窗口
valeventInfoWindowDstream:
DStream[EventInfo]=eventInfoDstream.window(Seconds(30),Seconds(5))
//3同一设备分组
valgroupbyMidDstream:
DStream[(String,Iterable[EventInfo])]=eventInfoWindowDstream.map(eventInfo=>
(eventInfo.mid,eventInfo)).groupByKey()
//4判断预警
//在一个设备之内
//1三次及以上的领取优惠券(evidcoupon)且uid都不相同
//2没有浏览商品(evidclickItem)
valcheckCouponAlertDStream:
DStream[(Boolean,CouponAlertInfo)]=groupbyMidDstream.map{case(mid,eventInfoItr)=>
valcouponUidsSet=newutil.HashSet[String]()
valitemIdsSet=newutil.HashSet[String]()
valeventIds=newutil.ArrayList[String]()
varnotClickItem:
Boolean=true
breakable(
for(eventInfo:
EventInfo<
-eventInfoItr){
eventIds.add(eventInfo.evid)//用户行为
if(eventInfo.evid=="
coupon"
){
couponUidsSet.add(eventInfo.uid)//用户领券的uid
itemIdsSet.add(eventInfo.itemid)//用户领券的商品id
}elseif(eventInfo.evid=="
clickItem"
notClickItem=false
break()
)
//组合成元组(标识是否达到预警要求,预警信息对象)
(couponUidsSet.size()>
=3&
&
notClickItem,CouponAlertInfo(mid,couponUidsSet,itemIdsSet,eventIds,System.currentTimeMillis()))
//过滤
valfilteredDstream:
DStream[(Boolean,CouponAlertInfo)]=checkCouponAlertDStream.filter{_._1}
//增加一个id用于保存到es的时候进行去重操作
valalertInfoWithIdDstream:
DStream[(String,CouponAlertInfo)]=filteredDstream.map{case(flag,alertInfo)=>
valperiod:
Long=alertInfo.ts/1000L/60L
valid:
String=alertInfo.mid+"
_"
+period.toString
(id,alertInfo)
alertInfoWithIdDstream.foreachRDD{rdd=>
rdd.foreachPartition{alertInfoWithIdIter=>
MyEsUtil.insertBulk(GmallConstants.ES_INDEX_COUPON_ALERT,alertInfoWithIdIter.toList)
ssc.start()
ssc.awaitTermination()
}
第4章ElasticSearch的保存
4.1ES集群搭建
参考《ElasticSearch集群安装》手册
4.2ES上建好索引
其实即使不提前建立索引,ES也是可以将数据保存进去的。
这种情况,ES会根据第一条要插入的数据进行推断,但是ES的这种推断往往不够准确。
比如:
要区分字段要不要进行索引,字段要不要进行分词,如果分词选用哪个分词器等等。
建立索引语句(包含Mapping)
PUTgmall_coupon_alert
{
"
mappings"
:
{
_doc"
properties"
mid"
type"
"
keyword"
},
uids"
itemIds"
events"
ts"
date"
}
4.3保存ES
4.3.1pom.xml
<
dependency>
<
groupId>
io.searchbox<
/groupId>
artifactId>
jest<
/artifactId>
version>
5.3.3<
/version>
/dependency>
net.java.dev.jna<
jna<
4.5.2<
org.codehaus.janino<
commons-compiler<
2.7.8<
4.3.2保存ES的工具类
importjava.util
importjava.util.Objects
importio.searchbox.client.{JestClient,JestClientFactory}
importio.searchbox.client.config.HttpClientConfig
importio.searchbox.core.{Bulk,BulkResult,Index}
importcollection.JavaConversions._
objectMyEsUtil{
privatevalES_HOST="
http:
//hadoop102"
privatevalES_HTTP_PORT=9200
privatevarfactory:
JestClientFactory=null
/**
*获取客户端
*
*@returnjestclient
*/
defgetClient:
JestClient={
if(factory==null)build()
factory.getObject
*关闭客户端
defclose(client:
JestClient):
if(!
Objects.isNull(client))try
client.shutdownClient()
catch{
casee:
Exception=>
e.printStackTrace()
*建立连接
privatedefbuild():
factory=newJestClientFactory
factory.setHttpClientConfig(newHttpClientConfig.Builder(ES_HOST+"
+ES_HTTP_PORT).multiThreaded(true)
.maxTotalConnection(20)//连接总数
.connTimeout(10000).readTimeout(10000).build)
//批量插入数据到ES
definsertBulk(indexName:
String,docList:
List[(String,Any)]):
Unit={
if(docList.size>
0){
valjest:
JestClient=getClient
valbulkBuilder=newBulk.Builder().defaultIndex(indexName).defaultType("
for((id,doc)<
-docList){
valindexBuilder=newIndex.Builder(doc)
if(id!
=null){
indexBuilder.id(id)
valindex:
Index=indexBuilder.build()
bulkBuilder.addAction(index)
valbulk:
Bulk=bulkBuilder.build()
varitems:
util.List[BulkResult#BulkResultItem]=null
try{
items=jest.execute(bulkBuilder.build()).getItems
}catch{
caseex:
println(ex.toString)
}finally{
close(jest)
println("
保存"
+items.size()+"
条数据"
for(item<
-items){
if(item.error!
=null&
item.error.nonEmpty){
println(item.error)
println(item.errorReason)
Index=newIndex.Builder(Stud("
zhang3"
"
zhang33"
)).index("
gmall2019_stud"
).`type`("
).id("
stu123"
).build()
jest.execute(index)
caseclassStud(name:
String,nickname:
String)
第五章Kibana发布可视化界面
5.1建立indexpattern
建立数据源表达式
利用通配符(*),可以覆盖多个索引,比如order_index_2019_05*
表示覆盖order_index_2019_05_01,order_index_2019_05_02等多个索引。
5.2建立visualize
5.2.1新增一个可视化图
5.2.2选择一个图形类型
本案例选择柱形图(VerticalBar)
5.2.3作图
5.2.3.1纵坐标
Aggregation
聚合方法
CustomerLable
纵坐标的说明标签
5.2.3.2横坐标
分组字段
Field
ORDERby
排序方式
Order
升序降序
Size
列出前n名
5.2.3.3右上角选择时间范围和刷新间隔
运行产生效果图
5.3建立Dashboard
Dashboard是一个可以放很多个可视化图的大仪表盘,你可以把之前设计好的多个可视化图,放置在一个仪表盘中,一起显示。
5.3.1新增一个Dashboard
5.3.2加入多个可视化图
5.3.3形成一个含多个图的仪表盘
5.3.4最后保存
5.4分享到网页中
点击最上方的share按钮
可以把剪切板中的iframe代码嵌入到网页代码中
这样就可以在一张网页中显示kibana中的仪表盘
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 硅谷 数据 项目 实时 预警 需求