CentOS 8 安装 Apache CarbonData 2.3.0 指南

CentOS 8 上从零搭建 Apache CarbonData 2.3.0 索引列式存储运行环境的完整流程,含 JDK 8 与 Maven 校验、carbondata-core 依赖工程构建、JVM 256-512MB 堆限制配置与 jps -v 生效验证、建表写入查询实测。

Apache CarbonDataCarbonData2026/10/14

CentOS 8 安装 Apache CarbonData 2.3.0 指南

目标:在 CentOS 8 上从零搭建 Apache CarbonData 2.3.0 索引列式存储运行环境,覆盖 JDK 8 与 Maven 校验、基于 Maven 的 carbondata-core 依赖工程构建、JVM 256-512MB 堆限制配置与 jps -v 生效验证,并完成建表、写入、查询的端到端实测。

一、环境信息

Apache CarbonData 是构建在 Hadoop/Spark 生态之上的索引列式存储格式,核心组件全部基于 Java 实现,运行需要 JDK 8 及以上版本,工程构建使用 Maven。本机已预装 JDK 与 Maven(服务器重启后仍可用),无需重复安装。

项目值
操作系统CentOS Linux release 8.4.2105
OpenJDK1.8.0_312(64 位 Server VM)
Apache Maven3.5.4(Red Hat 3.5.4-5)
Apache CarbonData2.3.0(carbondata-spark_3.1)
Apache Spark3.1.3(spark-sql_2.12 / spark-hive_2.12)
snappy-java1.1.2.6(按 CarbonData 期望版本强制对齐)
安装位置/opt/carbondata
运行用户root
Maven 仓库阿里云公共镜像(maven.aliyun.com/repository/public)

CarbonData 属于列式存储家族,与 ORC、Parquet 同属大数据列式格式,理解其与行式存储的差异是选型的前提:

💡 技术拓展:列式存储按列组织数据,同一列的相邻值连续存放,配合压缩与索引可大幅减少扫描量;行式存储(如 MySQL、PostgreSQL 的普通表)整行连续存放,适合点查与小事务。与 ORC、Parquet 相比,CarbonData 内置多维索引(Blocklet/Page 级 min-max、倒排索引、布隆索引)与 Segment 化增量写入、Compaction 合并机制,过滤下推更快,增量写入与更新场景更友好。

1.1 JDK 8 校验

java -version

实测回显:

openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)

同时确认编译工具链:

javac -version

实测回显:

javac 1.8.0_312

1.2 Maven 校验

mvn -version

实测回显:

Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre

验证结果:JDK 8 与 Maven 3.5.4 均可用,满足 CarbonData 2.3.0 的运行与构建要求。

二、创建工程并配置 Maven 依赖

2.1 创建工程目录

mkdir -p /opt/carbondata/demo/src/main/java/demo

2.2 配置 Maven 镜像加速

国内网络访问 Maven 中央仓库较慢,配置阿里云公共镜像,写入 /opt/carbondata/demo/maven-settings.xml:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <mirrors>
    <mirror>
      <id>aliyun-public</id>
      <name>Aliyun Public Repository</name>
      <url>https://maven.aliyun.com/repository/public</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
</settings>

2.3 编写 pom.xml

依赖三个关键包:spark-sql_2.12 与 spark-hive_2.12(3.1.3)提供 Spark SQL 运行环境,carbondata-spark_3.1(2.3.0)提供 CarbonData 集成实现。carbondata-spark 需排除其传递引入的 Spark 依赖,避免版本冲突。snappy-java 固定为 1.1.2.6,否则压缩器初始化会抛出 ClassCastException。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>demo</groupId>
  <artifactId>carbondata-demo</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <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>
  </dependencies>
</project>

2.4 编写建表写入查询 Demo

CarbonData 通过 Spark SQL 扩展接入,必须在 SparkSession 上声明 org.apache.spark.sql.CarbonExtensions 扩展,建表时指定 USING carbondata 并提供数据路径。写入采用 INSERT INTO VALUES,随后执行全表查询与分组聚合验证。

package demo;

import org.apache.spark.sql.SparkSession;

public class CarbonDemo {
    public static void main(String[] args) {
        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.sparkContext().setLogLevel("ERROR");

        spark.sql("DROP TABLE IF EXISTS carbon_table");
        spark.sql("CREATE TABLE IF NOT EXISTS carbon_table (id INT, name STRING, city STRING) "
                + "USING carbondata "
                + "OPTIONS('PATH'='file:///opt/carbondata/data/carbon_table')").show();
        spark.sql("INSERT INTO carbon_table VALUES "
                + "(1,'Jack','Beijing'),(2,'Lucy','Shanghai'),(3,'Tom','Beijing')").show();

        System.out.println("=== SELECT ALL ===");
        spark.sql("SELECT * FROM carbon_table ORDER BY id").show();
        System.out.println("=== GROUP BY city ===");
        spark.sql("SELECT city, COUNT(*) AS cnt FROM carbon_table GROUP BY city").show();

        spark.stop();
    }
}

三、Maven 构建

3.1 生成运行 Classpath

先构建工程,再用 dependency:build-classpath 把全部依赖 jar 路径导出到 /opt/carbondata/cp.txt,供 java 直接启动:

cd /opt/carbondata/demo
mvn -s maven-settings.xml package -DskipTests

实测回显:

[INFO] Building jar: /opt/carbondata/demo/target/carbondata-demo-1.0.jar
[INFO] BUILD SUCCESS
[INFO] Total time: 5.706 s

3.2 验证产物

ls -l /opt/carbondata/demo/target/carbondata-demo-1.0.jar

实测回显:

-rw-r--r-- 1 root root 3786 Oct 13 16:23 /opt/carbondata/demo/target/carbondata-demo-1.0.jar

验证结果:BUILD SUCCESS,编译产物与依赖 Classpath 就绪。

四、配置 JVM 内存并运行验证

4.1 JVM 参数位置与堆限制

CarbonData 是 Java 进程,堆内存通过启动命令中的 JVM 参数控制。本机可用内存有限,按 256-512MB 堆限制运行:-Xms256m 设定初始堆 256MB,-Xmx512m 限定最大堆 512MB。JVM 参数位置在 java 启动命令中、类名之前:

java -Djava.io.tmpdir=/opt/carbondata/tmp -Xms256m -Xmx512m \
  -cp "target/classes:$(cat /opt/carbondata/cp.txt)" demo.CarbonDemo

其中 -Djava.io.tmpdir 必须指向可执行目录 /opt/carbondata/tmp:系统 /tmp 挂载为 tmpfs 且带 noexec 属性,snappy 原生库解压到 /tmp 后会报 failed to map segment from shared object,改用 /opt/carbondata/tmp 后正常。

4.2 jps -v 验证 JVM 参数生效

后台启动 Demo,运行期间用 jps -v 核对 JVM 参数:

cd /opt/carbondata/demo
java -Djava.io.tmpdir=/opt/carbondata/tmp -Xms256m -Xmx512m \
  -cp "target/classes:$(cat /opt/carbondata/cp.txt)" demo.CarbonDemo > /opt/carbondata/run.log 2>&1 &
sleep 12
jps -v

实测回显:

1933 CarbonDemo -Djava.io.tmpdir=/opt/carbondata/tmp -Xms256m -Xmx512m

验证结果:jps -v 显示 CarbonDemo 进程携带 -Xms256m -Xmx512m,堆限制 512MB 生效。

五、端到端实测回显

5.1 建表与写入

运行日志中 CarbonData 审计(AUDIT)记录:

AUDIT {"time":"October 13, 2026 4:19:39 PM UTC","username":"root","opName":"CREATE TABLE","opStatus":"SUCCESS","opTime":"343 ms","table":"NA","extraInfo":{}}
AUDIT {"time":"October 13, 2026 4:19:42 PM UTC","username":"root","opName":"INSERT INTO","opStatus":"SUCCESS","opTime":"2169 ms","table":"default.carbon_table","extraInfo":{"SegmentId":"0","DataSize":"1.70KB","IndexSize":"1.06KB"}}

写入完成后返回新段(Segment)ID:

+----------+
|Segment ID|
+----------+
|         0|
+----------+

5.2 全表查询

+---+----+--------+
| id|name|    city|
+---+----+--------+
|  1|Jack| Beijing|
|  2|Lucy|Shanghai|
|  3| Tom| Beijing|
+---+----+--------+

5.3 分组聚合

+--------+---+
|    city|cnt|
+--------+---+
| Beijing|  2|
|Shanghai|  1|
+--------+---+

验证结果:建表、写入、查询、聚合全部成功,每次写入产生一个独立 Segment,聚合结果与数据一致。

六、落盘文件结构

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/LockFiles/compaction.lock
/opt/carbondata/data/carbon_table/LockFiles/tablestatus.lock
/opt/carbondata/data/carbon_table/LockFiles/meta.lock
/opt/carbondata/data/carbon_table/LockFiles/Segment_0.lock
/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/part-0-0_batchno0-0-0-1791908380958.snappy.carbondata
/opt/carbondata/data/carbon_table/Fact/Part0/Segment_0/0_1791908380958.carbonindexmerge

Fact 目录保存 .snappy.carbondata 列式数据文件与 .carbonindexmerge 索引合并文件,Metadata 目录保存段文件、表状态与 Schema,LockFiles 目录保存并发控制锁。

七、常见问题

7.1 snappy 原生库加载失败

现象:INSERT 时报 UnsatisfiedLinkError,failed to map segment from shared object。原因:/tmp 挂载为 noexec。解决:启动参数加 -Djava.io.tmpdir=/opt/carbondata/tmp。

7.2 表元数据跨会话丢失

现象:新建 SparkSession 后 SHOW TABLES 为空、SHOW SEGMENTS 报 Table not found。原因:未配置 Hive Metastore 时 Spark 内存 Catalog 不持久化表元数据。解决:建表、写入、段管理与查询放在同一会话内执行。此为 Spark 集成链在本环境的真实限制,生产环境应接入外部 Metastore。

7.3 Maven 依赖下载缓慢

现象:首次构建长时间停留在下载阶段。解决:使用 maven-settings.xml 中的阿里云镜像,或将已缓存的 /root/.m2/repository 保留复用。

八、参考链接