kobeliuziyang | 发布于 2018-01-14 16:12:31 | 阅读量 31 |
发布于 2018-01-14 16:12:31 |

1.尽量将需要展现的字段作为维度,没必要所有的一股脑加进去。

2.每次查询或者要经常group by的字段作为Mandatory维度。且该维度放在rowkey的最前面。

3.将数量相近也就是说某两个字段通过select count("字段名")获取的结果近似1:1,设置为joint维度。

4.rowkey的顺序按查询频率从高到低,从前往后排。

5.将经常出现在同一SQL中的不同维度放置在一个维度组中,将从不出现在一个SQL查询中的不同维度设置在不同的维度组中。

6.Dictionary默认为dict类型,如果某个字段中的值非常大(小幽遇到过的一个字段中的值保存成文本足足有23Kb!!!),大到以至或者可能使得Cube在build过程中出现OOM的错误,则需要将该字段的值设置为fixed_length类型,取可以展现这个维度的前length个字节,比如对于之前那个23kb的字段值,经和业务人员协商,发现取前4000个字节就可以表示这个字段了。所以fixed_length的值设置为4000.值得一提的是,Dictionary默认为false,是不给该字段在内存中建立词典树的,而更改为true则表示给该字段建立词典树。有词典树,则会优化带有该字段的SQL查询,提升查询速度,但相应地也会消耗一些内存。

 

读取hive数据阶段:

如果你的Hive允许文件合并,你可以在“conf/kylin_hive_conf.xml”中通过配置项来禁用这一功能。因为Kylin有它自己的文件合并方法(我们将在下面介绍):

<property> <name>hive.merge.mapfiles</name> <value>false</value> <description>Disable Hive's auto merge</description> </property>

 

Kylin会获取临时表的行数;然后,基于这个行数就可以获取需要进行数据重分配的文件的数量。Kylin默认一个文件包含1百万行的数据。在这个例子中,一共有1.6亿行数据和160个reducer,并且每个reducer写一个文件。在后续的MR步骤中,Hadoop将会启动相同数量的mapper来对这些文件进行处理(通常1百万行数据的大小会比一个HDFS块要小)。如果日常的数据规模不是很大或者Hadoop集群有足够的资源,可以通过在“conf/kylin.properties”中将配置项“kylin.job.mapreduce.mapper.input.rows”设置为更小的值来获取更高的并发度,如下所示:

kylin.job.mapreduce.mapper.input.rows=500000​

Build Base Cuboid

这一步是通过临时表构建基本的cuboid,这是逐层算法的第一轮MR任务。Mapper的数量等于步骤二中reducer的数量;而Reducer(这里指的是本步骤中启动的reducer)的数量是通过cube的统计信息预估出来的:默认每500M使用一个reducer。如果你发现reducer的数目很少,可以通过在kylin.properties中对配置项“kylin.job.mapreduce.default.reduce.input.mb”设置更小的值,来获取更多的集群资源,如下所示: 
kylin.job.mapreduce.default.reduce.input.mb=200



Convert Cuboid Data to HFile

这一步会启动一个MR任务用来将cuboid文件(顺序文件格式)转换为Hbase的HFile文件。Kylin通过cube的统计信息来计算HBase的region个数,默认每个region大小是5G。Region数越多,就会使用更多的reducer。如果发现reducer的数目很少,并且性能很差,就可以在“conf/kylin.properties”中增加如下配置项:

kylin.hbase.region.cut=2
kylin.hbase.hfile.size.gb=1​







内容更新于: 2018-01-14 16:12:31
链接地址: http://blog.leanote.com/post/kobeliuziyang/kylin-%E4%BC%98%E5%8C%96

上一篇: hive导入elasticsearch

下一篇: Elasticsearch->api

31 人读过
comments powered by Disqus
文档导航