平台开发要关注事项

平台开发与项目或者一般的基于特定项目应用开发要求不尽一致,项目讲究的是快速上线。在快速开发的过程中难免有欠考虑的情况,但可以通过快速迭代,人肉运维,客户管理等方式维护项目。于此相比,平台开发就没这么幸运了。之所以成为平台开发,目标就是从单一的项目/应用中解脱出来,通过统一的方式完成业务需求,避免重复造轮子。平台开发有以下特点:

  1. 生态复杂性:平台开发通常要对接较为复杂的上下游系统,如我们的大数据应用平台就需要考虑不同引擎的兼容性,统一引擎不同版本的兼容下,上下游系统的版本,集群安全性,多集群等情况

  2. 应用开发多态多性: 用户在业务开发时有个人偏好,有的喜欢自己通过代码完成业务需求,有的则是习惯使用SQL,有的则喜欢通过托拉拽配置的方式完成业务

  3. 数据格式多样性:不同行业,同一行业的不同业务场景下的数据格式,以及数据处理后的存储格式,压缩,存储组件等均具有不同形式。

  4. 租户式管理:平台的使用者通常不是单个人,单个团队,其中即涉及到资源共享,又牵涉包括硬件,软件等平台的资源管理。

平台开发的选型参考

平台应用开发的多样性对底层平台的开发提出了严峻的挑战,笔者在流处理平台开发过程中也有不少经验教训,在此进行梳理以供参考。

  • 组件选型

    不同于一般项目的组件选型只考虑支撑项目即可,以流处理平台为例,一个流处理平台需要考虑如下几个方面:

    1. 时延敏感性

      对时延的敏感性很大程度上决定了底层计算框架的选型。如更低的时延则要求实时处理的框架(如Flink),如果不敏感则Spark也是一个强有力的计算框架竞争者。当然不同业务场景复杂性也可能对不同的计算框架都有需求

    2. 消息一致性要求

      鉴于流数据的无限性、硬件/网络可能的异常,精确计算始终是流数据劣势。对数据准确性敏感的场景则需要上下游组件都能分布式支持一致性语义。

    3. 上下游生态

      比如你的消息中心是选择Kafka,RabbitMQ,ZeroMQ亦或是Pulsar,即需要考虑上下游已有的生态组件、也需要考虑后续的业务发展(如多租户)

  • API选择

    以流处理平台为例,当前主要的流处理引擎都支持低级API和高级API:

    • 低级API通常指的是底层的map,fliter等类型的java/scala级别的api接口,该接口功能完备,开发定制方便但不利于灵活定义语义,
    • 高级API通常指的是Table/SQL级别的sql语句,接接口具有语义清晰,易上手,但难易支撑所有低级API业务场景,调优复杂
  • 版本选择

    在选择组件之后也涉及到组件版本的选择,这其中要考虑

    • 已存在的组件版本的兼容

    • 平台版本升级工作量

    • 业务需求

      不同的版本对特定场景的支持略有差异,如Kafka在0.9之后才支持kerberos安全环境,0.11之后版本才支持事务操作

平台开发的踩坑经验

配置动态化

​ 大数据栈的组件丰富,组件间的交互众多,进程在不同的节点运行,通常基础的配置我们容易识别容易设置,但也有许多配置在开发过程中我们难以识别,这时候就需要在开发过程中预留后门,在生产需要时有办法对参数进行设置,一个好的平台配置设计应当具有如下特征:

 1. 所有相关组件的参数可配置
 2. 平台自定义参数当具备默认值
 3. 用户设置参数值自动覆盖底层组件默认值

业务无侵入原则

​ 在开发的过程中,不能侵入业务侧的操作结果,即使是生产中有意义的添加也不能直接强加给业务侧。而应当通过平台高级参数开关的方式提供给应用侧。

如下代码就有多处违反以上原则:

// 在完成业务逻辑处理后,在dataFrame中添加时间戳列
val newDataFrame = dataFrame.withColumn(eventTime, functions.lit(time))
    newDataFrame
      .write
            // 在调用write接口时,无法设置相关的option
      .mode(write_mode)
      .format(outputFormat)
            // 在输出结果路径中添加一级时间戳的目录
      .save(path + s"/$eventTime=$time")
 

相关的逻辑应修改如下:

// 在输出的结果中是否添加时间列设置开关,默认应当设置为false
val newDataFrame =
  if (useEventTime.toBoolean) {
    dataFrame.withColumn(eventTime, functions.lit(time))
  } else {
    dataFrame
  }
})
// 在输出的目录中是否添加时间目录设置开关,默认应当为false
val timePath =
  if (useEventTimePath.toBoolean)
    path + s"/$eventTime=$time"
  else path + ""
var hdfsProps: collection.mutable.Map[String, String] = ...

    coalesceDataFrame
      .write
// 设置输出相关的参数
      .options(hdfsProps)
      .mode(write_mode)
      .format(outputFormat)
      .save(timePath)

合理的日志打印

一个好的平台不仅仅需要考虑平台的易用,也需要考虑平台的易维护性。当业务运行异常时,能够较为简单对问题进行定界,也就是区分是平台本身的问题还是应用运行问题。
在开发过程中,我们可以进行debug等操作,但在很多生产环境中,通常不运行我们这么操作。这就要求我们:

1. 代码中需要打印合理的日志,特别的关键逻辑中要详细打印相关日志。
2. 服务的所有进程可以动态调整日志打印级别。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352