大数据实战第三十三课 - Spark离线项目01

第一章: 项目概述

第二章: 项目架构

第三章:采集部分

第一章:项目概述

概述:处理的是APP的数据,处理一些用户行为(登录、登出),通过app的服务打点记录下来的数据用于商业分析。

第二章:项目架构

  • APP的服务器肯定是多台的,webserver产生很多日志,通过对用户行为进行打点,日志会落到约定的目录下,eg: /data/2019-06-12/…

  • 通过flume、filebeat组件收集到hadoop集群,在hdfs上就是一个目录,/apps/hive/warehouse/2019-06-12

  • 经过一个spark job 把这些作业生成Hive表、Spark SQL表,后续的数据分析都是基于表来做的,直接通过SQL来完成,HiveSQL、Spark SQL。

  • HiveSQL、SparkSQL:结果肯定是要回到Hive表。
    eg、分析用户登录数据,登录一次,把这次登录信息就下来,在Hive、Spark SQL处就会生成登录表,分析登录次数…

  • 我们做离线处理,结果肯定是展示在报表上的;web页面不能直接对接Hive、SparkSQL表,要把分析结果存储到MySQL,ES。

业内比较通用的离线处理架构(顶多就是组件选型不太一样):

在这里插入图片描述
思考:为什么不能把第3、4步直接省略,直接走第5步?为什么还要写HiveSQL、SparkSQL,离线处理结果最后都是通过报表展示,我们从分析结果到MySQL的数据是不变的。涉及架构最优解

2.1 技术选型

1、采集工具直接使用flume;
2、数据采集到hdfs上;
3、在(2)过程上开发一个spark作业,数据落到Spark SQL表上;
4、通过(3)的数据分析变成Spark SQL表;
5、分析结果的数据导出到MySQL。

2.2 架构选型会遇到的问题

数据采集遇到的问题:

第一点:日志格式

  • /data/2019-06-12/…
    login-1.txt
    login-2.txt
    logout-1.txt
    logout-2.txt
    /data/2019-06-13/…
    login-1.txt
    login-2.txt
    logout-1.txt
    logout-2.txt

问题一:多层文件夹…(牵扯到递归)

问题二:flume上两个表… 对应到hdfs上就是两个目录
/app/hive/warehouse/login /app/hive/warehouse
注意:日期不一定准,是flume生成的

问题三:收集的选型:
我们保证flume上的每一条记录都是原子的,每条记录要么不写,要么直接写完,不能追加(由埋点的开发来考虑的)。这个选型对应的是第1步,taildir -> memory/file -> avro ,avro -> memory/file -> hdfs

在这里插入图片描述

问题四:sink到hdfs遇到的问题:

  • 数据延迟(落地时间和数据时间不一致)

sink到hdfs上的路径如下所示:
/app/hive/warehouse/login/2019-06-12/13:00
1.txt
2.txt
/app/hive/warehouse/login/2019-06-12/14:00
1.txt
2.txt
每个批次的最后数据很有可能到下个批次的第一、二个文件。

flume监控需要我们自己去做。

Spark Job ETL遇到的问题:

a.分区字段(String操作)
b.字段的解析(ip解析 --> 转换为国家、省、市)
c.转列式
d.数据质量…

比如后面所有操作都是基于user_name来的,但是这条数据都没有打进来。

问题1、落地时间和数据时间不一致,如何保证每一个批次的数据都能被正确的ETL?
14:00还在读取13:00批次的数据,14:00读取13:57分~13:59分的数据。

  • write.partitionBy(d,h).savemode.append.save(hdfs路径) 不考虑修数据(作业全是正常的)

  • 修数据需要重跑的时候又该怎么办,overwrite也会出现很多问题。

问题2、Spark ETL这个地方一定会存在小文件的问题,注意:生产过程中很多情况都不会产生shuffle,此时不做计算,计算是在3这个过程中做的。

  • 小文件的处理:

问题3、1中存储到的是hdfs路径怎么刷新元数据?
a.alter table add partition… (d=…,h=…) //如何高效率的拿到分区的值
b.msck repair table… (生产上不能用,刷全部的耗时久)

经过2后的SparkSQL原始表可能是ORC、PARQUET格式的。

SparkSQL数据分析遇到的问题

1、小文件

2、幂等性

3、造成数据倾斜 ***
全看SQL写的好不好

4、资源(抖晚8 9点的抖音访问量)

SparkSQL表、Hive表导入到MySQL/ES

1、导出效率 datax sparksql(datasource)

2、幂等性

set … = insert into partiiton(…) select …

五、统计指标(业务)

登录、登出、注册、购买
login、logout、register、order

1、登陆情况,在线时长
2、留存,注册之后的活跃情况
3、付费情况,前一天注册的,当天或者今天付费的

第三章:采集部分

Spooling Directory Source:
Taildir Source:1、断点续传 (文件收集肯定选这个)
Exec Source:

http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html

property namedescription
filegroupsSpace-separated list of file groups. Each file group indicates a set of files to be tailed.

描述:以空格分隔的文件组列表。每个文件组表示要跟踪的一组文件。
其实就是 g1 g2(以空格分割)
Example for agent named a1:

a1.sources.r1.filegroups = f1 f2
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
a1.sources.r1.filegroups.f2=/var/log/test2/.*log*				//只要是日志中带log的都要进行收集

修改taildirsource:

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /data/2019-06-12/01/.txt			//这个场景的目录应该是:/data/*/*/.*txt

多层文件夹递归,正则表达式只能用于filename,/data///.*txt这个是不生效的。

3.1 查看flume源码

首先要把flume源码导入到IDEA编辑器中:
https://blog.csdn.net/zhikanjiani/article/details/100678368

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目Spark离线处理本项目来源于企业级电商网站的大数据统计分析平台,该平台以 Spark 框架为核心,对电商网站的日志进行离线和实时分析。 该大数据分析平台对电商网站的各种用户行为(访问行为、购物行为、广告点击行为等)进行分析,根据平台统计出来的数据,辅助公司中的 PM(产品经理)、数据分析师以及管理人员分析现有产品的情况,并根据用户行为分析结果持续改进产品的设计,以及调整公司的战略和业务。最终达到用大数据技术来帮助提升公司的业绩、营业额以及市场占有率的目标。 本项目使用了 Spark 技术生态栈中最常用的三个技术框架,Spark Core、Spark SQL 和 Spark Streaming,进行离线计算和实时计算业务模块的开发。实现了包括用户访问 session 分析、页面单跳转化率统计、热门商品离线统计、广告流量实时统计 4 个业务模块。通过合理的将实际业务模块进行技术整合与改造,该项目几乎完全涵盖了 Spark Core、Spark SQL 和 Spark Streaming 这三个技术框架中大部分的功能点、知识点,学员对于 Spark 技术框架的理解将会在本项目中得到很大的提高。 项目Spark实时处理项目简介对于实时性要求高的应用,如用户即时详单查询,业务量监控等,需要应用实时处理架构项目场景对于实时要求高的应用、有对数据进行实时展示和查询需求时项目技术分别使用canal和kafka搭建各自针对业务数据库和用户行为数据的实时数据采集系统,使用SparkStreaming搭建高吞吐的数据实时处理模块,选用ES作为最终的实时数据处理结果的存储位置,并从中获取数据进行展示,进一步降低响应时间。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值