翻译自 http://kylin.apache.org/docs21/howto/howto_optimize_build.html,非常实用的一篇文档,在调试cube build过程中帮了我大忙。可惜目前并没有中文版,于是我便花费些时间翻译了这篇文章,现已提交PR。
Kylin实战(四):rowkey调优
普遍情况下,Kylin以HBase作为存储引擎,因此HBase的查询效率对于Kylin的查询响应时间尤为关键,而rowkey作为HBase最重要的设计自然是优化的重中之重。合适的rowkey设计不仅可以节省cube存储空间和降低膨胀率,而且能减小查询扫描的范围并提高聚合计算速度从而加速查询。为此,Kylin在”Advanced Setting”页面提供了rowkey的配置供用户调整,具体可以分为维度的编码方式、维度的顺序和分片维度设置三类。
Kylin实战(三):cube聚合组优化
Kylin核心思想是通过预计算空间换时间,是典型的Multidimensional OLAP应用。MLOAP有着结构紧凑,查询响应快的优点,但同时也有着臭名昭著的维度爆炸问题。如果将所有维度组合都预计算并存储下来,组合的数量将是2^N。通常一个宽表有上百的维度是很正常的,但查询组合往往不超过20维,其中巨大的浪费是显而易见的。
Kylin实战(二):引入Hive视图层
上节用Hive UDTF平铺内嵌类型字段介绍了接入Kylin前如何处理Hive中的复杂字段,不过每次在cube build前进行一次数据处理,存到中间表,再接入该中间表,这样的流程不仅低效繁琐而且耦合性强不易维护。
目前业界更流行的做法是通过Hive逻辑视图来处理。因为视图不需要物化,可以节省计算资源和存储空间,更重要的是减少环节降低了数据的延迟。试想本来每天凌晨1点就开始离线ETL任务,数据仓库的数据3点入库完毕可以进行cube build。如果预留1小时给中间表的计算环节,那么cube build要4点才可以开始,Kylin的下游任务全部都要顺延一个小时,这个成本是很高的。相比之下视图只会给cube build增加一点overhead,完全可以接受。
Spark源码学习笔记(二):Executor运行机制
Executor是执行用户代码的“一线工人”(worker),理解Executor的运行机制无论对编写高效优雅的Spark Application还是对Task的troubleshooting都尤为重要。
注:吸取了broadcast包1.6版本和2.x版本差异较大的教训,我决定直接跳到今年7月发布的Spark 2.2.0版本,之后的所有笔记也会基于2.2.0版本。
Spark源码学习笔记(一):Broadcast机制
读源码是大数据开发工程师的自我修养之一,趁最近项目进度比较快,我决定抽时间来系统学习一下代码质量广受好评的Spark源码。虽然工作中使用的是Apache 发行版的1.6.1,所以读源码时还是保持一致。好项目都是高内聚低耦合,这就方便逐个组件剖析。先从core包开始,这次要讲的是org.apache.spark.broadcast
。
在Spark应用启动时,Driver需要将序列化之后的task发至executor上。官方建议task的大小应该在20KB以下,以保证Application可以快速启动。如果task要使用比较大的变量,比如一个维度表,这时就会用到Spark的broadcast机制。
Kylin实战(一):用Hive UDTF平铺内嵌类型字段
众所周知,Apache Kylin 是基于星型模型设计的,并不支持雪花模型(更新:在最近发布的2.0版本中增加了对雪花模型的支持)。然而在大多数情况下,Kylin的存储引擎是Hive。不同于普通RDMS,Hive支持复杂数据类型,包括Array,Map和Struct。复杂数据类型的字段又可以称为内嵌对象(nested object), 某种程度上属于雪花模型。如果导入带有复杂数据类型字段的Hive表,Kylin会在校验表元信息的时候报错。
并发replace into导致MySQL死锁
之前曾解决过Spark任务的不同Executor同时更新MySQL导致死锁的问题,最近该同事遇到了这个问题的升级版:业务有两个不同的数据源分别用于实时计算和更新MySQL同一张表的不同列,目前这个是分别启动了两个Spark Streaming任务,但是更新MySQL不时 出现死锁的问题,只能通过不断try/catch重试来暂时解决。
curl模拟REST请求
大数据平台常常需要提供web端管理界面,比如Hadoop内嵌的基于jetty的监控页面、Kylin内嵌的基于tomcat的管理界面。虽说这些Web应用面向企业内部,QPS远远比不上淘宝这种面向C端的网站,但对于大数据平台开发工程师来说,基本的Web开发能力是必不可少的。出于开发效率和个人发展方向的考虑,我之前开发Web系统更多是基于一定的模板,配置都拷贝粘贴而来,不求甚解。然而随着开发的深入,尤其是面向产品运营人员的智能报表系统的研发,我发现之前的知识储备完全不够用。因此,接下来一段时间我会暂时放下大数据组件的学习而专注于Web技术。