spark项目架构搭建开发文档

20 篇文章 0 订阅
11 篇文章 2 订阅

历时将近两个月,终于搞定了,自己尝试了设计、框架搭建、开发、自测等一系列,但是不总结就是瓜皮。所以将以本篇作为总结性文章,提醒未来的自己,更好的开发项目。

 

一、设计文档部分

写代码之前,先想,从大往小了想。想的越仔细,将来坑越少,想的越仔细,那么开发的排期也就越明白。

 

首先调研,花了几天调研。

调研邮件开始了,以及初步的设计图。

数据开发流程
1.搭建虚拟机测试环境
2.Flume搭建以及搭建文档落地
3.Zookeeper集群(或者单节点)搭建以及文档落地
4.Kafka集群搭建以及文档落地
5.Sparkstreaming搭建以及文档落地
6.系统设计文档平生
7.Sparkstreaming代码开发
8.UT代码编写 + Codereview + 自测
9.提测申请

 

 

后来调研发现了,一部分数据源来源于mysql,我们目前的mysql的binlog日志模式非row模式,后来联系到了开发,通过讨论,插入数据binlog确实容易记录,但是如果update批处理时还是每一行都记录一个binlog的话,将会造成大量的日志,所以,最后还是考虑在后续将数据库做成分库分表的方式后,在做row模式,届时再采用了秒级实时。现在做成伪实时是可行的,就是依照create-time和update-time两个时间去抽取主从表中的从表,因为数据量也比较大,所以还是两个时间标识建立索引比价好。那么接下来开始说业务代码吧。

 

二、开发规范

数据开发框架

本次数据开发框架采用spark,基于内存计算。详情可以参考spark官网,查阅。

http://spark.apache.org/

 

代码业务涉及公司隐私,这里就省略。

 

 

 

开发规范
1.写代码前请先理清思路,简单绘制流程图,并且落实到本地文档;及时模块再简单,也请这样做,再次重申,文档特别重要
2.Git每天早上上班请更新代码,如果有代码冲突请立即找到当事人协同处理;每天晚上下班前,请务必提交当天所有已经编写、且没有问题的代码,如果有冲突也请立即找到当事人协同处理
3.代码注释。请将每个类、每个方法的注释标明,同时,没有的注释需要补上,重要的代码块也请标明注释。相比大家都阅读过源码,那么也请按照那样做。
4.代码提交合并请求时,一定要指明code_review,不允许指派给自己,且记!
5.代码编写规范请注意,第一,复杂度一定不要过高,自己估算一下不要超过6-8,多出来的,请抽取模块,用方法实现之;第二,阻断违规与异常请自己处理,且一定要处理。请在写代码的时候,保持一个敬畏心、存疑心,例如考虑数据集返回为null,或者数据集size为0,或者数据集过大撑爆内存。这样可以保证程序健壮性,是代码优化与简洁。
6.后期集成logging模块,优化日志功能,分析日志功能,做好报警功能。
7.邮件发送告警模块集成,第一时间告知程序异常内容,迅速处理。
8.代码模块需要开发初始化数据功能,将历史上前6个月数据同步至凭证通业务数据,任务开放参数,参数值将为init,交由spark任务提交,请注意。
9.代码自测。目前的代码自测仅仅是体现在肉眼,我们将于后期整合unitTest框架,自己mock数据,讲自己的每一步代码分支覆盖,最终覆盖率目标100%,一期要求覆盖率30%。

 

 

 

当然了,上面都是理想,最后有很多达到了,但是很多也达不到,为啥呢,主要原因是:

1.因为职位还没有达到,我的规范但是具体到别的开发,不愿意实行

2.code_review,就和要了他的命一样了

3.写注释,也和杀猪一样,最基本的要求,每个类谁写的,时间,这个类干嘛的,每个方法是干嘛的,都不愿意写。

4.代码更新,从来没有使用git管理代码分支的习惯,都是代码拉下来之后,一直直到要上线了才提交。

5.代码一大堆异常不处理,或者说压根不知道怎么处理。

6.时间,时间永远是我们最大的敌人,也是朋友。我们开发,玩的就是时间。

 

请注意我说的这些,不仅仅是刚入行的程序员会犯,包括我手下一位工作了9年的开发,他的状态就是这样,其实这样的开发,也快要到了被时代所淘汰的边缘了。

 

 

 

三、程序结构

如果有参数校验交给了校验参数类。

时间为1小时级别或者是10分钟级别。

这段代码可以将所给的当前时间截取到,当前时间的小时,当然了,结束时间就是一个小时的最后一个时间了。

接下来就是处理具体业务逻辑了。

 

接下来到了具体业务数据处理部分。

 

 

 

我们需要处理各种情况的业务数据。

 

这四个部分就涵盖了这一个小逻辑的全部过程。

先来看下第一部分,数据源的抽取。

首先准备好sql,注意scala的字符串拼接。

s"""可以做字符串变量赋值。

其次注意这两个问号。然后我们再来

请注意,首先我们声明了全局的数据库连接变量,稍后需要用到。其次women在这里读取到了刚才写的sql,拼接出来了sql语句,再者,我们在数据库读取使用了jdbcRDD对象,该对象初始化给入参数,sc、连接、sql、以及0,0,1,表示了。

可以得到数据,jdbcRDD,大家可以看一下介绍。

注意,回到我们的代码部分,jdbcRDD需要封装成dataframe,将rdd按照行,每一个行因为定义了是字符串的拼接,所以,这里将会是拼接字符串的方式,一步一步装载。

对象需要自己定义

不要忘记哦,对应关系。

这样我们就可以将mysql返回的数据,装载成了df。

装载成了df之后,就顺利啦。来看下怎么初步过滤的。

//df初步过滤数据
val dataValidUtils = new DataValidUtils
val new_df = dataValidUtils.dataValid(sc, preRecDf)
if (null == new_df || 0 == new_df.count.toInt) {
  println("Valid pre-rec failed.")
  return
}

我们用两个df的inner   join来过滤数据好了。

 

最后说一下处理,

 

我们在这里插入数据的,看最后一个框框,看下具体插入的代码。

 

这里仅仅写了一个小业务。方式比较简单,目前业务比较复杂,所以,重点就在于如何写自己的sql语句。

 

 

接下来会继续带来spark开发环境的搭建文档,以及spark源码解读的文档,以及后续做成真正实时的时候,还需要继续编写文档的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值