Apache CarbonData 学习笔记

简介

CarbonData是使用先进的列式存储,索引,压缩和编码技术,以提高计算效率及更快交互式查询一个新的Hadoop本地文件格式,反过来这将帮助更快的查询超过PB级的数据。

特征

CarbonData文件格式列式存储在HDFS中,它有许多功能,包括一个现代化的列式格式有,如分割,压缩模式,复杂的数据类型等,并CarbonData具有以下独特的功能:

  • 与索引一起存储的数据:它可以显著加快查询性能并减少I / O扫描和CPU资源,查询中包含过滤。 CarbonData索引由索引的多个级别,处理框架可以利用这个索引,以减少需要来安排和处理的任务,它也可以跳跃扫描更精细的晶粒单元(称为blocklet)而不是扫描整个文件。
  • 可操作的编码数据:通过支持高效的压缩和全球编码方案,可以查询压缩/编码的数据,数据可以只是将结果返回给该用户,这个被称为late materialized。
  • 列组:允许多个列组成,将被存储为行格式列组。这样可以减少在查询时行重建成本。
  • 支持各种场景及数据格式:像OLAP式的交互式查询,顺序访问,随机存取等。

文件格式

一个CarbonData文件是由一系列被称为blocklet组成的;除了blocklet,还有许多其他的元信息,比如模式、偏移量以及索引信息等,这些元信息是存储在CarbonData文件中的footer里。每个blocklet又是由许多Data Chunks组成。Data Chunks里面的数据既可以按列或者行的形式存储;数据既可以是单独的一列也可以是许多列。文件中所有的blocklets都包含相同数量和类型的Data Chunks。

环境配置

预先准备:

jdk(7~8)
scala(2.10)
Thrift(0.9.3)
Maven(3.3~)
git,类unix系统
hadoop(2.6~)
spark(1.5~)
hive
IDEA or Eclipse

编译CarbonData

如果hadoop版本不是2.2.0或者2.7.2的需在pom.xml中指名hadoop版本,比如我用的hadoop版本是2.6的则在profiles中添加

1
2
3
4
5
6
<profile>
<id>hadoop-2.6.0</id>
<properties>
<hadoop.version>2.6.0</hadoop.version>
</properties>
</profile>

然后

1
2
3
git clone https://github.com/apache/incubator-carbondata.git carbondata
cd carbondata
mvn package -DskipTests -Pspark-1.6.1 -Phadoop-2.6.0

编译完成后,assembly/target/scala-2.10文件夹下应该有CarbonData的jar包

将此包复制到Spark目录下的lib文件夹

cp -r processing/carbonplugins ${SPARK_HOME}/carbondata/ 注:carbonplugins中应该有.kettle的隐藏文件夹

开发环境配置及测试

配置前确保正确安装了Hive

这里介绍IDEA的配置方式

在idea中安装scala的插件,新建一个工程CarbondataDemo,在工程中导入:编译好的CarbonData的jar包,spark目录lib文件夹下面的datanucleus开头的3个jar包及spark-assembly包.这样就导入了所需依赖.

新建一个Demo1.scala,在同级目录下拷入hive-site.xml,在Demo1.scala类中写入如下测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.apache.hadoop.hive
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.SparkContext._
import org.apache.spark.sql.CarbonContext
import java.io.File
import org.apache.hadoop.hive.conf.HiveConf
object Demo1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("CarbonDataDemo1").setMaster("local")
val sc = new SparkContext(conf) //创建SparkContext
val storePath = "hdfs://kexu:9000/usr/carbondata/store" //carbondata数据存放目录可以是hdfs或者本地目录
val cc = new CarbonContext(sc, storePath) //新建CarbonContext
cc.setConf("carbon.kettle.home","/home/kexu/work/spark1.6.2/carbondata/carbonplugins") //设置carbonplugins目录,此目录就是carbondata主目录/processing/carbonplugins,保证能正确指向kettle
cc.setConf("hive.metastore.warehouse.dir", "hdfs://kexu:9000/usr/hive/warehouse/")//此目录是hive的metastore目录
cc.setConf(HiveConf.ConfVars.HIVECHECKFILEFORMAT.varname, "false")
cc.sql("create table if not exists test (id string, name string) STORED BY 'org.apache.carbondata.format'") //创建test表,此语句没有指定database,默认default数据库,如果使用别的数据库则需先在hive中新建数据库按照[dbname.][tablename]的格式创建,test表有id,name两个字段,均是String类型,按照carbondata.format格式创建
}
}

执行代码后应该在storePath目录下的default数据库中发现新建的test表,test表下面会有Metadata(元数据存放)

大概目录结构如下

1
2
-rw-r--r-- 3 kexu supergroup 597 2016-07-20 15:40 /usr/carbondata/store/default/test/Metadata/schema
-rw-r--r-- 3 kexu supergroup 460 2016-07-20 16:09 /usr/carbondata/store/default/test/Metadata/tablestatus

在hive中default数据库也能查询到test表信息

表创建好后开始加载信息,首先创建一个csv文件,carbondata加载数据文件为csv格式

1
2
3
4
5
6
1,ww
2,ee
3,er
4,re
5,yu
6,wr

输入上面测试数据,数据间按照英文逗号分割,这是默认的分割符,如果使用其它分割符需在load语句后面用DELIMITER字段人为指定分割符

加载数据:

1
cc.sql("load data local inpath '/home/kexu/work/CarbonData/data/student.csv' into table test options('FILEHEADER'='id,name')")

加载成功后可以在/usr/carbondata/store/default/test/目录下发现新增Fact文件,目录结构如下:

1
2
3
4
5
drwxr-xr-x - kexu supergroup 0 2016-07-20 15:52 /usr/carbondata/store/default/test/Fact/Part0/Segment_0
drwxr-xr-x - kexu supergroup 0 2016-07-20 16:06 /usr/carbondata/store/default/test/Fact/Part0/Segment_1
drwxr-xr-x - kexu supergroup 0 2016-07-20 16:09 /usr/carbondata/store/default/test/Fact/Part0/Segment_2
-rw-r--r-- 3 kexu supergroup 757 2016-07-20 15:52 /usr/carbondata/store/default/test/Fact/Part0/Segment_0/0-1469001127000.carbonindex
-rw-r--r-- 3 kexu supergroup 1307 2016-07-20 15:52 /usr/carbondata/store/default/test/Fact/Part0/Segment_0/part-0-0-1469001127000.carb

Part为分区信息,Segment为分割文件,一般load一次文件生成一个Segment文件,后面的carbonindex为索引文件,carb为真实数据存放文件

查询数据:

1
cc.sql("select * from test").show()

如果能查询到数据则carbondata开发环境配置成功

持续更新中~~