全部產品
Search
文件中心

DataWorks:Notebook 進階開發

更新時間:Mar 01, 2026

本文介紹如何通過代碼複用、資料掛載、參數管理等工程化手段提升開發效率,以及串連 MaxCompute Spark、EMR Serverless Spark 及 AnalyticDB for Spark 等多種計算引擎的實踐技巧與調試方法。

說明

推薦您優先閱讀Notebook 基礎開發

理解開發與生產環境的差異

DataWorks Notebook 的核心定位是可被調度執行的開發和分析工具。這意味著它存在兩種運行環境:

  • 開發環境:在Data Studio的Notebook 節點編輯頁面,直接點擊運行儲存格,代碼在個人開發環境執行個體中執行。此環境為快速驗證、調試代碼邏輯而設計。

  • 生產環境:Notebook 節點被提交並發布後,通過周期調度或補資料等觸發執行。代碼在一個獨立的、臨時的任務執行個體中運行。此環境為穩定、可靠地執行生產任務而設計。

這兩種環境在功能支援上存在顯著差異,提前理解這些差異是高效開發的關鍵。

開發與生產環境能力差異速查表

功能點

開發環境(運行儲存格)

生產環境(周期調度/補資料等)

引用專案資源 (.py)

  • 首次引用:自動下載並生效。

  • 更新後:您需要點擊工具列的重啟按鈕,以重新載入已更新的 .py 模組。

    重要

    需在Data Studio設定中,修改資源衝突處理策略Dataworks › Notebook › Resource Reference: Download StrategyautoOverwrite。

自動生效。

讀寫資料集 (OSS/NAS)

需在個人開發環境中掛載資料集。

需在調度配置中掛載資料集。

引用工作空間參數 (${...})

生效,在代碼執行前自動進行文本替換。

生效,在任務執行前自動進行文本替換。

Spark 會話管理

Spark會話的預設閑置釋放時間為2小時,2小時內無新的代碼執行將自動釋放。

任務執行個體級短會話,隨任務執行個體執行而自動建立與銷毀。

在生產環境複用代碼與資料

引用專案資源(.py 檔案)

將通用的函數或類封裝在獨立的 .py 檔案中,通過##@resource_reference{"自訂名.py"}引用MaxCompute資源的方式,實現代碼的模組化與複用,提升代碼的可維護性。

  1. 建立並發布 Python 資源

    1. 在 DataWorks Data Studio左側導覽列單擊image,進入資源管理

    2. 在資源管理分類樹下,按右鍵目標目錄或單擊右上方的 + ,選擇建立資源 > MaxCompute Python,命名為 my_utils.py

    3. 檔案內容處,點擊線上編輯,將您調試好的工具函數代碼粘貼到代碼編輯框並儲存

      # my_utils.py
      def greet(name):
          return f"Hello, {name} from resource file!"
    4. 單擊工具列中的儲存,然後發布該資源,使其對開發和生產任務可見

  2. 在 Notebook 中引用資源

    在 Notebook 的Python 儲存格第一行,使用 ##@resource_reference 文法引用發行的資源。

    ##@resource_reference{"my_utils.py"}
    # 如果資源在目錄下,比如 my_folder/my_utils.py,也是通過##@resource_reference{"my_utils.py"},無需帶目錄名稱。
    from my_utils import greet
    
    message = greet('DataWorks')
    print(message)
  3. 開發環境調試運行

    運行Python儲存格,將列印如下結果:

    Hello, DataWorks from resource file!
    重要

    在開發環境調試運行時,如果識別到代碼中包含##@resource_reference,系統將會把資源管理中的目標檔案自動下載至個人目錄的workspace/_dataworks/resource_references路徑中,從而進行目標檔案的引用。

    若報錯ModuleNotFoundError,點擊編輯器上方工具列的重啟按鈕重新載入資源後再重試。

  4. 發布至生產環境並驗證

    儲存發布此 Notebook 節點後,前往營運中心 > 周期任務單擊測試運行。任務成功後,您將在日誌中看到輸出 Hello, DataWorks from resource file!

    重要

    若報錯There is no file with id ...,請先將Python資源發布至生產環境。

更多操作,請參見MaxCompute資源與函數

讀寫資料集(OSS/NAS)

在 Notebook 任務運行時,方便地讀寫儲存在 OSS 或 NAS 上的大規模檔案資料。

開發環境調試

  1. 掛載資料集:進入個人開發環境詳情頁,在儲存配置 > 資料集中配置資料集。

  2. 在代碼中訪問:資料集將被掛載到個人開發環境的掛載路徑下,在代碼中直接讀寫該路徑。

    # 假設已在個人開發環境設定了掛載路徑為/mnt/data/dataset的資料集
    import pandas as pd
    
    # 直接使用掛載路徑
    file_path = '/mnt/data/dataset/testfile.csv'
    df = pd.read_csv(file_path)
    
    # 使用 PyODPS 將資料寫入 MaxCompute
    o = %odps
    o.write_table('mc_test_table', df, overwrite=True)
    print(f"成功將資料寫入 MaxCompute 表 mc_test_table。")

生產環境部署

  1. 掛載資料集:在 Notebook 節點編輯頁面的右側導覽列,進入調度配置 > 調度策略,添加上述資料集。

  2. 在代碼中訪問:提交發布之後,資料集將被掛載到生產環境的掛載路徑下,在代碼中直接讀寫該路徑。

    # 假設已在個人開發環境設定了掛載路徑為/mnt/data/dataset的資料集
    import pandas as pd
    
    # 直接使用掛載路徑
    file_path = '/mnt/data/dataset/testfile.csv'
    df = pd.read_csv(file_path)
    
    # 使用 PyODPS 將資料寫入 MaxCompute
    o = %odps
    o.write_table('mc_test_table', df, overwrite=True)
    print(f"成功將資料寫入 MaxCompute 表 mc_test_table。")
更多操作,請參見在個人開發環境中使用資料集

引用工作空間參數

重要

僅支援DataWorks專業版及以上。

DataWorks 在已有調度參數的基礎上引入工作空間參數,主要是為瞭解決跨任務、跨節點的全域配置複用與環境隔離問題。可在SQL儲存格和Python儲存格內以${workspace.param}格式來引用工作空間參數,其中param是您建立的工作空間參數名稱。

1、建立工作空間參數:使用前,需前往 DataWorks 營運中心 > 調度設定 > 工作空間參數 頁面建立所需參數。

2、引用工作空間參數

  • SQL儲存格參照工作空間參數。

    SELECT '${workspace.param}';

    查詢工作空間參數,運行成功後,將列印輸出工作空間參數的具體賦值。

  • Python儲存格參照工作空間參數。

    print('${workspace.param}')

    輸出工作空間參數,運行成功後,將列印輸出工作空間參數的具體賦值。

更多詳情,請參見使用工作空間參數

Magic Command與計算引擎互動

Magic Command 是以 %%% 開頭的特殊命令,用於簡化Python儲存格與各類計算資源的互動。

串連 MaxCompute

說明

在建立MaxCompute計算資源串連前,請確保已綁定MaxCompute計算資源

  • %odps:擷取 PyODPS 入口對象

    此命令返回一個與當前MaxCompute專案綁定、已認證的 PyODPS 對象,避免在代碼中寫入程式碼 AccessKey,是與 MaxCompute 互動的推薦方式。

    1. 使用Magic Command建立MaxCompute串連。 輸入%odps,右下角會出現MaxCompute的計算資源選取器入口(並自動選擇計算資源)。點擊右下角的MaxCompute專案名稱,可更換MaxCompute專案。

      o=%odps 
    2. 使用擷取到的MaxCompute計算資源運行PyODPS指令碼。

      例如,擷取當前專案下的所有表:

      with o.execute_sql('show tables').open_reader() as reader:
          print(reader.raw)
  • %maxframe:建立 MaxFrame 串連

    此命令用於建立 MaxFrame 會話,為 MaxCompute 提供類似 Pandas 的分布式資料處理能力。

    # 串連並訪問MaxCompute MaxFrame Session
    mf_session = %maxframe
    
    df = mf_session.read_odps_table('your_mc_table')
    print(df.head())
    
    # 開發調試結束後,應手動銷毀會話以釋放資源
    mf_session.destroy()

串連 Spark 計算資源

DataWorks Notebook 支援串連多種 Spark 引擎。不同引擎在串連方式、執行內容和資源管理上存在差異。

重要

同一個Notebook節點,僅支援使用Magic Command串連一種計算資源。

引擎對比

特性

MaxCompute Spark

EMR Serverless Spark

AnalyticDB for Spark

串連命令

%maxcompute_spark

%emr_serverless_spark

%adb_spark add

說明

執行後,整個 Notebook 核心的執行內容會切換至遠端的 PySpark 環境。後續儲存格可直接編寫 PySpark 代碼。

前提條件

綁定 MaxCompute 資源

綁定 EMR 計算資源 並建立 Livy Gateway。

綁定 ADB Spark 計算資源。

開發環境模式

自動建立/複用 Livy 會話。

串連已有的 Livy Gateway,建立會話。

自動建立/複用 Spark Connect Server。

生產環境模式

Livy模式:通過 Livy 服務提交 Spark 作業。

spark-submit 批處理模式:純批處理,不保留工作階段狀態。

Spark Connect Server 模式:通過 Spark 串連服務進行互動。

生產資源釋放

任務執行個體結束後自動釋放會話。

任務執行個體結束後自動清理資源。

任務執行個體結束後自動釋放資源。

適用情境

與 MaxCompute 生態緊密整合的通用批處理、ETL 任務。

需要靈活配置、與開源巨量資料生態(如 Hudi, Iceberg)互動的複雜分析任務。

針對 ADB for MySQL C-Store 表的高效能互動式查詢與分析。

MaxCompute Spark

說明

在建立MaxCompute計算資源串連前,請確保已綁定MaxCompute計算資源

通過 Livy 串連到 MaxCompute 專案內建的 Spark 引擎。

  1. 建立串連:在 Python 儲存格中運行以下命令。系統將自動建立或複用 Spark 會話。

    # 建立Spark Session,並停止Livy。
    %maxcompute_spark
  2. 執行 PySpark 代碼:串連成功後,在新的 Python 儲存格中,使用 %%spark Cell Magic 執行 PySpark 代碼。

    # 在使用MaxCompute Spark時,Python儲存格中必須以%%spark作為首行代碼
    %%spark
    
    df = spark.sql("SELECT * FROM your_mc_table LIMIT 10")
    df.show()
  3. 手動釋放串連:在開發調試結束後,可手動停止或刪除會話。在生產環境運行時,系統將自動停止並刪除當前任務執行個體的Livy,無需手動處理。

    # 清理Spark Session,並停止Livy。
    %maxcompute_spark stop
    
    # 清理Spark Session,並停止Livy,最後刪除Livy
    %maxcompute_spark delete

EMR Serverless Spark

說明

在建立計算資源串連前,請先在工作空間綁定EMR Serverless Spark計算資源,並建立Livy Gateway

通過串連您預先建立的 Livy Gateway 與 EMR Serverless Spark 互動。

  1. 建立串連:在執行命令前,需在儲存格右下角選擇要串連的 EMR 計算資源Livy Gateway

    # 基礎串連
    %emr_serverless_spark
    
    # 或在串連時傳入自訂 Spark 參數,注意需要自訂Spark參數時,需要寫兩個百分比符號
    %%emr_serverless_spark
    {
      "spark_conf": {
        "spark.emr.serverless.environmentId": "<EMR Serverless Spark 運行環境ID>",
        "spark.emr.serverless.network.service.name": "<EMR Serverless Spark 網路連接ID>",
        "spark.driver.cores": "1",
        "spark.driver.memory": "8g",
        "spark.executor.cores": "1",
        "spark.executor.memory": "2g",
        "spark.driver.maxResultSize": "32g"
      }
    }
    說明

    自訂參數與全域配置的關係

    • 預設行為:您在此處定義的自訂參數僅對本次串連(Session)生效,是一次性的。如果您未提供自訂參數,系統將自動使用在管理中心中配置的全域參數。

    • 推薦用法:對於需要在多個任務或被多人複用的配置,建議在管理中心 > Serverless Spark > SPARK參數中進行全域配置,以保證一致性並方便統一管理。

    • 優先順序規則:當同一個參數在自訂參數和全域配置中都被設定時,哪個最終生效,取決於管理中心中的局配置是否優先選項:

      • 勾選:全域配置將覆蓋本次的自訂參數。

      • 不勾選:本次的自訂參數將覆蓋全域配置。

  2. (可選)重新串連:若Livy gateway頁面的token被管理員誤刪後可通過該命令重新建立。

    # 重新串連,重新整理當前個人開發環境的livy token
    %emr_serverless_spark refresh_token
  3. 執行 PySpark 或 SQL 代碼:串連成功後,核心已切換。您可以在 Python 儲存格 中直接編寫 PySpark 代碼,或在 EMR Spark SQL 儲存格 中編寫 SQL。

    1. 通過EMR Spark SQL向計算資源提交並執行SQL代碼

      經過%emr_serverless_spark成功建立串連後,可在EMR Spark SQL Cell中,直接寫SQL語句,無需在儲存格中選擇計算資源。

      EMR Spark SQL Cell將複用%emr_serverless_spark的串連,提交至目標計算資源中運行。

      image

    2. 通過Python向計算資源提交並執行PySpark代碼

      通過 %emr_serverless_spark 成功建立串連後,可以在新的Python儲存格中提交和執行PySpark代碼,無需在儲存格中添加%%spark首碼。

      image

  4. 手動釋放串連

    重要

    在多人共用一個 Livy Gateway 的情況下,`stop` 或 `delete` 命令會影響所有正在使用該網關的使用者,請謹慎操作。

    # 清理Spark Session,並停止Livy。
    %emr_serverless_spark stop
    
    # 清理Spark Session,並停止Livy,最後刪除Livy
    %emr_serverless_spark delete

AnalyticDB for Spark

說明

在建立計算資源串連前,請先在工作空間綁定AnalyticDB for Spark計算資源

通過建立 Spark Connect Server 串連到 AnalyticDB for Spark 引擎。

  1. 建立串連:為確保網路連通,必須在串連參數中正確配置交換器 ID 和安全性群組 ID。 在執行命令前,需在儲存格右下角選擇 ADB Spark 計算資源

    # 必須配置交換器ID和安全性群組ID以建立網路連接
    %adb_spark add \
     --spark-conf spark.adb.version=3.5 \
     --spark-conf spark.adb.eni.enabled=true \
     --spark-conf spark.adb.eni.vswitchId=<ADB的交換器ID> \
     --spark-conf spark.adb.eni.securityGroupId=<個人開發環境的安全性群組ID>

    如何尋找交換器ID和安全性群組ID?

    • 交換器ID (vswitchId):前往阿里雲AnalyticDB MySQL控制台,在執行個體詳情頁查看網路資訊交換器ID

    • 安全性群組ID (securityGroupId):進入個人開發環境詳情頁的網路設定中所選安全性群組,查看以sg-開頭的安全性群組ID。

      重要

      為確保網路連通,建立個人開發環境時,建議選擇與您的AnalyticDB for Spark執行個體相同的VPC和交換器。

  2. 執行 PySpark 代碼:串連成功後,在新的 Python 儲存格中,執行 PySpark 代碼。

    # 只能對 C-Store 表執行操作
    df = spark.sql("SELECT * FROM my_adb_cstore_table LIMIT 10")
    df.show()
    說明:AnalyticDB for Spark 引擎當前只能處理具有 'storagePolicy'='COLD' 屬性的 C-Store 表。
  3. 手動釋放串連:在開發環境調試結束後,手動清理串連會話以節約資源。生產環境運行時,系統將自動清理資源。

    %adb_spark cleanup

串連 Lindorm Ray 計算資源

Lindorm計算引擎的RAY資源群組提供分散式運算服務,支援AI負載端到端處理。通過 Magic Command,在 Notebook 中無縫串連 Lindorm Ray 資源,進行互動式開發、調試,並將其發布為生產調度任務。

在開始之前,請確保您已完成以下準備工作(點擊展開)。

  • 購買Lindorm執行個體時,請在開通計算引擎中勾選

  • 已將您的 Lindorm 叢集添加為 DataWorks 計算資源,詳情請參見綁定Lindorm計算資源

  • 已在 Lindorm 控制台為您的叢集開通RAY資源群組。建立時,請務必在進階配置中指定正確的鏡像,以確保環境一致性。

    如何配置 Ray 資源群組鏡像?

    在 Lindorm 控制台建立 Ray 資源群組時,找到進階配置,填入以下 JSON 內容。請注意,您需要將鏡像地址中的 region 替換為您 Lindorm 叢集所在的地區,例如將 beijing 替換為 shanghai

    {
      "IMAGE": "spark-repo-beijing-registry-vpc.cn-beijing.cr.aliyuncs.com/lindorm-compute/ray:2.39.0-0.7.0-py311-cpu"
    }
  • 確保您的個人開發環境、Serverless資源群組網路設定與 Lindorm 叢集處於同一個 VPC 網路中,以保障網路連通性。

  1. 建立串連:在 Python 儲存格中運行 %lindorm_ray 命令。運行後,儲存格右下角將出現計算資源選取器,請在此處選擇您的Lindorm 計算資源和建立好的Ray 資源群組

    # 串連到指定的Lindorm Ray資源群組
    %lindorm_ray
    重要
    • 串連Lindorm Ray計算資源後,同一個 Notebook將不再支援運行SQL儲存格。Lindorm Ray 引擎專註於執行 Python 和 Ray 代碼。

    • 當您多次運行同一個代碼儲存格時,系統會自動終止上一個正在啟動並執行 Ray Job,並啟動一個新的 Job。這可以有效避免資源浪費和任務衝突。

  2. 執行 Ray 代碼:串連成功後,在新的 Python 儲存格中直接編寫和執行 Ray 代碼。日誌會即時回傳到儲存格的輸出地區,方便您進行互動式調試。

    以下樣本定義了一個簡單的遠程任務(使用 @ray.remote 裝飾器),它會在 Ray 叢集上執行,並將日誌和最終結果返回到儲存格的輸出區。

    import ray
    import time
    
    @ray.remote
    def hello_world():
      print("Hello from Lindorm Ray!")
      time.sleep(5)
      return "Task finished."
    # 提交遠程任務
    result_ref = hello_world.remote()
    print(ray.get(result_ref))
  3. (可選)自訂啟動參數:如需為 Ray 環境指定額外的配置,例如安裝第三方 Python 包或上傳本地代碼檔案,可以使用 %%lindorm_ray 命令建立串連。

    • 樣本1:安裝依賴包

      通過 pip 參數在 Ray 環境中安裝 jieba 包。

      %%lindorm_ray
      {
        "runtime_env": {
          "pip": ["jieba"]
        }
      }

      環境準備就緒後,在後續的 Ray 任務中匯入並使用該包。以下樣本示範如何在遠程函數中調用jieba進行中文分詞:

      import ray 
      
      @ray.remote
      def do_work(x):
          import jieba
      
          return "/".join(jieba.cut(x))
      
      print(ray.get(do_work.remote("歡迎使用DataWorks+LindormRay解決方案")))
    • 樣本2:上傳並使用DataWorks資源

      通過 working_dir 參數,將 DataWorks 資源管理中已上傳的資源進一步上傳到 Ray 叢集,使其可以在任務中被匯入和調用。

      重要
      • 使用 working_dir 上傳資源時,檔案會直接從您的開發環境上傳到 Ray 叢集,存在 100MB 的大小限制。如果資源套件過大,可能導致上傳失敗或 Ray 節點不穩定。

      • 對於體積較大的資源檔或依賴(超過100MB),建議您先將其上傳到 OSS,然後在代碼中從 OSS 下載和讀取,或者直接將其打包到自訂鏡像中。這能提供更好的穩定性和效能。

      # 引用Data Studio資源管理中上傳的資源,聲明路徑
      %%lindorm_ray
      {
          "runtime_env": {
              "working_dir": "/mnt/workspace/_dataworks/resource_references"
          }
      }

      假設在DataWorks的Data Stuido資源管理中上傳了一個ray_resource.py檔案,編寫並執行以下儲存格時,系統會自動解析後續代碼中的##@resource_reference 聲明,並將下載相應資源到 /mnt/workspace/_dataworks/resource_references路徑。

      ray_resource.py的代碼內容樣本如下:

      def fun():
          print("This is a test function in ray_resource.py")
      重要

      在開發環境中,當執行完包含##@resource_reference的儲存格後,您需要重新運行上面的%%lindorm_ray儲存格,會將下載好的資源套件含在working_dir中上傳到Ray叢集。在生產環境中,您無需重新運行。

      import ray 
      
      ##@resource_reference{"ray_resource.py"}
      
      @ray.remote
      def do_work(x):
          print('Ray says:', x)
      
          from ray_resource import fun
          fun()
          return x
      
      worker = do_work.remote("歡迎使用DataWorks+LindormRay解決方案")
      print(ray.get(worker))
  4. 生產調度與營運:開發調試完成後,您可以將此 Notebook 節點提交發布,它將作為一個 Lindorm Ray 節點在 DAG 中進行周期性調度。

    • 參數化:您的代碼可以正常使用 DataWorks 的標準調度參數,例如 ${bizdate}

    • 日誌查看:在生產環境中,為了避免日誌過多影響效能,系統預設只載入前 1MB 的日誌。如果日誌被截斷,輸出結果中會提供一個連結,引導您跳轉至 Lindorm 控制台查看完整的任務日誌。

    • 資源釋放:生產調度任務結束後,Lindorm Ray任務的狀態會變為終態,不再佔用資源;互動式開發時,你可以通過重啟Kernel、關閉Notebook將Lindorm Ray的任務變為終態。

附錄:Magic Command 速查表

Magic Command

Magic Command含義

適用計算引擎

o = %odps

擷取 PyODPS 入口對象

MaxCompute

mf_session = %maxframe

建立 MaxFrame 串連

%maxcompute_spark

建立Spark Session

MaxCompute Spark

%maxcompute_spark stop

清理Spark Session,並停止Livy。

%maxcompute_spark delete

清理Spark Session,停止並刪除Livy。

%%spark

在Python儲存格中,串連已建立的Spark計算資源。

%emr_serverless_spark

建立Spark Session

EMR Serverless Spark

%emr_serverless_spark info

查看Livy Gateway的詳細資料。

%emr_serverless_spark stop

清理Spark Session,並停止Livy。

%emr_serverless_spark delete

清理Spark Session,停止並刪除Livy。

%emr_serverless_spark refresh_token

重新整理個人開發環境的Livy Token

%adb_spark add

建立並串連到一個可複用的ADB Spark會話(Session)。

AnalyticDB for Spark

%adb_spark info

查看Spark Session資訊.

%adb_spark cleanup

停止並清理當前的Spark串連會話。

%lindorm_ray

建立 Lindorm Ray 串連。

Lindorm Ray

%%lindorm_ray

建立 Lindorm Ray 串連,並配置自訂運行時環境(如安裝依賴、上傳代碼)。

常見問題

  • Q:引用工作空間資源時,報錯ModuleNotFoundErrorThere is no file with id ...

    A:請按照以下步驟檢查。

    • 請前往資料開發 > 資源管理,確保MaxCompute Python資源已儲存;如果是生產環境報該錯誤,需確認資源發行至生產環境。

    • 請點擊Notebook編輯器上方工具列的重啟按鈕,嘗試重新載入資源。

  • Q:當我更新工作空間資源後,為什麼還是引用舊資源?

    A:當對資源修改重新發布時,需在Data Studio設定中,修改資源衝突處理策略Dataworks › Notebook › Resource Reference: Download StrategyautoOverwrite,並在Notebook頂部工具列點擊重啟Kernel

  • Q:引用資料集時,開發環境報錯FileNotFoundError

    A:請確保已在當前選擇的個人開發環境中掛載資料集。

  • Q:引用資料集時,開發環境成功,但生產環境報錯Execute mount dataset exception! Please check your dataset config

    A:請確保已在Notebook節點的調度配置掛載資料集,並給OSS資料集完成授權

    image

  • Q:如何查看個人開發環境的版本?

    A:進入個人開發環境後,通過快速鍵CMD+SHIFT+P,並輸入ABOUT查看目前的版本。若隨著產品功能更新與迭代,需要0.5.69及以上版本的個人開發環境執行個體,可通過介面升級提示彈窗執行一鍵升級

  • Q:串連 Spark 引擎失敗?

    A:請按照以下步驟檢查。

    • 通用檢查:前往工作空間詳情的計算資源清單,確認對應的計算資源(MaxCompute/EMR/ADB)是否已正確綁定到當前工作空間,且您的帳號具備相應許可權。

    • EMR Serverless Spark:檢查 Livy Gateway 是否已建立且狀態正常。

    • AnalyticDB for Spark:重點排查網路問題。確認 vswitchIdsecurityGroupId 配置正確,確保個人開發環境與 ADB Spark 執行個體之間網路互連。檢查安全性群組規則是否允許必要的連接埠通訊。