

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Spark Connect 支援
<a name="notebooks-spark-connect"></a>

Spark Connect 是 Apache Spark 的用戶端伺服器架構，可將應用程式用戶端與 Spark 叢集的驅動程式程序分離，以便從支援的用戶端遠端連線至 Spark。Spark Connect 也可直接從您最愛的 IDEs/用戶端在開發期間啟用互動式偵錯。

從 Apache Spark 3.5 版之後的版本，Athena 支援 Spark Connect 做為可使用 `GetSessionEndpoint` API 存取的 AWS 端點。

## API/CLI 範例 (GetSessionEndpoint)
<a name="notebooks-spark-connect-api-examples"></a>

您可以使用 `GetSessionEndpoint` API 來取得互動式工作階段的 Spark Connect 端點。

```
aws athena get-session-endpoint \
  --region "REGION" \
  --session-id "SESSION_ID"
```

此 API 會傳回該工作階段的 Spark Connect 端點 URL。

```
{
  "EndpointUrl": "ENDPOINT_URL",
  "AuthToken": "AUTH_TOKEN",
  "AuthTokenExpirationTime": "AUTH_TOKEN_EXPIRY_TIME"
}
```

## 從自我管理用戶端連線
<a name="notebooks-spark-connect-self-managed"></a>

您可以從自我管理用戶端連線至 Athena Spark 互動式工作階段。

### 先決條件
<a name="notebooks-spark-connect-prerequisites"></a>

安裝適用於 Spark 3.5.6 的 pyspark-connect 用戶端和適用於 Python 的 AWS SDK。

```
pip install --user pyspark[connect]==3.5.6
pip install --user boto3
```

以下是直接將請求傳送至工作階段端點的範例 Python 指令碼：

```
import boto3
import time
from pyspark.sql import SparkSession

client = boto3.client('athena', region_name='<REGION>')

# start the session
response = client.start_session(
    WorkGroup='<WORKGROUP_NAME>',
    EngineConfiguration={}
)

# wait for the session endpoint to be ready
time.sleep(5)
response = client.get_session_endpoint(SessionId=session_id)

# construct the authenticated remote url
authtoken=response['AuthToken']
endpoint_url=response['EndpointUrl']
endpoint_url=endpoint_url.replace("https", "sc")+":443/;use_ssl=true;"
url_with_headers = (
    f"{endpoint_url}"
    f"x-aws-proxy-auth={authtoken}"
)

# start the Spark session
start_time = time.time()
spark = SparkSession.builder\
    .remote(url_with_headers)\
    .getOrCreate()
 
spark.version 

#
# Enter your spark code here
#

# stop the Spark session
spark.stop()
```

以下是存取工作階段的即時 Spark UI 或 Spark 歷史記錄伺服器的範例 Python 指令碼：

```
Region='<REGION>'
WorkGroupName='<WORKGROUP_NAME>'
SessionId='<SESSION_ID>'
Partition='aws'
Account='<ACCOUNT_NUMBER>'

SessionARN=f"arn:{Partition}:athena:{Region}:{Account}:workgroup/{WorkGroupName}/session/{SessionId}"

# invoke the API to get the live UI/persistence UI for a session
response = client.get_resource_dashboard(
    ResourceARN=SessionARN
)
response['Url']
```