基于大数据的电商数仓数据分析_第1页
基于大数据的电商数仓数据分析_第2页
基于大数据的电商数仓数据分析_第3页
基于大数据的电商数仓数据分析_第4页
基于大数据的电商数仓数据分析_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于大数据的电商数仓数据分析DataAnalysisofE-commerceWarehouseBasedonBigData摘要数据仓库(DataWarehouse),是为企业所有决策制定过程,提供所有系统数据支持的战略集合。数据仓库本身并不“生产”数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用,这也是为什么叫“仓库”,而不叫“工厂”的原因。通过对数据仓库中数据的分析,可以帮助企业改进业务流程、控制成本、提高产品质量等,通过一个个的指标,可以直观的看出企业在运行的过程中每一个阶段的状态,对企业领导层的决策判断以及整体的发展走向起着至关重要的作用。数据仓库,并不是数据的最终目的地,而是为数据最终的目的地做好准备。这些准备包括对数据的:清洗、转义、分类、重组、合并、拆分、统计等,最终这些数据将会流向企业中的各个系统,例如报表系统、用户画像、推荐系统、机器学习、风控系统等,为这些系统的运行提供数据支持。在本项目中,使用Java代码编写数据生成脚本,用于随机生成日志数据文件,然后使用第一层Flume来读取这些日志数据文件,在Flume中将这些数据日志根据事件类型进行分类并且将脏数据进行过滤,然后将数据传输给Kafka进行削峰,再用第二层Flume消费Kafka中的数据,将数据传输到HDFS上进行保存,最后在Hive中建表,导入HDFS中的数据,在Hive中对数据进行分析计算,最终将需求数据使用Presto进行查看。关键词数仓、大数据、电商、数据分析AbstractDataWarehouseisastrategicsetthatprovidesallsystemdatasupportforalldecision-makingprocessesinanenterprise.Thedatawarehouseitselfdoesnot“produce”thedata,anditdoesnotneedto“consume”anydata.Thedatacomesfromtheoutsideandisopentoexternalapplications.Therefore,itiscalled“warehouse”ratherthan“factory”.Throughtheanalysisofthedatainthedatawarehouse,itcanhelptheenterprise,improvethebusinessprocess,controlthecost,improvetheproductquality,etc.Throughtheindicators,youcanintuitivelyseethestateofeachstageoftheenterpriseintheprocessofoperation,totheenterprisethedecision-makingjudgmentoftheleadershipandtheoveralldevelopmenttrendplayacrucialrole.Thedatawarehouseisnotthedestinationofthedata,butispreparedforthedestinationofthedata.Thesepreparationsincludedatacleaning,escaping,classification,reorganization,merging,splitting,statistics,etc.,andultimatelythesedatawillflowtovarioussystemsintheenterprise,suchasreportingsystems,userportraits,recommendationsystems,machinelearning,andwind.Controlsystems,etc.,providedatasupportfortheoperationofthesesystems.Inthisproject,datagenerationscriptsarewritteninJavacodeforrandomlygeneratinglogdatafiles,andthenthefirstlayerofFlumeisusedtoreadtheselogdatafiles.ThesedatalogsaresortedpereventtypeanddirtyinFlume.Thedataisfiltered,andthenthedataistransmittedtoKafkaforpeakclipping.ThedatainKafkaisconsumedbythesecondlayerFlume,andthedataistransferredtoHDFSforstorage.Finally,thedataisbuiltinHiveandthedatainHDFSisimported.ThedataisanalyzedandcalculatedinHive,andthedemanddataisfinallyviewedusingPresto.Keywords:DataWarehouse,BigData,E-commerce,DataAnalysis长春工程学院毕业设计(论文)PAGEPAGE48目录TOC\o"1-2"\h\z\u1引言 11.1设计的目的及意义 11.2企业生产的实际问题 11.3设计方案及技术路线 12项目需求及架构设计 22.1项目需求分析 22.2项目框架 33用户行为数据采集 43.1数据生成模块 43.2数据采集模块 124用户行为数据仓库 234.1数仓分层概念 234.2数仓搭建环境准备 244.3数仓搭建之ODS层 264.4数仓搭建之DWD层 275系统业务数据仓库 305.1电商业务与数据结构简介 305.2数仓搭建 336业务需求数据分析 406.1需求一:用户活跃主题 406.2需求二:用户新增主题 426.3需求三:GMV成交总额 436.4需求四:转化率 447总结 46参考文献 47致谢 481引言1.1设计的目的及意义随着网络科技的发展与壮大,人们生活购物方式不再局限于实体店,人们更多的是选择在淘宝、京东上面购物。自2009年天猫的“双十一”购物活动以来,包括京东、苏宁易购、国美在线、1号店、亚马逊等大型电商平台也纷纷参与进来,“双十一”不再是阿里巴巴的专利。每年的11月11日也成为了消费者“买买买”的重大节日。2014年“双十一”当天全网销售额为805亿元,2015年1229.37亿元,2016年1770.4亿元,2017年2539.7亿元,2018年更是达到了3143亿元,在这一笔笔庞大的交易额背后,是一条条人们交易的订单数据,是人们浏览网页商品的事件日志数据,我们需要在这些冗余庞大的数据集中找出我们需要的那一条数据,而这一条数据在企业的一些决策上起到指导的作用。本项目在企业中起到一个“仓库”的作用,用户在电商网站上的一系列查看、点击、下单、支付等操作都会在后台形成系列的数据,而这些数据将会被本项目中的Flume采集,然后途经Kafka,最终存储在HDFS上,当我们需要对这些数据进行分析的时候,可以使用Hive将数据读取到Hive中,然后进行分析计算,通过分析计算得到用户活跃、用户新增、用户留存、GMV成交总额等等一系列指标,通过这些指标可以辅佐企业领导层的决策。1.2企业生产的实际问题大数据中需要解决的三个问题:大数据的存储、大数据的传输以及大数据的运算,所有的大数据框架都是为了解决这三个问题而研发的,例如Hadoop以及Hadoop衍生的生态圈,Spark以及Spark衍生的生态圈。而在企业中同样也面临着这样的问题,当用户在手机App上进行各种操作时,在后台会产生许多的日志数据信息,这些信息中有的是有价值的,有的是没有价值的,如何将这庞大的数据给存储起来,如何在这海量的数据中提取出有用的,如何有效率的获取这些数据,都是企业中亟待解决的难题。1.3设计方案及技术路线设计方案:根据上述的4个问题,设计了该项目。在本项目中,用Hadoop框架中的HDFS来解决大数据的存储问题,用Hive来解决大数据的计算问题,用Flume和Kafka解决数据的传输问题。在整个技术的选择上,充分考虑了框架与框架之间的兼容性,令人欣喜的是,Hive、Flume、Kafka都是基于Hadoop衍生出来的,所以这些框架兼容性天生就很好,剩下的无非就是考虑框架版本之间的选择问题。技术路线:在本项目中,一共使用到的技术有:Hadoop,Hive,Zookeeper,Flume,Kafka,MySQL,Presto,Sqoop。由于无法获取企业中真实的生产数据,所以我们将会编写一个Java代码封装为脚本来生产随机的JSON字符串,用来模拟生产环境中的数据结构。在整个项目中日志数据的来源分为两种,一种是日志数据系统,一种是业务数据系统,所以我们准备了两种结构的数据。整个项目的数据流程设计:(1)日志数据流程:1)用日志数据生成脚本生成日志数据文件;2)利用第一层Flume读取日志文件,然后在Flume中使用拦截器拦截数据,进行清洗,过滤脏数据,并且将数据格式转换成我们需要的,然后将过滤后的数据导入到Kafka中,这时Kafka起到一个削峰的作用;3)将Kafka中的数据使用第二层Flume进行消费,消费Kafka中的数据;4)将Flume对接上HDFS,将日志文件存储到HDFS;5)用Hive建表,将HDFS上的数据导入到Hive中,以表的形式存在;6)在Hive中将表进行分层解耦,分析统计各项需求;7)用Presto查看表数据信息。(2)业务数据流程:1)在MySQL中建表,并将业务数据日志导入MySQL中;2)用Sqoop将MySQL中的数据导入到HDFS上进行存储;3)在Hive中建表,然后将HDFS中的数据读取到Hive中,在Hive上对数据进行分层处理,然后统计分析计算获取到最终业务需求的数据;4)用Presto查看表数据信息。2项目需求及架构设计 2.1项目需求分析(1)数据采集平台搭建;(2)实现用户行为数据仓库的分层搭建;(3)实现业务数据仓库的分层搭建;(4)针对数据仓库中的数据进行,活跃、新增、GMV成交总额、转化率等报表分析。2.2项目框架2.2.1技术选型数据采集传输:Flume、Kafka、Sqoop。数据存储:MySql、HDFS。数据计算:Hive、Tez。数据查询:Presto。2.2.2系统数据流程设计图2-1数据流程图2.2.3框架版本选型表2-1框架版本选型产品版本Hadoop2.7.2Flume1.7.0KafkaHive1.2.1Sqoop1.4.6MySQL5.6.24Java1.8Zookeeper3.4.10Presto0.1892.2.4集群资源规划设计表2-2集群资源规划设计服务器hadoop101服务器hadoop102服务器hadoop103HDFSNameNodeDataNodeDataNodeDataNodeSecondaryNameNodeYarnNodeManagerResourcemanagerNodeManagerNodeManagerZookeeperZookeeperZookeeperZookeeperFlume(采集日志)FlumeFlumeKafkaKafkaKafkaKafkaFlume(消费Kafka)FlumeHiveHiveMySQLMySQLSqoopSqoopPrestoWorkerCoordinatorWorker3用户行为数据采集3.1数据生成模块3.1.1埋点数据基本格式公共字段:基本包括所有安卓手机都具有的字段。业务字段:埋点上报的字段,有具体的业务类型。下面就是一个示例,表示业务字段的上传。{"ap":"xxxxx",//项目数据来源apppc"cm":{//公共字段 "mid":"",//(String)设备唯一标识"uid":"",//(String)用户标识"vc":"1",//(String)versionCode,程序版本号"vn":"1.0",//(String)versionName,程序版本名"l":"zh",//(String)系统语言"sr":"",//(String)渠道号,应用从哪个渠道来的。"os":"7.1.1",//(String)Android系统版本"ar":"CN",//(String)区域"md":"BBB100-1",//(String)手机型号"ba":"blackberry",//(String)手机品牌"sv":"V2.2.1",//(String)sdkVersion"g":"",//(String)gmail"hw":"1620x1080",//(String)heightXwidth,屏幕宽高"t":"1506047606608",//(String)客户端日志产生时的时间"nw":"WIFI",//(String)网络模式"ln":0,//(double)lng经度"la":0//(double)lat纬度},"et":[//事件{"ett":"1506047605364",//客户端事件产生时间"en":"display",//事件名称"kv":{//事件结果,以key-value形式自行定义"goodsid":"236","action":"1","extend1":"1","place":"2","category":"75"}}]}下面是各个埋点日志格式。其中商品点击属于信息流的范畴。3.1.2事件日志数据表3-1商品列表页标签含义action动作:开始加载=1,加载成功=2,加载失败=3loading_time加载时长:计算下拉开始到接口返回数据的时间,(开始加载报0,加载成功或加载失败才上报时间)loading_way加载类型:1-读取缓存,2-从接口抽取新数据(加载成功才上报加载类型)extend1扩展字段Extend1extend2扩展字段Extend2type加载类型:自动加载=1,用户下拽加载=2,底部加载=3(底部条触发点击底部提示条/点击返回顶部加载)type1加载失败码:把加载失败状态码报回来(报空为加载成功,没有失败)表3-2商品点击标签含义action动作:曝光商品=1,点击商品=2goodsid商品ID(服务端下发的ID)place顺序(第几条商品,第一条为0,第二条为1,如此类推)extend1曝光类型:1-首次曝光2-重复曝光category分类ID(服务端定义的分类ID)表3-3商品详情页标签含义entry页面入口来源:应用首页=1、push=2、详情页相关推荐=3action动作:开始加载=1,加载成功=2(pv),加载失败=3,退出页面=4goodsid商品ID(服务端下发的ID)show_style商品样式:0、无图、1、一张大图、2、两张图、3、三张小图、4、一张小图、5、一张大图两张小图news_staytime页面停留时长:从商品开始加载时开始计算,到用户关闭页面所用的时间。若中途用跳转到其它页面了,则暂停计时,待回到详情页时恢复计时。或中途划出的时间超过10分钟,则本次计时作废,不上报本次数据。如未加载成功退出,则报空。loading_time加载时长:计算页面开始加载到接口返回数据的时间(开始加载报0,加载成功或加载失败才上报时间)type1加载失败码:把加载失败状态码报回来(报空为加载成功,没有失败)category分类ID(服务端定义的分类ID)表3-4广告标签含义entry入口:商品列表页=1

应用首页=2

商品详情页=3action动作:请求广告=1取缓存广告=2

广告位展示=3广告展示=4广告点击=5

content状态:成功=1

失败=2

detail失败码(没有则上报空)source广告来源:admob=1facebook=2

ADX(百度)=3VK(俄罗斯)=4behavior用户行为:

主动获取广告=1

被动获取广告=2newstypeType:1-图文2-图集3-段子4-GIF5-视频6-调查7-纯文8-视频+图文

9-GIF+图文

0-其他show_style内容样式:无图(纯文字)=6一张大图=1

三张小图+文=4一张小图=2一张大图两张小图+文=3图集+文=5

一张大图+文=11

GIF大图+文=12

视频(大图)+文=13

来源于详情页相关推荐的商品,上报样式都为0(因为都是左文右图)表3-5消息通知标签含义action动作:通知产生=1,通知弹出=2,通知点击=3,常驻通知展示(不重复上报,一天之内只报一次)=4type通知id:预警通知=1,天气预报(早=2,晚=3),常驻=4ap_time客户端弹出时间content备用字段表3-6用户前台活跃标签含义push_id推送的消息的id,如果不是从推送消息打开,传空access1.push2.icon3.其他表3-7用户后台活跃标签含义active_source1=upgrade,2=download(下载),3=plugin_upgrade表3-8评论表序号字段名称字段描述字段类型长度允许空缺省值1comment_id评论表int10.02user_id用户idint10.0√03p_comment_id父级评论id(为0则是一级评论,不为0,则是回复)int10.0√4content评论内容string1000√5other_id创建时间string√6other_id评论的相关idint10.0√7praise_count点赞数量int10.0√08reply_count回复数量int10.0√0表3-9收藏序号字段名称字段描述字段类型长度允许空缺省值1id主键int10.02course_id商品idint10.0√03userid用户idint10.0√04add_time创建时间string√表3-10点赞表序号字段名称字段描述字段类型长度允许空缺省值1id主键idint10.02userid用户idint10.0√3target_id点赞的对象idint10.0√4type点赞类型1问答点赞2问答评论点赞3文章点赞数4评论点赞int10.0√5add_time添加时间string√表3-11错误日志表errorBrief错误摘要errorDetail错误详情3.1.3启动日志数据表3-12启动日志表标签含义entry入口:push=1,widget=2,icon=3,notification=4,lockscreen_widget=5open_ad_type开屏广告类型:开屏原生广告=1,开屏插屏广告=2action状态:成功=1

失败=2loading_time加载时长:计算下拉开始到接口返回数据的时间,(开始加载报0,加载成功或加载失败才上报时间)detail失败码(没有则上报空)extend1失败的message(没有则上报空)en日志类型start3.1.4数据生成脚本图3-1数据流程之数据生成创建Maven工程(1)创建log-collector;图3-2创建工程(2)创建一个包名:ject.hyc.appclient;(3)在ject.hyc.appclient.appclient包下创建一个类,AppMain;(4)在ject.hyc.appclient.bean包下创建如下图所示bean对象。图3-3项目主要类结构打包(1)采用Maven对程序打包图3-4项目打包(2)采用带依赖的jar包。包含了程序运行需要的所有依赖。图3-5获取项目jar包启动启动前必须先把Hadoop和Zookeeper集群搭建完成。(1)代码参数说明//参数一:控制发送每条的延时时间,默认是0Longdelay=args.length>0?Long.parseLong(args[0]):0L;//参数二:循环遍历次数intloop_len=args.length>1?Integer.parseInt(args[1]):1000;(2)将生成的jar包logcollector-0.0.1-SNAPSHOT-jar-with-dependencies.jar拷贝到hadoop102服务器上,并同步到hadoop101的/opt/module路径下,(3)在hadoop102上执行jar程序(4)在/tmp/logs路径下查看生成的日志文件日志生成集群启动脚本具体脚本编写 在/home/hyc/bin目录下创建脚本lg.sh[hyc@hadoop102bin]$vimlg.sh 在脚本中编写如下内容#!/bin/bash foriinhadoop101hadoop102 do ssh$i"java-classpath/opt/module/logcollector-1.0-SNAPSHOT-jar-with-dependencies.jarject.hyc.appclient.AppMain>/opt/module/test.log&" done群时间同步修改脚本(1)在/home/hyc/bin目录下创建脚本dt.sh[hyc@hadoop102bin]$vimdt.sh(2)在脚本中编写如下内容#!/bin/bashlog_date=$1foriinhadoop101hadoop102hadoop103dossh-t$i"sudodate-s$log_date"done集群所有进程查看脚本(1)在/home/hyc/bin目录下创建脚本xcall.sh[hyc@hadoop102bin]$vimxcall.sh(2)在脚本中编写如下内容#!/bin/bashforiinhadoop101hadoop102hadoop103doecho$issh$i"$*"done3.2数据采集模块3.2.1Hadoop安装表3-13Hadoop集群规划服务器hadoop101服务器hadoop102服务器hadoop103HDFSNameNodeDataNodeDataNodeDataNodeSecondaryNameNodeYarnNodeManagerResourcemanagerNodeManagerNodeManager添加LZO支持包(1)将编译好后的hadoop-lzo-0.4.20.jar放入hadoop-2.7.2/share/hadoop/common/(2)同步hadoop-lzo-0.4.20.jar到hadoop101、hadoop10添加配置(1)core-site.xml增加配置支持LZO压缩(2)同步core-site.xml到hadoop101、hadoop1033.2.2Zookeeper安装表3-14zookeeper集群规划服务器hadoop101服务器hadoop102服务器hadoop103ZookeeperZookeeperZookeeperZookeeper3.2.3采集日志Flume图3-6数据流程之数据采集flume日志采集Flume安装表3-15采集flume集群规划:服务器hadoop101服务器hadoop102服务器hadoop103Flume(采集日志)FlumeFlume日志采集Flume配置(1)Flume配置分析图3-7flume组件TailDirSource是Flume1.7提供的Source组件,在1.6中并没有。采用KafkaChannel,省去了Sink。Flume直接读log日志的数据,log日志的格式是app-yyyy-mm-dd.log。(2)Flume的具体配置如下:在/opt/module/flume/conf目录下创建file-flume-kafka.conf文件,在文件配置如下内容:a1.sources=r1a1.channels=c1c2#configuresourcea1.sources.r1.type=TAILDIRa1.sources.r1.positionFile=/opt/module/flume/test/log_position.jsona1.sources.r1.filegroups=f1a1.sources.r1.filegroups.f1=/tmp/logs/app.+a1.sources.r1.fileHeader=truea1.sources.r1.channels=c1c2#erceptors=i1erceptors.i1.type=erceptor.LogETLInterceptor$Berceptors.i2.type=erceptor.LogTypeInterceptor$Buildera1.sources.r1.selector.type=multiplexinga1.sources.r1.selector.header=topica1.sources.r1.selector.mapping.topic_start=c1a1.sources.r1.selector.mapping.topic_event=c2#configurechannela1.channels.c1.type=org.apache.flume.channel.kafka.KafkaChannela1.channels.c1.kafka.bootstrap.servers=hadoop101:9092,hadoop102:9092,hadoop103:9092a1.channels.c1.kafka.topic=topic_starta1.channels.c1.parseAsFlumeEvent=falsea1.channels.c1.kafka.consumer.group.id=flume-consumera1.channels.c2.type=org.apache.flume.channel.kafka.KafkaChannela1.channels.c2.kafka.bootstrap.servers=hadoop101:9092,hadoop102:9092,hadoop103:9092a1.channels.c2.kafka.topic=topic_eventa1.channels.c2.parseAsFlumeEvent=falsea1.channels.c2.kafka.consumer.group.id=flume-consumerFlume拦截器本项目中自定义了两个拦截器,分别是:ETL拦截器、日志类型区分拦截器。ETL拦截器主要用于,过滤时间戳不合法和Json数据不完整的日志。日志类型区分拦截器主要用于,将启动日志和事件日志区分开来,方便发往Kafka的不同Topic。(1)创建Maven工程flume-interceptor;(2)创建包名:erceptor;(3)创建ETL拦截器(LogETLInterceptor)、日志类型区分拦截器(LogTypeInterceptor)、日志过滤工具类(LogUtils);图3-8flume采集拦截器(4)打包;拦截器打包之后,只需要单独包,不需要将依赖的包上传。打包之后要放入Flume的lib文件夹下面。图3-9获取拦截器jar包(5)需要先将打好的包放入到hadoop102的/opt/module/flume/lib文件夹下面;(6)分发Flume到hadoop101、hadoop103。3.2.4Kafka安装图3-10数据流程之数据采集KafkaKafka集群安装表3-16kafka集群规划:服务器hadoop101服务器hadoop102服务器hadoop103KafkaKafkaKafkaKafka创建KafkaTopic进入到/opt/module/kafka/目录下分别创建:启动日志主题、事件日志主题。(1)创建启动日志主题[hyc@hadoop102kafka]$bin/kafka-topics.sh--zookeeperhadoop101:2181,hadoop102:2181,hadoop103:2181--create--replication-factor1--partitions1--topictopic_start(2)创建事件日志主题[hyc@hadoop102kafka]$bin/kafka-topics.sh--zookeeperhadoop101:2181,hadoop102:2181,hadoop103:2181--create--replication-factor1--partitions1--topictopic_event3.2.5消费Kafka数据Flume图3-11数据流程之数据采集消费Flume表3-17消费flume集群规划服务器hadoop101服务器hadoop102服务器hadoop103Flume(消费Kafka)Flume(1)Flume配置分析图3-12Flume组件配置(2)Flume的具体配置如下:在hadoop103的/opt/module/flume/conf目录下创建kafka-flume-hdfs.conf文件,在文件配置如下内容。##组件a1.sources=r1r2a1.channels=c1c2a1.sinks=k1k2##source1a1.sources.r1.type=org.apache.flume.source.kafka.KafkaSourcea1.sources.r1.batchSize=5000a1.sources.r1.batchDurationMillis=2000a1.sources.r1.kafka.bootstrap.servers=hadoop101:9092,hadoop102:9092,hadoop103:9092a1.sources.r1.kafka.topics=topic_start##source2a1.sources.r2.type=org.apache.flume.source.kafka.KafkaSourcea1.sources.r2.batchSize=5000a1.sources.r2.batchDurationMillis=2000a1.sources.r2.kafka.bootstrap.servers=hadoop101:9092,hadoop102:9092,hadoop103:9092a1.sources.r2.kafka.topics=topic_event##channel1a1.channels.c1.type=filea1.channels.c1.checkpointDir=/opt/module/flume/checkpoint/behavior1a1.channels.c1.dataDirs=/opt/module/flume/data/behavior1/a1.channels.c1.maxFileSize=2146435071a1.channels.c1.capacity=1000000a1.channels.c1.keep-alive=6##channel2a1.channels.c2.type=filea1.channels.c2.checkpointDir=/opt/module/flume/checkpoint/behavior2a1.channels.c2.dataDirs=/opt/module/flume/data/behavior2/a1.channels.c2.maxFileSize=2146435071a1.channels.c2.capacity=1000000a1.channels.c2.keep-alive=6##sink1a1.sinks.k1.type=hdfsa1.sinks.k1.hdfs.path=/origin_data/hyc/log/topic_start/%Y-%m-%da1.sinks.k1.hdfs.filePrefix=logstart-a1.sinks.k1.hdfs.round=truea1.sinks.k1.hdfs.roundValue=10a1.sinks.k1.hdfs.roundUnit=second##sink2a1.sinks.k2.type=hdfsa1.sinks.k2.hdfs.path=/origin_data/hyc/log/topic_event/%Y-%m-%da1.sinks.k2.hdfs.filePrefix=logevent-a1.sinks.k2.hdfs.round=truea1.sinks.k2.hdfs.roundValue=10a1.sinks.k2.hdfs.roundUnit=second##不要产生大量小文件a1.sinks.k1.hdfs.rollInterval=10a1.sinks.k1.hdfs.rollSize=134217728a1.sinks.k1.hdfs.rollCount=0a1.sinks.k2.hdfs.rollInterval=10a1.sinks.k2.hdfs.rollSize=134217728a1.sinks.k2.hdfs.rollCount=0##控制输出文件是原生文件。a1.sinks.k1.hdfs.fileType=CompressedStreama1.sinks.k2.hdfs.fileType=CompressedStreama1.sinks.k1.hdfs.codeC=lzopa1.sinks.k2.hdfs.codeC=lzop##拼装a1.sources.r1.channels=c1a1.sinks.k1.channel=c1a1.sources.r2.channels=c2a1.sinks.k2.channel=c23.2.6数据生成(1)启动集群;集群所有进程:[hyc@hadoop102bin]$xcalljpshadoop1017768NameNode8009NodeManager8218Application7883DataNode8076QuorumPeerMain8717Jps8527Kafkahadoop10212161ResourceManager13265Jps13011Kafka11908DataNode12695Application12298NodeManager12538QuorumPeerMainhadoop1037616QuorumPeerMain7459NodeManager7893Kafka7365SecondaryNameNode7980Application7244DataNode8173Jps(2)更改集群时间;[hyc@hadoop102bin]$date.sh2019-02-102019年02月10日星期日00:00:00CSTConnectiontohadoop101closed.2019年02月10日星期日00:00:00CSTConnectiontohadoop102closed.2019年02月10日星期日00:00:00CSTConnectiontohadoop103closed.(3)生成2019-02-10的日志数据;[hyc@hadoop102bin]$lg.sh(4)日志经由flume-kafka-flume-hdfs,最终在hdfs上生成两个日志文件,2019-02-10的启动日志文件以及事件日志文件;图3-13查看2-10事件日志文件图3-14查看2-10启动日志文件(5)继续更改集群时间;[hyc@hadoop102bin]$date.sh2019-02-112019年02月11日星期一00:00:00CSTConnectiontohadoop101closed.2019年02月11日星期一00:00:00CSTConnectiontohadoop102closed.2019年02月11日星期一00:00:00CSTConnectiontohadoop103closed.(6)生成2019-02-11的日志数据;[hyc@hadoop102bin]$lg.sh(7)日志经由flume-kafka-flume-hdfs,最终在hdfs上生成两个日志文件,2019-02-11的启动日志文件以及事件日志文件。图3-15查看2-11启动日志文件图3-16查看2-11事件日志文件4用户行为数据仓库4.1数仓分层概念为什么要分层:图4-1Hive数仓分层4.1.2数仓分层图4-2ods与dwd层表图4-3dws层与ads层表4.2数仓搭建环境准备图4-4数据流程之Hive数仓搭建4.2.1Hive&MySQL安装表4-1Hive&MySQL集群规划:服务器hadoop101服务器hadoop102服务器hadoop103MysqlMysqlHivehive4.2.2Hive运行引擎TezTez是一个Hive的运行引擎,性能优于MR。为什么优于MR呢?看下图。图4-5Tez图解用Hive直接编写MR程序,假设有四个有依赖关系的MR作业,上图中,绿色是ReduceTask,云状表示写屏蔽,需要将中间结果持久化写到HDFS。Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。在Hive中配置Tez。(1)进入到Hive的配置目录:/opt/module/hive/conf;(2)在hive-env.sh文件中添加tez环境变量配置和依赖包环境变量配置;(3)在hive-site.xml文件中添加配置,更改hive计算引擎;(4)在Hive的/opt/module/hive/conf下面创建一个tez-site.xml文件,添加Tez的配置;(5)将/opt/module/tez-0.9.1上传到HDFS的/tez路径。4.3数仓搭建之ODS层图4-6数据流程之hive数仓ods层4.3.1创建数据库(1)创建hycmall数据库;(2)使用hycmall数据库。4.3.2ODS层原始数据层,存放原始数据,直接加载原始日志、数据,数据保持原貌不做处理。创建启动日志表ods_start_log:(1)创建ods_start_log表;(2)向表中导入数据;(3)查看表内数据。图4-7ods_start_log表数据创建事件日志表ods_event_log:(1)创建ods_start_log表;(2)向表中导入数据;(3)查看表内数据。图4-8ods_event_log表数据4.4数仓搭建之DWD层对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据,行式存储改为列存储,改压缩格式)。4.4.1DWD层启动表数据解析(1)创建启动表dwd_start_log;(2)向启动表导入数据;(3)测试。图4-9dwd_start_log表数据4.4.2DWD层事件表数据解析创建基础明细表(1)明细表用于存储ODS层原始表转换过来的明细数据;图4-10dwd_base_event_log表结构图解(2)创建事件日志基础明细表。图4-11dwd_base_event_log建表语句自定义UDF函数(解析公共字段)(1)创建一个maven工程:hive-function;(2)创建包名:ject.hyc.udf。自定义UDTF函数(解析具体事件字段)(1)创建包名:ject.hyc.udtf;(2)在ject.hyc.udtf包下创建类名:EventJsonUDTF;图4-12自定义函数类(3)打包;图4-13获取自定义函数jar包(4)将hive-function-1.0-SNAPSHOT上传到hadoop102的/opt/module/hive/;(5)将jar包添加到Hive的classpath;(6)创建临时函数与开发好的javaclass关联。解析事件日志基础明细表。解析事件日志基础明细表,读取事件日志明细表数据。图4-14dwd_base_event_log表数据4.4.3DWD层事件表获取(1)建表,在hive中创建用户后台活跃表、用户前台活跃表、广告表、评论表、商品点击表、错误日志表、收藏表、商品列表页表、商品详情页表、消息通知表、点赞表等11张表。图4-15dwd层表(2)给表中导入数据,分别给不同的表导入响应的日志数据。5系统业务数据仓库5.1电商业务与数据结构简介5.1.1电商业务流程图5-1电商业务流程5.1.2电商表结构图5-2电商表结构表5-1订单表标签含义id订单编号total_amount订单金额order_status订单状态user_id用户idpayment_way支付方式out_trade_no支付流水号create_time创建时间operate_time操作时间表5-2订单详情表标签含义id订单编号order_id订单号user_id用户idsku_id商品idsku_name商品名称order_price商品价格sku_num商品数量create_time创建时间表5-3商品表标签含义idskuIdspu_idspuidprice价格sku_name商品名称sku_desc商品描述weight重量tm_id品牌idcategory3_id品类idcreate_time创建时间表5-4用户表标签含义id用户idname姓名birthday生日gender性别email邮箱user_level用户等级create_time创建时间表5-5商品一级分类表标签含义ididname名称表5-6商品二级分类表标签含义ididname名称category1_id一级品类id表5-7商品三级分类表标签含义ididname名称Category2_id二级品类id表5-8支付流水表标签含义id编号out_trade_no对外业务编号order_id订单编号user_id用户编号alipay_trade_no支付宝交易流水编号total_amount支付金额subject交易内容payment_type支付类型payment_time支付时间5.2数仓搭建5.2.1配置Hadoop支持Snappy压缩(1)将编译后支持Snappy压缩的Hadoopjar包解压缩,并将lib/native目录中所有文件上传到hadoop102的/opt/module/hadoop-2.7.2/lib/native目录。(2)重新启动Hadoop;(3)检查支持的压缩方式。图5-3Hadoop支持snappy压缩5.2.2业务数据生成建表语句(1)通过navicat创建数据库hycmall;(2)设置数据库编码,设置为utf-8;(3)导入建表语句(1建表脚本);图5-4导入建表脚本(4)重复步骤3的导入方式,依次导入:2商品分类数据插入脚本、3函数脚本、4存储过程脚本。生成业务数据函数说明;init_data(do_date_stringVARCHAR(20),order_incr_numINT,user_incr_numINT,sku_numINT,if_truncateBOOLEAN):参数一:do_date_string生成数据日期参数二:order_incr_num订单id个数参数三:user_incr_num用户id个数参数四:sku_num商品sku个数参数五:if_truncate是否删除数据5.2.3业务数据导入数仓图5-5数据流程之mysql数据导入hdfsSqoop安装表5-9sqoop集群规划:服务器hadoop101服务器hadoop102服务器hadoop103SqoopsqoopSqoop定时导入脚本在/home/hyc/bin目录下创建脚本sqoop_import.sh。在脚本中填写如下内容:#!/bin/bashdb_date=$2echo$db_datedb_name=hycmallimport_data(){/opt/module/sqoop/bin/sqoopimport\--connectjdbc:mysql://hadoop102:3306/$db_name\--usernameroot\--passwordroot\--target-dir/origin_data/$db_name/db/$1/$db_date\--delete-target-dir\--num-mappers1\--fields-terminated-by"\t"\--query"$2"'and$CONDITIONS;'}import_sku_info(){import_data"sku_info""selectid,spu_id,price,sku_name,sku_desc,weight,tm_id,category3_id,create_timefromsku_infowhere1=1"}import_user_info(){import_data"user_info""selectid,name,birthday,gender,email,user_level,create_timefromuser_infowhere1=1"}import_base_category1(){import_data"base_category1""selectid,namefrombase_category1where1=1"}import_base_category2(){import_data"base_category2""selectid,name,category1_idfrombase_category2where1=1"}import_base_category3(){import_data"base_category3""selectid,name,category2_idfrombase_category3where1=1"}import_order_detail(){import_data"order_detail""selectod.id,order_id,user_id,sku_id,sku_name,order_price,sku_num,o.create_timefromorder_infoo,order_detailodwhereo.id=od.order_idandDATE_FORMAT(create_time,'%Y-%m-%d')='$db_date'"}import_payment_info(){import_data"payment_info""selectid,out_trade_no,order_id,user_id,alipay_trade_no,total_amount,subject,payment_type,payment_timefrompayment_infowhereDATE_FORMAT(payment_time,'%Y-%m-%d')='$db_date'"}import_order_info(){import_data"order_info""selectid,total_amount,order_status,user_id,payment_way,out_trade_no,create_time,operate_timefromorder_infowhere(DATE_FORMAT(create_time,'%Y-%m-%d')='$db_date'orDATE_FORMAT(operate_time,'%Y-%m-%d')='$db_date')"}case$1in"all")import_base_category1import_base_category2import_base_category3import_order_infoimport_order_detailimport_sku_infoimport_user_infoimport_payment_info;;esac5.2.4ODS层完全仿照业务数据库中的表字段,一模一样的创建ODS层对应表。(1)分别创建商品一级分类表、商品二级分类表、商品三级分类表、订单详情表、订单表、支付流水表、商品表、用户表。图5-6ods层表(2)导入各个表的数据。5.2.5DWD层对ODS层数据进行判空过滤。对商品分类表进行维度退化(降维)。(1)分别创建订单详情表、订单表、支付流水表、用户表、商品表等。图5-7dwd层表(2)导入数据并查看。5.2.6DWS层之用户行为宽表为什么要建宽表需求目标,把每个用户单日的行为聚合起来组成一张多列宽表,以便之后关联用户维度信息后进行,不同角度的统计分析。(1)创建用户行为宽表;图5-8创建dws层用户行为宽表(2)向用户行为宽表导入数据导入数据并查看图5-9dws_user_action表数据6业务需求数据分析6.1需求一:用户活跃主题6.1.1DWS层目标:统计当日、当周、当月活动的每个设备明细每日活跃设备明细(1)创建表dws_uv_detail_day;(2)将数据导入表中;以用户单日访问为key进行聚合,如果某个用户在一天中使用了两种操作系统、两个系统版本、多个地区,登录不同账号,只取其中之一。(3)查询导入结果。图6-1dws_uv_detail_day表数据每周活跃设备明细。根据日用户访问明细,获得周用户访问明细。(1)创建表dws_uv_detail_wk;(2)数据导入表中;(3)查询导入结果。图6-2dws_uv_detail_wk表数据每月活跃设备明细。(1)创建表dws_uv_detail_mn;(2)将数据导入表中;(3)查询导入结果。图6-3dws_uv_detail_mn表数据6.1.2ADS层目标:当日、当周、当月活跃设备数活跃设备数。(1)创建表ads_uv_count;(2)导入数据;(3)使用presto查询导入的数据。图6-4ads_uv_count表数据(4)分析表中数据。表中第一个字段dt为数据的时间,day_count为当日活跃设备数,wk_count为本周活跃设备数,mn_count为本月活跃设备数,从该表中可以得知企业产品每日每周每月的活跃用户数,从而形成报表。6.2需求二:用户新增主题首次联网使用应用的用户。如果一个用户首次打开某APP,那这个用户定义为新增用户;卸载再安装的设备,不会被算作一次新增。新增用户包括日新增用户、周新增用户、月新增用户。6.2.1DWS层(每日新增设备明细表)(1)创建表dws_new_mid_day;(2)导入数据;用每日活跃用户表LeftJoin每日新增设备表,关联的条件是mid_id相等。如果是每日新增的设备,则在每日新增设备表中为null。(3)查询导入数据。图6-5dws_new_mid_day表数据6.2.2ADS层(每日新增设备表)(1)创建表ads_new_mid_count;(2)导入数据;(3)用presto查看导入数据;图6-6ads_new_mid_count表数据(4)分析表中数据。表中第一个字段create_time为数据时间,new_mid_count为新增用户数,该表可以得知企业产品app每天新增用户数,从而可以得到app总的走势,给企业决策层提供指导意见。6.3需求三:GMV成交总额ADS层(1)什么是GMVGMV:GrossMerchandiseVolume,是一定时间段内的成交总额(比如一天、一个月、一年)。在电商网站定义里面是网站成交金额,这个实际指的是拍下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论