CarbonData实践(一)

前言

CarbonData 拥有不错的明细查询能力,比如简单的where条件过滤,性能大概是Parquet的20倍。数据的聚合分析方面,如果有不错的where过滤,则相当一部分查询也是快于Parquet的,并且拥有更少的Tasks数,这就意味着可以让你的Spark Query Service 有更好的并发能力。

查询和入库的性能,一般而言是都是抵触的,需要有一个较好的权衡。CarbonData 在这块和Parquet 有一定的差距。

环境

Spark 1.6.0 + CarbonData 1.0.0

你可以通过这篇文章的介绍 迅速搭建一个基于CarbonData存储,以Spark为计算引擎的 Rest Service 服务。

数据导入

我们尝试两个规模数据的导入:

  1. 1000万数据的导入
  2. 12亿数据的导入(原始表24亿)

Spark 版本为 CDH5.7 Spark 1.6.0 ,对应所有的配置参数:

 --conf "spark.sql.shuffle.partitions=30" \
 --master yarn-cluster \
 --num-executors 12 \
 --executor-memory 10G \
 --executor-cores 1 \
 --driver-memory 6G \

导入都是通过SQL完成,类似

insert into table select * from another table

CarbonData有较复杂的存储结构,需要构建字典以及MDK等,所以整个构建过程中,需要两个大阶段:

  1. 构建全局字典文件
  2. 创建数据文件

所谓全局字典,其实指的是将你的列值用一个数字来存储和表示,这是列式存储的一个常用技巧。

假设你导入的数据规模很大,你需要将高基的列通过DICTIONARY_EXCLUDE 排除掉。否则很可能数据导入过程就OOM,然后executor掉了。所谓高基指的是某列count(distinct)的值。一般而言高于五万十万以上的基,而你的资源又非常有限,那么可以排除掉,不建字典。

在写入数据文件时,需要构建MDK。所谓MDK,其实就是一个多字段的复合索引,按声明顺序把所有字段拼接起来,越靠近左边的越有序,CarbonData的明细查询就靠这个了。还有倒排索引,通过列反向找到行。不过这也就意味着需要有全局排序了,排序一直是个消耗内存和CPU的活,
因为内存放不下,所以一般都要支持外排,所以在资源有限的情况下,你想导入大量的数据,需要注意两个地方:

  1. 减少单Executor导入任务的并行度,并行度越高,占用的内存就越大。
  2. 减少排序过程中的内存使用

对于第一种,行之有效的参数是:

carbon.number.of.cores.while.loading=2
carbon.number.of.cores.block.sort=1
carbon.merge.sort.reader.thread=1

第二情况则是:

carbon.sort.size=5000
carbon.sort.file.write.buffer.size=5000
carbon.merge.sort.prefetch=false

第一个和第二个参数会使得排序过程产生大量的磁盘文件。第三个参数则使得排序过程不从临时文件预取数据,这块消耗内存很大,如果资源较少,推荐关闭,可以有效缓解任务失败的概率。

还有一些值得注意的地方

  1. insert into table A select * from another table B

这里需要注意的是,A和B表字段顺序需要保持一致。否则可能发生字段的错位。

类型也需要匹配,无法转换的字段会为null。比如如果B字段是Date类型,在CarbonData里配置成timestamp 则会变成null从而引起一些诡异问题。

  1. Query的一些优化

** Spark 方面的一些调优**

首先 spark.speculation 是一个值得打开的参数,不至于让某个慢的Task导致整个查询过慢。

其次 ** spark.sql.shuffle.partitions ** 设置为你的CPU数的一到三倍是个不错的选择。因为过多的分区数,而你的CPU数又不足的情况下,会让费很多时间。

再有就是CPU充足不妨把 spark.locality.wait=0 设置上,这样可以让你的CPU充分跑起来而不会几个忙着,其他的嫌着。代价也是有的,可能产生更多的网络流量。

** Query语句上的一些调优 **

这几天调试了很多上百行的SQL,非常多和复杂的子查询,Join查询,大体的规则有:

  1. join的时候,一定要在on语句后面加上一些过滤条件,减少被join的数据量
  2. 把where过滤条件尽量放到子查询里去,因为在子查询外面的where条件没法下沉,导致子查询计算量非常大。
  3. 利用好MDK的索引特性,尽量将表左边的字段作为过滤条件

CarbonData的一些调优

有一种情况,就是单条记录非常小,那么一个CarbonData文件哪怕是几十M,那么可能也包含了几百万条记录。CarbonData有非常好的剪枝能力,可以不用去touch 那些不包含数据的block文件,所以这个时候可以让CarbonData文件小一点,经过剪枝后,虽然可能文件会多一些,但是每个文件小,并且能够提升并行度,从而有效的提升查询的效率。这个通过创建表的过程中设置TABLE_BLOCKSIZE来达到目标。在一个实际案例中,block大小是64M,后面我改成8M后,性能提升十倍左右。CarbonData 在1.0.0里默认是1G。这个值还是看大家row的大小来调整。

第二个情况是Block的数目以及大小分布不均。我们在实际案例发现,某张表有四个Block,其中一个Block是另外3个Block的的四倍大小。这样会发生严重的拖尾问题。第一是在导入数据的过程中,尽量利用多个节点,因为CarbonData生成的Block数和你的节点数是有关系的。其次是你可以设置前面的TABLE_BLOCKSIZE。

Query的优化,还有很多配置方面的参数可以做,比如向量化reader的开启,这块我还没实测,先不多说。

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

推荐阅读更多精彩内容