kudu大量数据更新_网易考拉基于Kudu构建实时流量数仓实践

本文由作者授权网易云发布

作者:江魏炜,网易考拉工程师

背景

利用Hive进行离线计算可以满足业务方隔天看数据需求,但是对于当天的实时数据就显得有些力不从心,在引入Kudu之前考拉的流量业务主要采用2种方式解决当天的实时看数需求:

  1. 引入实时计算框架如JStrom、Sloth(网易猛犸大数据平台实时流计算组件,由网易大数据团队研发)等计算固化的流量指标,但是这种方式只能满足基础的指标如PV、UV、引导成交等等,且不支持维度下钻,如果想要新增一种维度就必须走需求评审、开发排期等环节,从需求提出到业务方能看到数据的时间比较久,而且无法满足用户在大促期间的临时取数需求。
  2. 将Kafka流量流接入Hive,并开发小时级别的离线Hive任务,由于是明细数据,这种方式支持维度的下钻,对于分析师、产品运营也比较友好。但是小时级别的任务会占用集群大量的资源,如果上一小时的任务没有在一小时内跑完就会造成任务追尾的情况出现,这样下去集群只会越来越堵,目前团队内部已经禁止开发新的小时级任务。

其实第二种方式已经能够满足多维度看数据的需求了,只是基于Hive跑小时级任务实在太消耗资源,而且有延迟的风险,那么有没有一种存储技术具有高吞吐量连续读取数据的能力,而且也支持低延迟的随机读写呢?一般来说这2个要求是互斥的,但是Kudu却在这2者之间做了很好的平衡。

7d45f936bbf93b618f1129e2c7ca0162.png

Kudu不但提供了行级的插入、更新、删除API,同时也提供了接近Parquet性能的批量扫描操作。使用同一份存储,既可以进行随机读写,也可以满足数据分析的要求。

Kudu应用

实时流/业务数据写入

可以使用Spark Streaming 提供的KafkaUtils.createDirectStream方法来创建一个对应topic的Dstream。这种方法topic的offset将完全由我们自己控制

private val stream = KafkaUtils.createDirectStream[String, String](
    ssc,
    PreferConsistent,
    Subscribe[String, String](topics, kafkaParams)
  )

写入Kudu分以下几个步骤:

  1. 获取kafka offset
  2. 创建KuduContext
  3. 定义写入Kudu表的schema
  4. 按照解析逻辑解析流量日志并构建DataFrame
  5. 将df插入Kudu并提交offset
val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges

val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate()
val kuduContext = new KuduContext(kuduMaster, spark.sparkContext)

val flowDf = spark.createDataFrame(rdd.map(r => {
    processFlowLine(r.value)
  }).filter(row => if (row.get(0) == null) false else true), schema)
kuduContext.upsertRows(flowDf, "impala::kaola_kudu_internal.dwd_kl_flw_app_rt")

stream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)

写入性能测试

Kudu写入表: haitao_dev_log.dwd_kl_flw_app_rt
分片: 240个
Spark Streaming调度间隔: 15s

a68eef982fcce91a5a32ca8e1a7f9afc.png

aaf0e31a97b3a94284aeea5b0bba8b94.png


由上图可知目前有效流量的QPS在2W左右,后台Kudu的写入量在20M/s,还远没有达到Kudu的最大写入值100W+。

看一下Spark任务执行的时间分布:

0103339cf8a5ef26635fb98892a2509f.png

可以发现75%的任务都在1s完成,有少数任务跑的较慢但整体在2s都跑完了,这里需要注意一种极端情况,由于Spark的默认配置并发数是1,如果有一个进程迟迟没有跑完(一般是数据分布不均)那么后面的任务将会排队,直到最初的任务跑完才会去调度下一个任务。这样会造成资源浪费,多个空闲的executor会一直等待最后一个executor,流量日志不要求顺序插入,因此我们可以加大任务的并发数。具体参数设置:

spark.streaming.concurrentJobs = N

小结

目前实时写入Kudu的流量日志在每日数十亿条,写入量在TB级,而且已有实时流量拆解等业务依赖Kudu的底层流量数据,接下来将会有更多的业务线迁移至Kudu以满足不同维度下的分析需求。

相关阅读:

  • 实时性和完整性兼得,使用 Kudu 和 Impala 实现透明的分层存储管理
  • 网易云音乐Flink实时计算平台运维系统架构演进
  • 网易大数据体系之时序数据技术
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值