Spark SQL 查询引擎连接器

Delta Lake 与 Microsoft Azure Blob 存储

师成师成· 更新于 2026-09-29· 阅读 17 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

注册与配置

注册账号并登录

关于 Microsoft Azure 账号,请联系您的组织或以个人身份注册账号。详情请参阅 Microsoft Azure 官方网站。

创建存储容器

使用您的 Microsoft Azure 账号登录后,请按照以下步骤创建数据存储容器:

../../_images/azure_create_new_container.png

获取访问密钥

../../_images/azure_create_azure_access_key.png

部署 Spark

下载 Spark 安装包

从 Spark 官方网站 下载与您的环境相匹配的 spark 安装包,然后解压:`shell tar -xzvf spark-3.2.0-bin-hadoop3.2.tgz `

配置 Spark

进入 $SPARK_HOME/conf 目录并执行:

cp spark-defaults.conf.template spark-defaults.conf

将以下配置添加到 spark-defaults.conf 中,具体的个性化配置请参考您本地的实际配置:

spark.master                     spark://<YOUR_HOST>:7077
spark.sql.extensions             io.delta.sql.DeltaSparkSessionExtension
spark.sql.catalog.spark_catalog  org.apache.spark.sql.delta.catalog.DeltaCatalog

在 $SPARK_HOME/conf 目录下创建一个名为 core-site.xml 的新文件,并添加以下配置:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
    <name>fs.AbstractFileSystem.wasb.Impl</name>
    <value>org.apache.hadoop.fs.azure.Wasb</value>
 </property>
 <property>
  <name>fs.azure.account.key.YOUR_AZURE_ACCOUNT.blob.core.windows.net</name>
  <value>YOUR_AZURE_ACCOUNT_ACCESS_KEY</value>
 </property>
 <property>
    <name>fs.azure.block.blob.with.compaction.dir</name>
    <value>/hbase/WALs,/tmp/myblobfiles</value>
 </property>
 <property>
    <name>fs.azure</name>
    <value>org.apache.hadoop.fs.azure.NativeAzureFileSystem</value>
 </property>
<property>
    <name>fs.azure.enable.append.support</name>
    <value>true</value>
 </property>
</configuration>

将依赖项复制到 Spark

将 Delta Lake 和 Microsoft Azure 所需的 jar 包复制到 ./spark/jars 目录:

wget https://repo1.maven.org/maven2/io/delta/delta-core_2.12/1.0.0/delta-core_2.12-1.0.0.jar -O ./spark/jars/delta-core_2.12-1.0.0.jar
wget https://repo1.maven.org/maven2/com/microsoft/azure/azure-storage/8.6.6/azure-storage-8.6.6.jar -O ./spark/jars/azure-storage-8.6.6.jar
wget https://repo1.maven.org/maven2/com/azure/azure-storage-blob/12.14.2/azure-storage-blob-12.14.2.jar -O ./spark/jars/azure-storage-blob-12.14.2.jar
wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-azure/3.1.1/hadoop-azure-3.1.1.jar -O ./spark/jars/hadoop-azure-3.1.1.jar

启动 Spark Standalone 集群

./spark/sbin/start-master.sh -h <YOUR_HOST> -p 7077 --webui-port 9090
./spark/sbin/start-worker.sh spark://<YOUR_HOST>:7077

测试 Spark 与 Delta Lake 的连通性

启动 Spark shell:

./bin/spark-shell

生成一段随机数据并将其推送到 Delta Lake 中:

scala> val data = spark.range(1000, 2000)
scala> data.write.format("delta").mode("overwrite").save("wasbs://<YOUR_CONTAINER_NAME>@<YOUR_AZURE_ACCOUNT>.blob.core.windows.net/<YOUR_TABLE_NAME>")

之后,你可以在 Azure 网页界面上查看数据。例如,我的容器名称为 1000,表名称为 alexDemo20211127:

../../_images/azure_spark_connection_test_storage.png

你也可以通过从 Delta Lake 中读回数据来检查数据:

scala> val df=spark.read.format("delta").load("wasbs://<YOUR_CONTAINER_NAME>@<YOUR_AZURE_ACCOUNT>.blob.core.windows.net/<YOUR_TABLE_NAME>")
scala> df.show()

如果上述步骤没有问题,就说明 Spark 已经成功集成了 Delta Lake。

部署 Kyuubi

安装 Kyuubi

  1. 从 kyuubi 下载页面下载最新版本的 kyuubi。

  2. 解压

    tar -xzvf apache-kyuubi-1.9.1-bin.tgz

配置 Kyuubi

进入 ./kyuubi/conf 目录

cp kyuubi-defaults.conf.template kyuubi-defaults.conf
vim kyuubi-defaults.conf

添加以下内容:

spark.master                    spark://<YOUR_HOST>:7077
kyuubi.authentication           NONE
kyuubi.frontend.bind.host       <YOUR_HOST>
kyuubi.frontend.bind.port       10009
# If you use your own zk cluster, you need to configure your zk host port.
# kyuubi.ha.addresses    <YOUR_HOST>:2181

启动 Kyuubi

bin/kyuubi start

查看 kyuubi 日志,以检查 kyuubi 启动状态并找到 JDBC 连接 URL:

2021-11-26 17:49:50.235 INFO service.ThriftFrontendService: Starting and exposing JDBC connection at: jdbc:hive2://HOST:10009/
2021-11-26 17:49:50.265 INFO client.ServiceDiscovery: Created a /kyuubi/serviceUri=host:10009;version=1.3.1-incubating;sequence=0000000037 on ZooKeeper for KyuubiServer uri: host:10009
2021-11-26 17:49:50.267 INFO server.KyuubiServer: Service[KyuubiServer] is started.

通过上述日志即可获取 JDBC 连接 URL。

测试 Kyuubi 与 Delta Lake 的连通性

使用 $KYUUBI_HOME/bin/beeline 工具,

./bin//beeline -u 'jdbc:hive2://<YOUR_HOST>:10009/'

同时,你也可以在 Spark UI 上检查引擎是否正在运行:

../../_images/kyuubi_start_status_spark_UI.png

当引擎启动后,它会暴露一个 thrift 端点并注册到 ZooKeeper 中,Kyuubi 服务器可以从 ZooKeeper 获取连接信息并与引擎建立连接。因此,你可以在 ZooKeeper 路径 /kyuubi\_USER/anonymous 中查看注册详情。

使用 Kyuubi 示例处理 Delta Lake 数据

通过 SQL 操作 Delta Lake 数据:

创建表

-- Create or replace table with path
CREATE OR REPLACE TABLE delta.`wasbs://1000@azure_account.blob.core.windows.net/alexDemo20211129` (
  date DATE,
  eventId STRING,
  eventType STRING,
  data STRING)
USING DELTA
PARTITIONED BY (date);

插入数据

追加模式

INSERT INTO delta.`wasbs://1000@azure_account.blob.core.windows.net/alexDemo20211129` (
    date,
    eventId,
    eventType,
    data)
VALUES
    (now(),'001','test','Hello World!'),
    (now(),'002','test','Hello World!'),
    (now(),'003','test','Hello World!');

结果:

+-------------+----------+------------+---------------+
|    date     | eventId  | eventType  |     data      |
+-------------+----------+------------+---------------+
| 2021-11-29  | 001      | test       | Hello World!  |
| 2021-11-29  | 003      | test       | Hello World!  |
| 2021-11-29  | 002      | test       | Hello World!  |
+-------------+----------+------------+---------------+

覆盖模式

INSERT OVERWRITE TABLE delta.`wasbs://1000@azure_account.blob.core.windows.net/alexDemo20211129`(
    date,
    eventId,
    eventType,
    data)
VALUES
(now(),'001','test','hello kyuubi'),
(now(),'002','test','hello kyuubi');

结果:

+-------------+----------+------------+---------------+
|    date     | eventId  | eventType  |     data      |
+-------------+----------+------------+---------------+
| 2021-11-29  | 002      | test       | hello kyuubi  |
| 2021-11-29  | 001      | test       | hello kyuubi  |
+-------------+----------+------------+---------------+

删除表数据

DELETE FROM
   delta.`wasbs://1000@azure_account.blob.core.windows.net/alexDemo20211129`
WHERE eventId = 002;

结果:

+-------------+----------+------------+---------------+
|    date     | eventId  | eventType  |     data      |
+-------------+----------+------------+---------------+
| 2021-11-29  | 001      | test       | hello kyuubi  |
+-------------+----------+------------+---------------+

更新表数据

UPDATE
    delta.`wasbs://1000@azure_account.blob.core.windows.net/alexDemo20211129`
SET data = 'This is a test for update data.'
WHERE eventId = 001;

结果:

+-------------+----------+------------+----------------------------------+
|    date     | eventId  | eventType  |               data               |
+-------------+----------+------------+----------------------------------+
| 2021-11-29  | 001      | test       | This is a test for update data.  |
+-------------+----------+------------+----------------------------------+

查询表数据

SELECT *
FROM
    delta.`wasbs://1000@azure_account.blob.core.windows.net/alexDemo20211129`;

结果:

+-------------+----------+------------+----------------------------------+
|    date     | eventId  | eventType  |               data               |
+-------------+----------+------------+----------------------------------+
| 2021-11-29  | 001      | test       | This is a test for update data.  |
+-------------+----------+------------+----------------------------------+

评论

登录后参与评论

正在加载评论…