在 AWS EMR 上安装 Kylin

本文档介绍了在 EMR 上如何运行 Kylin。

推荐版本

  • AWS EMR 5.27
  • Apache Kylin v3.0.0 or above for HBase 1.x

启动 EMR 集群

使用 AWS 网页控制台,命令行或 API 运行一个 EMR 集群。在 Kylin 需要 HBase 服务的应用中选择 HBase

您可以选择 HDFS 或者 S3 作为 HBase 的存储,这取决于您在关闭集群之后是否需要将 Cube 数据进行存储。EMR HDFS 使用 EC2 实例的本地磁盘,当集群停止后数据将被清除,Kylin 元数据和 Cube 数据将会丢失。

如果您使用 S3 作为 HBase 的存储,您需要自定义配置为 hbase.rpc.timeout,由于 S3 的大容量负载是一个复制操作,当数据规模比较大时,HBase Region 服务器比在 HDFS 上将花费更多的时间等待其完成。

如果您希望EMR的Hive使用一个外部的元数据,您可以考虑使用RDS或者AWS Glue。那样您就可以在云上环境构建一个stateless的OLAP服务了。

让我们通过AWS CLI创建一个EMR 集群,并且开启(当然以下几项是可选的)
1. S3作为HBase数据存储
2. AWS Glue作为Hive元数据
3. 开启S3元数据一致性以防止数据文件丢失

  1. aws emr create-cluster --applications Name=Hadoop Name=Hive Name=Pig Name=HBase Name=Spark Name=Sqoop Name=Tez Name=ZooKeeper \
  2. --release-label emr-5.28.0 \
  3. --instance-groups '[{"InstanceCount":2,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":50,"VolumeType":"gp2"},"VolumesPerInstance":1}]},"InstanceGroupType":"CORE","InstanceType":"m5.xlarge","Name":"Worker Node"},{"InstanceCount":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":100,"VolumeType":"gp2"},"VolumesPerInstance":1}]},"InstanceGroupType":"MASTER","InstanceType":"m5.xlarge","Name":"Master Node"}]' \
  4. --configurations '[{"Classification":"hbase","Properties":{"hbase.emr.storageMode":"s3"}},{"Classification":"hbase-site","Properties":{"hbase.rootdir":"s3://{S3_BUCKET}/hbase/data","hbase.rpc.timeout": "3600000"}},{"Classification":"hive-site","Properties":{"hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"}}]' \
  5. --name 'Kylin3.0Cluster_Original' \
  6. --emrfs Consistent=true \
  7. --region cn-northwest-1

支持AWS Glue作为Hive元数据存储

如果你需要开启Glue作为Hive元数据, 请参考https://github.com/awslabs/aws-glue-data-catalog-client-for-apache-hive-metastore 来进行打包。你需要获取以下jar:

  1. aws-glue-datacatalog-client-common-xxx.jar
  2. aws-glue-datacatalog-hive2-client-xxx.jar

安装 Kylin

当 EMR 集群处于 “Waiting” 状态,您可以 SSH 到 master 节点,下载 Kylin 然后解压 tar 包:

  1. sudo mkdir /usr/local/kylin
  2. sudo chown hadoop /usr/local/kylin
  3. cd /usr/local/kylin
  4. wget http://mirror.bit.edu.cn/apache/kylin/apache-kylin-3.0.0/apache-kylin-3.0.0-bin-hbase1x.tar.gz
  5. tar -zxvf apache-kylin-3.0.0-bin-hbase1x.tar.gz

配置 Kylin

启动 Kylin 前,您需要进行一组配置:

  • /etc/hbase/conf/hbase-site.xml 复制 hbase.zookeeper.quorum 属性到 $KYLIN_HOME/conf/kylin_job_conf.xml,例如:
  1. <property>
  2. <name>hbase.zookeeper.quorum</name>
  3. <value>ip-nn-nn-nn-nn.ap-northeast-2.compute.internal</value>
  4. </property>
  • 使用 HDFS 作为 kylin.env.hdfs-working-dir (推荐)

EMR 建议 当集群运行时使用 HDFS 作为中间数据的存储而 Amazon S3 只用来输入初始的数据和输出的最终结果。Kylin 的 hdfs-working-dir 用来存放 Cube 构建时的中间数据,cuboid 数据文件和一些元数据文件 (例如不便于在 HBase 中存储的 /dictionary/table snapshots),因此最好为其配置 HDFS。

如果使用 HDFS 作为 Kylin 的工作目录,您无需做任何修改,因为 EMR 的默认文件系统是 HDFS:

  1. kylin.env.hdfs-working-dir=/kylin

关闭/重启集群前,您必须用 S3DistCp 备份 HDFS 上 /kylin 路径下的数据到 S3,否则您可能丢失数据且之后不能恢复集群。

  • 使用 S3 作为 kylin.env.hdfs-working-dir

如果您想使用 S3 作为存储 (假设 HBase 也在 S3 上),您需要配置下列参数:

  1. kylin.env.hdfs-working-dir=s3://yourbucket/kylin
  2. kylin.storage.hbase.cluster-fs=s3://yourbucket
  3. kylin.source.hive.redistribute-flat-table=false

中间文件和 HFile 也都会写入 S3。构建性能将会比 HDFS 慢。
为了很好地理解 S3 和 HDFS 的区别,请参考如下来自 AWS 的两篇文章:

Input and Output Errors
Are you having trouble loading data to or from Amazon S3 into Hive

  • Hadoop 配置

根据 emr-troubleshoot-errors-io,为在 S3 上获得更好的性能和数据一致性需要应用一些 Hadoop 配置。

  1. <property>
  2. <name>io.file.buffer.size</name>
  3. <value>65536</value>
  4. </property>
  5. <property>
  6. <name>mapred.map.tasks.speculative.execution</name>
  7. <value>false</value>
  8. </property>
  9. <property>
  10. <name>mapred.reduce.tasks.speculative.execution</name>
  11. <value>false</value>
  12. </property>
  13. <property>
  14. <name>mapreduce.map.speculative</name>
  15. <value>false</value>
  16. </property>
  17. <property>
  18. <name>mapreduce.reduce.speculative</name>
  19. <value>false</value>
  20. </property>
  • 如果不存在创建工作目录文件夹
  1. hadoop fs -mkdir /kylin

  1. hadoop fs -mkdir s3://yourbucket/kylin

解决包冲突

  • 将以下内容添加到 ~/.bashrc
  1. export HIVE_HOME=/usr/lib/hive
  2. export HADOOP_HOME=/usr/lib/hadoop
  3. export HBASE_HOME=/usr/lib/hbase
  4. export SPARK_HOME=/usr/lib/spark
  5. export KYLIN_HOME=/home/ec2-user/apache-kylin-3.0.0-SNAPSHOT-bin
  6. export HCAT_HOME=/usr/lib/hive-hcatalog
  7. export KYLIN_CONF_HOME=$KYLIN_HOME/conf
  8. export tomcat_root=$KYLIN_HOME/tomcat
  9. export hive_dependency=$HIVE_HOME/conf:$HIVE_HOME/lib/:$HIVE_HOME/lib/hive-hcatalog-core.jar:$SPARK_HOME/jars/
  10. export PATH=$KYLIN_HOME/bin:$PATH
  11. export hive_dependency=$HIVE_HOME/conf:$HIVE_HOME/lib/*:$HIVE_HOME/lib/hive-hcatalog-core.jar:/usr/share/aws/hmclient/lib/*:$SPARK_HOME/jars/*:$HBASE_HOME/lib/*.jar:$HBASE_HOME/*.jar
  • 暂时删除 joda.jar
  1. mv $HIVE_HOME/lib/jackson-datatype-joda-2.4.6.jar $HIVE_HOME/lib/jackson-datatype-joda-2.4.6.jar.backup
  • 修改 bin/kylin.sh

将以下内容添加到 bin/kylin.sh的 开始

  1. export HBASE_CLASSPATH_PREFIX=${tomcat_root}/bin/bootstrap.jar:${tomcat_root}/bin/tomcat-juli.jar:${tomcat_root}/lib/*:$hive_dependency:$HBASE_CLASSPATH_PREFIX

开启支持Glue作为Hive数据源(可选的)

  • aws-glue-datacatalog-client-common-xxx.jaraws-glue-datacatalog-hive2-client-xxx.jar放到 $KYLIN_HOME/lib目录下
  • kylin.properties中修改kylin.source.hive.metadata-type=gluecatalog

配置 Spark

  • 对Spark进行打包
  1. rm -rf $KYLIN_HOME/spark_jars
  2. mkdir $KYLIN_HOME/spark_jars
  3. cp /usr/lib/spark/jars/*.jar $KYLIN_HOME/spark_jars
  4. cp -f /usr/lib/hbase/lib/*.jar $KYLIN_HOME/spark_jars
  5. rm -f netty-3.9.9.Final.jar
  6. rm -f netty-all-4.1.8.Final.jar
  7. 
jar cv0f spark-libs.jar -C $KYLIN_HOME/spark_jars .
  8. aws s3 cp spark-libs.jar s3://{YOUR_BUCKET}/kylin/package/ # You choose s3 as your working-dir
  9. hadoop fs -put spark-libs.jar hdfs://kylin/package/ # You choose hdfs as your working-dir
  • kylin.properties设置kylin.engine.spark-conf.spark.yarn.archive=PATH_TO_SPARK_LIB

启动 Kylin

启动和在普通 Hadoop 上一样:

  1. $KYLIN_HOME/bin/sample.sh
  2. $KYLIN_HOME/bin/kylin.sh start

别忘记在 EMR master - “ElasticMapReduce-master” 的安全组中启用 7070 端口访问,或使用 SSH 连接 master 节点,然后您可以使用 http://<master-dns>:7070/kylin 访问 Kylin Web GUI。

Build 同一个 Cube,当 Cube 准备好后运行查询。您可以浏览 S3 查看数据是否安全的持久化了。

关闭 EMR 集群

关闭 EMR 集群前,我们建议您为 Kylin metadata 做备份且将其上传到 S3。

为了在关闭 Amazon EMR 集群时不丢失没写入 Amazon S3 的数据,MemStore cache 需要刷新到 Amazon S3 写入新的 store 文件。您可以运行 EMR 集群上提供的 shell 脚本来完成这个需求。

  1. bash /usr/lib/hbase/bin/disable_all_tables.sh

为了用同样的 Hbase 数据重启一个集群,可在 AWS Management Console 中指定和之前集群相同的 Amazon S3 位置或使用 hbase.rootdir 配置属性。更多的 EMR HBase 信息,参考 HBase on Amazon S3

在专用的 EC2 上部署 Kylin

推荐在专门的 client 节点上运行 Kylin (而不是 master,core 或 task)。启动一个和您 EMR 有同样 VPC 与子网的独立 EC2 实例,从 master 节点复制 Hadoop clients 到该实例,然后在其中安装 Kylin。这可提升 Kylin 自身与 master 节点中服务的稳定性。

其他问题

如果将S3配置为您的working-dir,并且发现了”Wrong FS”异常,请尝试修改 $KYLIN_HOME/conf/kylin_hive_conf.xml/etc/hive/conf/hive-site.xml/etc/hadoop/conf/core-site.xml

  1. <property>
  2. <name>fs.defaultFS</name>
  3. <value>s3://{YOUR_BUCKET}</value>
  4. <!--<value>hdfs://ip-172-31-6-58.cn-northwest-1.compute.internal:8020</value>-->
  5. </property>