全部產品
Search
文件中心

Tablestore:Realtime Compute

更新時間:May 23, 2026

本文介紹在使用Spark計算引擎訪問Table Store時,如何通過DataFrame編程方式對錶格儲存中的資料進行Realtime Compute,並分別在本地和叢集環境中進行運行調試。

準備工作

  • 在Table Store中建立資料表,並建立資料通道、寫入資料。詳情請參見寬表模型快速入門通道服務快速入門

    說明

    資料表order_source_stream_view的結構及樣本資料,請參見附錄:樣本資料表

  • 為阿里雲帳號或具有Table Store存取權限的RAM使用者建立AccessKey

  • 搭建Java開發環境。

    本文以Windows環境、JDK 1.8IntelliJ IDEA 2024.1.2 (Community Edition)Apache Maven為例介紹。

操作步驟

步驟一:下載專案源碼

通過Git下載範例專案。

git clone https://github.com/aliyun/tablestore-examples.git

如果因為網路問題無法下載,您也可以直接下載tablestore-examples-master.zip

步驟二:更新Maven依賴

  1. 進入tablestore-spark-demo根目錄。

    說明

    推薦您閱讀tablestore-spark-demo根目錄下的README.md文檔,全面瞭解專案資訊。

  2. 執行以下命令,安裝emr-tablestore-2.2.0-SNAPSHOT.jar到本地Maven倉庫。

    mvn install:install-file -Dfile="libs/emr-tablestore-2.2.0-SNAPSHOT.jar" -DartifactId=emr-tablestore -DgroupId="com.aliyun.emr" -Dversion="2.2.0-SNAPSHOT" -Dpackaging=jar -DgeneratePom=true

步驟三:(可選)修改範例程式碼

核心代碼修改說明

此處以StructuredTableStoreAggSQLSample為例,對該範例程式碼的核心部分進行如下說明。

代碼塊

描述

val ordersDF = sparkSession.readStream
  .format("tablestore")
  .option("instance.name", instanceName)
  .option("table.name", tableName)
  .option("tunnel.id", tunnelId)
  .option("endpoint", endpoint)
  .option("access.key.id", accessKeyId)
  .option("access.key.secret", accessKeySecret)
  .option("maxoffsetsperchannel", maxOffsetsPerChannel) // default 10000
  .option("catalog", dataCatalog)
  .load()
  .createTempView("order_source_stream_view")

通過Spark Structured Streaming,從Table Store中讀取流式資料,並將其載入為一個流式DataFrame,同時註冊為臨時視圖order_source_stream_view

  • format("tablestore")表示使用ServiceLoader方式載入Spark Tablestore connector。具體配置,請參見META-INF.services目錄。

  • instanceNametableNametunnelIdendpointaccessKeyIdaccessKeySecret分別表示Table Store的執行個體名稱、資料表名稱、通道ID、執行個體endpoint、阿里雲帳號或RAM使用者的AccessKey ID和AccessKey Secret。

  • catalog是一個JSON串,用於描述Table Store中的Schema資訊。

  • maxoffsetsperchannel表示每一個mini-batch中每一個channel(分區)最多讀取的資料量,預設值為10000。

val dataCatalog: String =
  s"""
     |{"columns": {
     |    "UserId": {"type":"string"},
     |    "OrderId": {"type":"string"},
     |    "price": {"type":"double"},
     |    "timestamp": {"type":"long"}
     | }
     |}""".stripMargin

定義了一個JSON字串dataCatalog,用於描述Table Store中的Schema資訊。每個欄位的名稱及其資料類型均以索引值對的形式呈現。

val aggDF = sparkSession.sql(
  "SELECT CAST(window.start AS String) AS begin, CAST(window.end AS String) AS end, count(*) AS count, " +
    "CAST(sum(price) AS Double) AS totalPrice FROM order_source_stream_view " +
    "GROUP BY window(to_timestamp(timestamp / 1000), '30 seconds')")
    
val query = aggDF.writeStream
  .outputMode("complete")
  .format("console")
  .option("truncate", value = false)
  .option("checkpointLocation", checkpointLocation)
  .option("triggerInterval", 10000) // custom
  .start()

通過Spark SQL對流式資料進行時間視窗彙總分析,並將結果輸出到控制台。

  • SQL查詢部分

    • 時間視窗:基於timestamp欄位,將資料劃分為30秒的時間視窗。

    • 彙總操作:統計每個視窗內的記錄總數,並計算每個視窗內price欄位的總和。

  • 配置流式查詢的輸出方式

    • outputMode("complete")表示指定輸出模式為complete,即每次觸發時輸出完整的彙總結果。

    • format("console"):表示將結果輸出到控制台。

    • option("truncate", value = false)表示禁用欄位截斷,確保完整顯示欄位值。

    • option("checkpointLocation", checkpointLocation)表示設定檢查點目錄,用於容錯和恢複。

    • option("triggerInterval", 10000)表示設定觸發間隔為10秒,即每10秒執行一次彙總操作。

    • start()表示啟動流式查詢。

步驟四:運行調試

您可以在本地或者通過Spark叢集進行運行調試。此處以StructuredTableStoreAggSQLSample為例介紹調試過程。

本地開發環境

以在Windows作業系統上使用IntelliJ IDEA為例,為您介紹如何調試。

  1. 安裝Scala外掛程式。

    IntelliJ IDEA預設不支援Scala,需要您手動安裝Scala外掛程式。

  2. 安裝winutils.exe(本文使用winutils 3.3.6)。

    僅在Windows環境下運行Spark時,還需安裝 winutils.exe以解決相容性問題。您可以通過github專案首頁進行下載。

  3. 在Scala程式TableStoreBatchSample上按右鍵,選擇Modify Run Configuration,開啟Edit Run Configuration彈窗。

    說明

    由於作業系統及IntelliJ IDEA的版本不同,實際操作可能存在一些細微差異。

    1. Program arguments欄中,依次配置執行個體名稱、資料表名稱、資料通道ID、AccessKey ID、AccessKey Secret、執行個體Endpoint參數和MaxOffsetsPerChannel。

      myinstance order_source_stream_view 8f6a****-****-****-****-************ LTAI********************** DByT************************** https://myinstance.cn-hangzhou.ots.aliyuncs.com 10000
    2. 單擊Modify options,勾選Add dependencies with "provided" scope to classpath選項,並單擊OK。

  4. 運行Scala程式。

    運行結束後,將列印結果到控制台。

    +-------------------+-------------------+-----+-----------------+
    |begin              |end                |count|totalPrice       |
    +-------------------+-------------------+-----+-----------------+
    |2025-04-16 11:13:30|2025-04-16 11:14:00|1    |2547.0           |
    |2025-04-16 11:13:00|2025-04-16 11:13:30|3    |984.1999999999999|
    |2025-04-16 11:12:30|2025-04-16 11:13:00|1    |29.6             |
    +-------------------+-------------------+-----+-----------------+

Spark叢集環境

重要

在進行調試之前,請確保已構建Spark叢集,並且該叢集環境中的Spark版本與範例專案的Spark版本一致。否則,可能會因版本不相容而導致運行錯誤。

spark-submit方式為例說明。範例程式碼中的master預設為local[*],在Spark叢集上運行時可以去掉,使用spark-submit參數傳入。

  1. 執行命令mvn -U clean package對專案進行打包,JAR包的路徑為target/tablestore-spark-demo-1.0-SNAPSHOT-jar-with-dependencies.jar

  2. 將JAR包上傳到Spark叢集的Driver節點,並使用spark-submit提交任務。

    spark-submit --class com.aliyun.tablestore.spark.demo.streaming.StructuredTableStoreAggSQLSample --master yarn tablestore-spark-demo-1.0-SNAPSHOT-jar-with-dependencies.jar myinstance order_source_stream_view 8f6a****-****-****-****-************ LTAI********************** DByT************************** https://myinstance.cn-hangzhou.ots.aliyuncs.com 10000

附錄:樣本資料表

以下是order_source_stream_view表的結構及樣本資料。

樣本表結構

欄位名稱

類型

描述

pk

long

主鍵。

UserId

string

使用者ID。

OrderId

string

訂單ID。

price

double

訂單金額。

timestamp

long

時間戳記。

樣本資料

pk(主鍵)

UserId

OrderId

price

timestamp

1

user_A

00002664-9d8b-441b-bad7-845202f3b142

29.6

1744773175362

2

user_A

9d8b7a6c-5e4f-4321-8765-0a9b8c7d6e5f

785.3

1744773190240

3

user_A

c3d4e5f6-7a8b-4901-8c9d-0a1b2c3d4e5f

187

1744773195579

4

user_B

f1e2d3c4-b5a6-4789-90ab-123cdef45678

11.9

1744773203345

5

user_B

e2f3a4b5-c6d7-4890-9abc-def012345678

2547

1744773227789