Apache CarbonData 2.3.0 快速入门与集成示例
Apache CarbonData 2.3.0 快速入门与 Spark 集成示例,含依赖引入、SparkSession 扩展配置、建表写入查询、段管理与 Compaction 完整流程,附实测回显与集成链限制说明。
Apache CarbonData 2.3.0 快速入门与集成示例
目标:以最快路径体验 Apache CarbonData 2.3.0,覆盖 Maven 依赖引入、SparkSession 扩展配置、建表、写入、查询、段管理与 Compaction,全部命令附实测回显,并如实说明本环境下的 Spark 集成链限制。
一、CarbonData 是什么
Apache CarbonData 是 Apache 软件基金会的索引列式存储格式,与 Spark SQL 深度集成,一张 CarbonData 表对应一批 .carbondata 列式数据文件、carbonindexmerge 索引文件与段(Segment)元数据。核心特点:
- 列式布局 + 多重索引:Blocklet/Page 级 min-max 索引、倒排索引、布隆索引,过滤条件可下推到文件与块级
- 段(Segment)模型:每次写入产生一个段,Compaction 将多个段合并,兼顾写入效率与查询性能
- 增量更新支持:支持 UPDATE/DELETE(依赖增量文件与合并)
- 统一 SQL:通过 Spark SQL 扩展接入,语法与 Spark 表一致
CarbonData 是列式存储家族成员,与 ORC、Parquet 同属大数据列式格式:
💡 技术拓展:列式存储按列组织数据,同一列的相邻值连续存放,配合压缩与索引可大幅减少扫描量;行式存储(如 MySQL、PostgreSQL 的普通表)整行连续存放,适合点查与小事务。与 ORC、Parquet 相比,CarbonData 内置多维索引(Blocklet/Page 级 min-max、倒排索引、布隆索引)与 Segment 化增量写入、Compaction 合并机制,过滤下推更快,增量写入与更新场景更友好。
二、环境与依赖引入
本机实测环境:CentOS 8.4(JDK 1.8.0_312)、Spark 3.1.3、CarbonData 2.3.0、Maven 3.5.4,数据目录 /opt/carbondata。
在 pom.xml 中引入三个依赖包,snappy-java 固定为 1.1.2.6:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.carbondata</groupId>
<artifactId>carbondata-spark_3.1</artifactId>
<version>2.3.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.spark</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.1.2.6</version>
</dependency>
三、SparkSession 集成配置
创建 SparkSession 时必须声明 CarbonData 扩展,否则 USING carbondata 建表不可用:
SparkSession spark = SparkSession.builder()
.master("local[2]")
.appName("CarbonDemo")
.config("spark.sql.extensions", "org.apache.spark.sql.CarbonExtensions")
.config("spark.sql.warehouse.dir", "file:///opt/carbondata/warehouse")
.config("spark.driver.host", "localhost")
.getOrCreate();
关键配置项:
| 配置项 | 值 | 作用 |
|---|---|---|
| spark.sql.extensions | org.apache.spark.sql.CarbonExtensions | 注册 CarbonData SQL 扩展(必须) |
| spark.sql.warehouse.dir | file:///opt/carbondata/warehouse | 表元数据目录 |
| spark.driver.host | localhost | local 模式下 driver 绑定地址 |
四、建表
4.1 建表语句
CREATE TABLE IF NOT EXISTS carbon_table (id INT, name STRING, city STRING)
USING carbondata
OPTIONS('PATH'='file:///opt/carbondata/data/carbon_table')
实测回显(审计日志):
AUDIT {"opName":"CREATE TABLE","opStatus":"SUCCESS","opTime":"343 ms","table":"NA","extraInfo":{}}
建表时可指定排序列、字典等属性,例如 OPTIONS 追加 'sort_columns'='city'。未指定时按全局默认值生效。
4.2 验证建表结果
find /opt/carbondata/data/carbon_table -type f
实测回显:
/opt/carbondata/data/carbon_table/Metadata/segments/0_1791908380958.segment
/opt/carbondata/data/carbon_table/Metadata/tablestatus
/opt/carbondata/data/carbon_table/Metadata/schema
/opt/carbondata/data/carbon_table/Fact/Part0/Segment_0/part-0-1_batchno0-0-0-1791908380958.snappy.carbondata
/opt/carbondata/data/carbon_table/Fact/Part0/Segment_0/0_1791908380958.carbonindexmerge
五、写入数据
5.1 INSERT INTO VALUES
INSERT INTO carbon_table VALUES
(1,'Jack','Beijing'),(2,'Lucy','Shanghai'),(3,'Tom','Beijing')
实测回显:
AUDIT {"opName":"INSERT INTO","opStatus":"SUCCESS","opTime":"2169 ms","table":"default.carbon_table","extraInfo":{"SegmentId":"0","DataSize":"1.70KB","IndexSize":"1.06KB"}}
+----------+
|Segment ID|
+----------+
| 0|
+----------+
每次写入产生一个独立段(Segment),段内文件按 batchno 组织。生产环境大批量数据建议使用 LOAD DATA(CSV)或 COPY INTO,两者均以段为单位落盘。
5.2 段文件落盘
ls -l /opt/carbondata/data/carbon_table/Fact/Part0/Segment_0/
实测回显:
part-0-0_batchno0-0-0-1791908380958.snappy.carbondata
part-0-1_batchno0-0-0-1791908380958.snappy.carbondata
0_1791908380958.carbonindexmerge
六、查询
6.1 全表查询
SELECT * FROM carbon_table ORDER BY id
实测回显:
+---+----+--------+
| id|name| city|
+---+----+--------+
| 1|Jack| Beijing|
| 2|Lucy|Shanghai|
| 3| Tom| Beijing|
+---+----+--------+
6.2 过滤查询(索引下推)
SELECT * FROM carbon_table WHERE city = 'Beijing'
实测回显:
+---+----+-------+
| id|name| city|
+---+----+-------+
| 3| Tom|Beijing|
| 1|Jack|Beijing|
+---+----+-------+
city 列在写入时已生成 min-max 与局部字典索引,过滤在扫描阶段直接裁剪不匹配的块。
6.3 分组聚合
SELECT city, COUNT(*) AS cnt FROM carbon_table GROUP BY city
实测回显:
+--------+---+
| city|cnt|
+--------+---+
| Beijing| 2|
|Shanghai| 1|
+--------+---+
七、段管理与 Compaction
7.1 查看段信息
SHOW SEGMENTS FOR TABLE carbon_table LIMIT 10
实测回显:
+---+-------+--------------------+---------------+---------+---------+----------+-----------+
| ID| Status| Load Start Time|Load Time Taken|Partition|Data Size|Index Size|File Format|
+---+-------+--------------------+---------------+---------+---------+----------+-----------+
| 0|Success|2026-10-13 16:23:26.0| 1.781S| NA| 1.71KB| 1.06KB|columnar_v3|
+---+-------+--------------------+---------------+---------+---------+----------+-----------+
7.2 查看列信息
SHOW COLUMNS FROM carbon_table
实测回显:
+--------+
|col_name|
+--------+
| id|
| name|
| city|
+--------+
7.3 Minor Compaction
ALTER TABLE carbon_table COMPACT 'MINOR'
实测回显:
AUDIT {"opName":"ALTER TABLE COMPACTION MINOR","opStatus":"SUCCESS","opTime":"41 ms","table":"default.carbon_table","extraInfo":{}}
验证结果:段信息、列信息与 Compaction 均执行成功,数据量小且仅一个段时合并仅更新段元数据,不触发物理重写。
八、集成链限制说明
本环境通过 Maven 引入 Spark 3.1.3 与 carbondata-spark_3.1 以 local 模式运行,Spark 集成链存在以下真实限制,实施前需评估:
- 未配置 Hive Metastore 时,Spark 使用内存 Catalog,表元数据不跨会话持久化。新建 SparkSession 后 SHOW TABLES 为空,SHOW SEGMENTS 报 Table not found,建表、写入、段管理与查询必须放在同一会话内执行
- 依赖 carbondata-spark_3.1 与 Spark 3.1.x 绑定,升级 Spark 大版本需更换对应集成包
- snappy-java 版本必须与 CarbonData 期望版本对齐(1.1.2.6),否则压缩器初始化异常
- 生产集群部署应接入外部 Metastore 并使用 spark-submit 提交,local 模式仅用于功能验证
九、参考链接
- Apache CarbonData 官方文档:https://carbondata.apache.org/
- CarbonData Spark 快速入门:https://carbondata.apache.org/spark-quick-start-guide.html
- CarbonData 建表 DDL 语法:https://carbondata.apache.org/create-table.html
- CarbonData 数据管理:https://carbondata.apache.org/data-management-on-carbondata.html
- CarbonData 加载数据文档:https://carbondata.apache.org/load-data-into-carbondata.html