MVC架构: module, view, controller
三层架构:Controller, Service, Dao

项目规范

  1. Application 应用类必须继承 APP
  2. 创建业务对应三层架构的代码 Controller, Service, Dao
  3. 关联代码之间的关系
  4. 相关框架目录

common, bean, utils, controller, service, dao, application

scala 拾遗

控制抽象

将一段逻辑作为参数传入到一个方法。 使用控制抽象

  1. Breaks.breakable( )
  2. // breakable 的原码
  3. def breakable(op: => Unit) {
  4. try {
  5. op
  6. } catch {
  7. case ex: BreakControl =>
  8. if (ex ne breakException) throw ex
  9. }
  10. }
  1. // 将逻辑代码传给 start
  2. start{
  3. val filePath = ParameterTool.fromArgs(args).get("filePath")
  4. worldCountController.execute()
  5. }
  6. // 定义 start()
  7. def start( op: => Unit) = {
  8. try {
  9. // 初始化 Flink
  10. FlinkStreamEnv.init()
  11. // 传入处理逻辑
  12. op
  13. // 处理完成后执行 flink
  14. FlinkStreamEnv.execute()
  15. } catch {
  16. case e:Exception => e.printStackTrace()
  17. }
  18. }

ThreadLocal 操控线程中的内存

image.png

  1. private val localEnv = new ThreadLocal[StreamExecutionEnvironment]
  2. def init() = {
  3. val env = StreamExecutionEnvironment.getExecutionEnvironment
  4. env.setParallelism(1)
  5. localEnv.set(env)
  6. env
  7. }
  8. def get() = {
  9. val env = localEnv.get()
  10. if (env == null) {
  11. init()
  12. }
  13. env
  14. }

scala 中变量的灵活定义

1.获取命令行参数 传参:

ParameterTool.fromArgs(args).get("XXX")

image.png

  1. def main(args: Array[String]): Unit = {
  2. val host = ParameterTool.fromArgs(args).get("host")
  3. val port = ParameterTool.fromArgs(args).get("port")
  4. println(s"host:${host}, port:${port}")
  5. }

2. 通过 隐式参数,隐式值

  1. // 隐式参数
  2. def readFile(implicit path:String) {
  3. env.readTextFile(path)
  4. }
  5. // 隐式值
  6. 1. 在当前调用环境中 设置隐值
  7. implicit val path = "/tmp/file.txt"
  8. worldCountDAO.readTextFile
  9. 2. (在当前调用的目录)创建一个 Package Object 文件 <-- implicit val path = "/tmp/file.txt"

image.png

用户行为

字段名 数据类型 说明
userId Long 加密后的用户ID
itemId Long 加密后的商品ID
categoryId Int 加密后的商品所属类别ID
behavior String 用户行为类型,包括(‘pv’, ‘’buy, ‘cart’, ‘fav’)
timestamp Long 行为发生的时间戳,单位秒

需求1:实时热门商品统计

每隔5分钟输出最近1小时内点击量最多的商品Top10

为了方便使用,将 原始日志封装成脑样例类

需求2: 基于log的热门页面浏览统计

每隔5秒,输出最近10分钟内访问量最多的前 N个URL

字段名 ** **
ip String 访问的 IP
userId Long 访问的 user ID
eventTime Long 访问时间
method String 访问方法 GET/POST/PUT/DELETE
url String 访问的 url

去重 val set = mutable.Set[Long] , set.add(datas)

需求3: PV/UV 统计