关于本篇文章的说明:
本篇文章为笔者辛苦劳作用了一整天总结出来的文档,大家阅读转发的时候请不要吝啬写上笔者:涂作权 和 原文地址。
由于笔者所在环境没有人用过kylin,笔者也是自学官网,阅读书籍 将kylin用于实际项目,期间遇到了很多很多关于kylin使用的问题。为了让后面的人在使用kylin实践的时候能够少走弯路,在此生成kylin的调优,错误总结,知识点文档,这篇文档应该是目前网上最全的kylin调优和总结文档了(除了官网)。
以下文章内容主要来自官网,书籍,博文,网友,社区,同学,以及实际项目。
1 调优方案
1.1 调优:如何提高访问连接并发(运维层面)
根据书籍中的介绍,kylin单个的实例,支持的访问连接并发是70个左右,所以,为了让kylin能够支持更多的访问并发,可以通过增加实例的方式实现。将单实例的Kylin变成集群方式,增加query节点的个数。
官网介绍的方式:
http://kylin.apache.org/docs/install/kylin_cluster.html
说明:
A:假设有3台机器,分别是machine1,machine2,machine3。其中Machine的运行模式是all(即拥有 执行job+执行query的角色 (个人理解)),另外的machine2和machine3为query(主要用于查询)。
B:注意,kylin2.0以后,kylin支持了多个job的方式,具体方式可以参考文档进行相关配置。
1.2 调优:解决kylin预处理过程gc问题(运维层面)
Kylin是基于预处理技术,如果公司资金雄厚,服务器配置高,内存大,那就不要吝啬内存了。给kylin足够的内存分配,能够减少很多问题。
如果处理的好,可以结合任务调度系统,比如azkaban,通过shell的方式将kylin的内存在数据处理空闲的时候,将内存多分配给kylin。
关于此部分的介绍,官网给出的建议是:
http://kylin.apache.org/docs/install/configuration.html
Allocate More Memory for Kylin
There are two sample settings for KYLIN_JVM_SETTINGS are given in $KYLIN_HOME/conf/setenv.sh.
The default setting use relatively less memory. You can comment it and then uncomment the next line to allocate more memory for Kyligence Enterprise. The default configuration is:
Export KYLIN_JVM_SETTINGS="-Xms1024M -Xmx4096M -Xss1024K -XX`MaxPermSize=512M -verbose`gc -XX`+PrintGCDetails -XX`+PrintGCDateStamps -Xloggc`$KYLIN_HOME/logs/kylin.gc.$$ -XX`+UseGCLogFileRotation - XX`NumberOfGCLogFiles=10 -XX`GCLogFileSize=64M"# export KYLIN_JVM_SETTINGS="-Xms16g -Xmx16g -XX`MaxPermSize=512m -XX`NewSize=3g -XX`MaxNewSize=3g -XX`SurvivorRatio=4 -XX`+CMSClassUnloadingEnabled -XX`+CMSParallelRemarkEnabled -XX`+UseConcMarkSweepGC -XX `+CMSIncrementalMode -XX`CMSInitiatingOccupancyFraction=70 -XX`+UseCMSInitiatingOccupancyOnly -XX`+DisableExplicitGC -XX`+HeapDumpOnOutOfMemoryError -verbose`gc -XX`+PrintGCDetails -XX`+PrintGCDateStamps -Xloggc`$KYLIN_HOME/logs/kylin.gc. $$ -XX`+UseGCLogFileRotation -XX`NumberOfGCLogFiles=10 -XX`GCLogFileSize=64M"
- 1
- 2
笔者配置:
[xxx conf]# pwd/data/installed/apache-kylin-2.3.1-bin/conf[xxxx conf]# vim setenv.sh
- 1
- 2
- 3
1.3 调优+错误总结:配置build引擎支持Spark (运维层面)
在kylin中支持以Spark作为预处理的方式,在内存足够的情况下,建议配置build引擎。使用Spark,默认的build引擎使用的是mapreduce.
由于笔者使用的hadoop版本是3.0.1(原生),当前最高版本是:v2.5.2,发现使用Kylin的时候,会报jar冲突问题,因为我环境使用的是3.x的jar包,但是在kylin发行版本目前还使用的是基于hadoop2.x的Spark。所以失败了。
但是,若使用的是CDH,可以使用,apache-kylin-2.5.2-bin-cdh60.tar.gz for beta版本进行安装试用。
支持Spark的配置:http://kylin.apache.org/docs/tutorial/cube_spark.html,关于具体步骤,本文不进行详细叙述。
1.4 调优:kylin出现reduce阶段内存异常问题(hadoop运维层面)
在kylin执行cube build的过程中,可能会出现内存溢出的问题,这个问题其中一个原因是hadoop的虚拟参数配置不合理导致的。
这里在$HADOOP_HOME/etc/Hadoop/yarn-site.xml 中的配置类似如下:
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true--><property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value></property><!-- 任务每使用1MB物理内存,最多可使用虚拟内存,默认是2.1 --><property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>5</value></property><!-- 每个节点可用内存,单位MB --><property> <name>yarn.nodemanager.resource.memory-mb</name> <!--<value>16384</value>--> <value>20480</value> <discription>每个节点可用内存,单位MB</discription></property><!-- 单个任务可申请最少内存,默认1024MB --><property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value></property><!-- 单个任务可申请最大内存,默认8192MB --><property> <name>yarn.scheduler.maximum-allocation-mb</name> <!--<value>16384</value>--> <value>20480</value></property>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
yarn.nodemanager.vmem-pmem-ratio :虚拟内存大小的一个系数,通过调整这个参数,可以增大虚拟内存的值,避免kylin在cube build的过程中出现失败。
此外,也要调整:$HADOOP_HOME/etc/Hadoop/mapred-site.xml中如下的值:
<property> <name>mapreduce.map.java.opts</name> <!--<value>-Xms3g -Xmx6g</value>--> <value>-Xms3g -Xmx10g</value></property><property> <!-- mapreduce.reduce.java.opts 这个值一般是mapreduce.map.java.opts的两倍 --> <name>mapreduce.reduce.java.opts</name> <!--<value>-Xms6g -Xmx12g</value>--> <value>-Xms6g -Xmx16g</value></property><!-- 每个Map任务的物理内存限制,这个值 * yarn.nodemanager.vmem-pmem-ratio 就是虚拟内存的大小--><property> <name>mapreduce.map.memory.mb</name> <!--<value>6144</value>--> <value>10240</value></property><property> <name>mapreduce.reduce.input.buffer.percent</name> <value>0.5</value></property><!-- 每个Reduce任务的物理内存限制,一般还是机器内存的80% --><property> <name>mapreduce.reduce.memory.mb</name> <!--<value>12288</value>--> <value>16384</value></property>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
其中官网的介绍是:
1.5 将cuboid数据转为HFile
这一步启动一个MR任务来讲cuboid文件(序列文件格式)转换为HBase的HFile格式。Kylin通过cube统计数据计算HBase的region数目,默认情况下每5GB数据对应一个region。Region越多,MR使用的reducer也会越多。如果你观察到reducer数目较小且性能较差,你可以将“conf/kylin.properties”里的以下参数设小一点,比如:
kylin.hbase.region.cut=2kylin.hbase.hfile.size.gb=1
- 1
- 2
如果你不确定一个region应该是多大时,联系你的HBase管理员。
1.6 调优:解决kylin cube过程中的hive小文件问题(运维层面)
Kylin中自带文件合并,下面的过程可以考虑设置(这个笔者没有验证过,有的博文中建议下面方式进行设置,但是官网是另外一种说法)
官网:
一些博文上的写法:
[xxx conf]# pwd/xxxx/apache-kylin-2.3.1-bin/conf[xxxx conf]# vim kylin_hive_conf.xml
- 1
- 2
- 3
该文件原本的配置如下:
<property> <name>hive.merge.mapfiles</name> <value>false</value> <description>Disable Hive's auto merge</description></property><property> <name>hive.merge.mapredfiles</name> <value>false</value> <description>Disable Hiv