【Spark 实战】基于spark3.4.2+iceberg1.6.1搭建本地调试环境

基于spark3.4.2+iceberg1.6.1搭建本地调试环境

文章目录

环境准备

  • IntelliJ IDEA 2024.1.2 (Ultimate Edition)
  • JDK 1.8
  • Spark 3.4.2
  • Iceberg 1.6.1



使用maven构建sparksql

pom文件

xml 复制代码
<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>com.donny.demo</groupId>
    <artifactId>iceberg-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>iceberg-demo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spark.version>3.4.2</spark.version>
        <iceberg.version>1.6.1</iceberg.version>
        <parquet.version>1.13.1</parquet.version>
        <avro.version>1.11.3</avro.version>
        <parquet.hadoop.bundle.version>1.8.1</parquet.hadoop.bundle.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.avro</groupId>
                    <artifactId>avro</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.parquet</groupId>
                    <artifactId>parquet-column</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.parquet</groupId>
                    <artifactId>parquet-hadoop-bundle</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.parquet</groupId>
                    <artifactId>parquet-hadoop</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.iceberg</groupId>
            <artifactId>iceberg-core</artifactId>
            <version>${iceberg.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.iceberg</groupId>
            <artifactId>iceberg-spark-3.4_2.12</artifactId>
            <version>${iceberg.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.iceberg</groupId>
            <artifactId>iceberg-spark-extensions-3.4_2.12</artifactId>
            <version>${iceberg.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.antlr</groupId>
                    <artifactId>antlr4</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.antlr</groupId>
                    <artifactId>antlr4-runtime</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.parquet</groupId>
            <artifactId>parquet-column</artifactId>
            <version>${parquet.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.parquet</groupId>
            <artifactId>parquet-hadoop</artifactId>
            <version>${parquet.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.parquet</groupId>
            <artifactId>parquet-hadoop-bundle</artifactId>
            <version>${parquet.hadoop.bundle.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro</artifactId>
            <version>${avro.version}</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

在 idea 中 直接使用iceberg 生成好的 runtime jar,无法attach 不上 iceberg 的源码,为了解决这个问题把maven 依赖改成上面的pom文件上的iceberg依赖。

xml 复制代码
<dependency>
  <groupId>org.apache.iceberg</groupId>
  <artifactId>iceberg-spark-runtime-3.4_2.12</artifactId>
  <version>1.6.1</version>
</dependency>

编辑SparkSQL简单任务

  1. 指定了 catalog 类型为 hadoop。可以方便简单的本地调试。
  2. 创建非分区的iceberg原生表
  3. 插入数据
  4. 查询数据(展示数据)
java 复制代码
package com.donny.demo;

import org.apache.iceberg.expressions.Expressions;
import org.apache.iceberg.spark.Spark3Util;
import org.apache.iceberg.spark.actions.SparkActions;
import org.apache.spark.api.java.function.FilterFunction;
import org.apache.spark.sql.AnalysisException;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.catalog.Table;

import java.util.Objects;

/**
 * @author 1792998761@qq.com
 * @version 1.0
 * @since 2024年09月26日
 */
public class IcebergSparkDemo {
    public static void main(String[] args) throws AnalysisException {

        SparkSession spark = SparkSession
                .builder()
                .master("local")
                .appName("Iceberg spark example")
                .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
                .config("spark.sql.catalog.local", "org.apache.iceberg.spark.SparkCatalog")
                .config("spark.sql.catalog.local.type", "hadoop") //指定catalog 类型
                .config("spark.sql.catalog.local.warehouse", "iceberg_warehouse")
                .getOrCreate();

        spark.sql("create database iceberg_db");
        spark.sql("CREATE TABLE local.iceberg_db.table (id bigint, data string) USING iceberg ");
        spark.sql("INSERT INTO local.iceberg_db.table VALUES (1, 'a'), (2, 'b'), (3, 'c')");
        Dataset<Row> result = spark.sql("select * from local.iceberg_db.table order by data");
        result.show();

        spark.close();
    }
}

附录A iceberg术语

  • Schema -- 表中的字段名称和类型
  • Partition spec -- 定义如何从数据字段导出分区值。
  • Partition tuple -- 分区元组是存储在每个数据文件中的分区数据的元组或结构体
  • Snapshot -- 表在某个时间点的状态,包括所有数据文件的集合。
  • Snapshot log -- 快照日志是记录表当前快照随时间变化情况的元数据日志。该日志是一个时间戳和ID对的列表:当前快照发生变化的时间和当前快照发生变化的ID。
  • Manifest list -- 列出清单文件的文件;每个快照一个。
  • Manifest -- 列出数据或删除文件的文件;快照的子集。
  • Data file -- 包含表行的文件。
  • Delete file -- 对表格中按位置或数据值删除的行进行编码的文件。

参考

Iceberg 源码阅读(一) 搭建本地调试环境

相关推荐
索迪迈科技1 小时前
Flink Task线程处理模型:Mailbox
java·大数据·开发语言·数据结构·算法·flink
zzhongcy2 小时前
分布式存储:RustFS与MinIO全面对比
分布式
一叶飘零_sweeeet6 小时前
从手写 Redis 分布式锁到精通 Redisson:分布式系统的并发控制终极指南
redis·分布式·redisson
深空数字孪生7 小时前
储能调峰新实践:智慧能源平台如何保障风电消纳与电网稳定?
大数据·人工智能·物联网
百胜软件@百胜软件7 小时前
胜券POS:打造智能移动终端,让零售智慧运营触手可及
大数据
摩羯座-185690305948 小时前
Python数据可视化基础:使用Matplotlib绘制图表
大数据·python·信息可视化·matplotlib
在未来等你8 小时前
Kafka面试精讲 Day 13:故障检测与自动恢复
大数据·分布式·面试·kafka·消息队列
jiedaodezhuti8 小时前
Flink通讯超时问题深度解析:Akka AskTimeoutException解决方案
大数据·flink
庄小焱8 小时前
大数据存储域——Kafka实战经验总结
大数据·kafka·大数据存储域
cui_win9 小时前
基于Golang + vue3 开发的 kafka 多集群管理
分布式·kafka