简介:
- Apache CarbonData是在Apache Hadoop、Apache Spark等大数据平台上实现快速分析的索引柱状数据存储解决方案。
- Apache CarbonData 是一种新的融合存储解决方案,利用先进的列式存储,索引,压缩和编码技术提高计算效率,从而加快查询速度,其查询速度比 PetaBytes 数据快一个数量级。
- Apache CarbonData是首个由中国公司发起并捐献给Apache基金会的开源项目,于2017年4月正式成为Apache顶级项目,由华为开源并支持Hadoop的高性能列式存储文件格式,其目的是提供一种统一的数据存储方案,以一份数据同时支持大数据分析的多种应用场景,All In One,并通过多级索引、字典编码、列式存储等特性提升 I/O 扫描和计算性能,实现百亿数据级秒级响应。
- 目前Apache CarbonData与Spark,Presto, Hive等框架做了集成,其中与Spark的集成最深入,提供了基于索引、预聚合、全局字典等更多查询优化手段来提升性能,也提供了数据更新、删除、增量入库等数据管理能力,可以说是在Spark开源框架上针对数据仓库类应用的增强。一个计算框架方面的All In One,一个存储格式方面的All In One,其实CarbonData的功能已经远远超越了数据格式的范畴了。
网址:
- 官网:
http://carbondata.apache.org - Github:
https://github.com/apache/carbondata - Apache CarbonData 中文文档:
http://carbondata.iteblog.com/index.html - CarbonData学习资料:
https://github.com/xubo245/CarbonDataLearning - 下载页面,笔者下载的是1.5.2版本的源码:
https://dist.apache.org/repos/dist/release/carbondata/1.5.2/
安装编译环境:
官网要求
- Unix-like environment (Linux, Mac OS X)
- Git
- Apache Maven (Recommend version 3.3 or later)
- Oracle Java 7 or 8
- Apache Thrift 0.9.3
笔者环境
- CentOS release 6.10 (Final)
- git version 1.7.1
- Apache Maven 3.5.0
- java version "1.8.0_131"
- Apache Thrift 0.9.3
- CDH 5.13.1
- Apache Spark 2.3.2
- Apache CarbonData 1.5.2
编译前准备:
下载安装包
- 根据之前给出的下载地址下载1.5.2版本的安装包
- 将下载好的安装包上传到服务器的/opt/software目录下,如果没有该目录,可以使用以下命令进行创建:
mkdir -p /opt/software
cd /opt/software - 上传完成如下图所示:
- 解压安装包,并移动到/opt/apps目录下:
mkdir -p /opt/apps
unzip apache-carbondata-1.5.2-source-release.zip
mv carbondata-parent-1.5.2/ /opt/apps/
cd /opt/apps/carbondata-parent-1.5.2/ - 配置pom.xml文件,加入cloudera依赖库的配置:
<repository>
<id>cloudera</id>
<name>cloudera Repository</name>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository> - 配置后如下图所示:
- 保存退出。
编译:
- 执行以下命令开始编译,需要等待十五六分钟的样子,主要还是看网速了:
mvn -DskipTests -Pspark-2.3 -Phadoop-2.8 -Pbuild-with-format -Pmv -Dspark.version=2.3.2 -Dhadoop.version=2.6.0-cdh5.13.1 clean package
- 编译成功截图:
- 编译成功后会在/opt/apps/carbondata-parent-1.5.2/assembly/target/scala-2.11/目录下生成编译好的jar包:
- 编译成功!
验证:
- 创建 sample.csv 文件,将数据加载到 CarbonData 需要使用到这个 CSV 文件。
- mkdir /opt/testData
cd /opt/testData - 执行以下命令:
cat > sample.csv << EOF
id,name,city,age
1,david,shenzhen,3
1 2,eason,shenzhen,27
3,jarry,wuhan,35
EOF
如下图所示:
然后上传到hdfs上:
cd ..
hdfs dfs -put testData/ /
- mkdir /opt/testData
- 在 Spark 安装目录下使用以下命令启动 Spark Shell:
./bin/spark-shell --jars /opt/apps/carbondata-parent-1.5.2/assembly/target/scala-2.11/apache-carbondata-1.5.2-bin-spark2.3.2-hadoop2.6.0-cdh5.13.1.jar
- 启动成功:
- SparkSession 可以通过访问 spark;而 SparkContext 可以通过访问 sc 。
- 创建CarbonSession
- 引入下面的类:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.CarbonSession._ - 创建 CarbonSession,以下<hdfs store path>需要替换成hdfs上的路径:
val carbon = SparkSession.builder().config(sc.getConf).getOrCreateCarbonSession("<hdfs store path>")
- 注:
- 默认情况下,Metastore 位置指向 ../carbon.metastore, 用户可以将自己的 metastore 位置提供给 CarbonSession
- <hdfs store path>和<local metastore path>需要替换成hdfs上的路径和本地路径,比如:
SparkSession.builder().config(sc.getConf) .getOrCreateCarbonSession("<hdfs store path>", "<local metastore path>")
- 引入下面的类:
- 创建一个表:
创建表的过程中可能会出现hdfs写权限不足的问题:carbon.sql("CREATE TABLE IF NOT EXISTS test_table(id string, name string, city string, age Int) STORED BY 'carbondata'")
解决办法:
1.可以将root用户加入到hdfs的supergroup组中:
1、在Linux执行如下命令增加supergroup groupadd supergroup
2、如将用户root增加到supergroup中,再执行: usermod -a -G supergroup root
3、同步系统的权限信息到HDFS:su - hdfs -s /bin/bash -c "hdfs dfsadmin -refreshUserToGroupsMappings"
2.可以禁用hdfs的权限校验机制,在cloudera manager管理界面,进入hdfs的配置页,找到以下配置,将对勾取消即可:
- 将数据加载到表中:
carbon.sql("LOAD DATA INPATH 'hdfs://hadoop-cluster/testData/sample.csv' INTO TABLE test_table")
- 从表中查询数据:
-
carbon.sql("SELECT * FROM test_table").show() carbon.sql("SELECT city, avg(age), sum(age) FROM test_table GROUP BY city").show()
- 结果如下图所示:
-
在 Spark on YARN 模式的集群上安装和配置 CarbonData
前置条件
- Hadoop HDFS 和 Yarn 需要安装和运行。
- Spark 需要在所有的集群节点上安装并且运行。
- CarbonData 用户需要有权限访问 HDFS.
步骤
以下步骤仅针对于 Driver 程序所在的节点. (Driver 节点就是启动 SparkContext 的节点)
- 将之前编译好的CarbonData jar包复制到 $SPARK_HOME/carbonlib 文件夹。如果 $SPARK_HOME 路径下不存在 carbonlib 文件夹,请事先创建它。
- 从CarbonData源码目录下复制./conf/carbon.properties.template文件到$SPARK_HOME/conf/文件夹下面,并将它重命名为 carbon.properties。
- 压缩 carbonlib 文件夹的内容到tar.gz 文件中,并将这个压缩文件移到 carbonlib 文件夹下面。
cd $SPARK_HOME
tar -zcvf carbondata.tar.gz carbonlib/
mv carbondata.tar.gz carbonlib/ - 在 $SPARK_HOME/conf/spark-defaults.conf 文件中配置下面的属性。
spark.master=yarn-client
spark.yarn.dist.files=/opt/apps/spark/conf/carbon.properties
spark.yarn.dist.archives=/opt/apps/spark/carbonlib/carbondata.tar.gz
spark.executor.extraJavaOptions=-Dcarbon.properties.filepath=carbon.properties
spark.executor.extraClassPath=carbondata.tar.gz/carbonlib/*
spark.driver.extraClassPath=/opt/apps/spark/carbonlib/*
spark.driver.extraJavaOptions=-Dcarbon.properties.filepath=/opt/apps/spark/conf/carbon.properties - 将下面的配置添加到 $SPARK_HOME/conf/carbon.properties 文件中:
carbon.storelocation=hdfs://hadoop-cluster/carbonstore
- 将以上的配置的操作和carbon编译好的jar包都分发的集群的其他节点上。
- 验证安装:
./bin/spark-shell --master yarn-client --driver-memory 1g --executor-cores 2 --executor-memory 2G
使用 CarbonData Thrift 服务器执行查询
- 服务启动命令:
./bin/spark-submit \
--conf spark.sql.hive.thriftServer.singleSession=true \
--num-executors 3 \
--driver-memory 2g \
--executor-memory 4g \
--executor-cores 10 \
--class org.apache.carbondata.spark.thriftserver.CarbonThriftServer \
/opt/apps/spark/carbonlib/apache-carbondata-1.5.2-bin-spark2.3.2-hadoop2.6.0-cdh5.13.1.jar hdfs://hadoop-cluster/carbonstore - 使用 Beeline 连接 CarbonData Thrift Server:
./bin/beeline -u jdbc:hive2://<thriftserver_host>:port
- 大功告成!
参考文档:CarbonData源码浅析一:Create Table