다음을 통해 공유


PolyBase(레거시)를 사용하여 Azure Databricks 및 Azure Synapse 연결

중요

이 설명서는 사용 중지되었으며 업데이트되지 않을 수 있습니다. 이 콘텐츠에 언급된 제품, 서비스 또는 기술은 더 이상 지원되지 않습니다. Azure Synapse Analytics의 쿼리 데이터를 참조하세요.

Databricks는 Azure Synapse에 연결하기 위해 Azure Data Lake Storage와 함께 기본 COPY 기능을 사용하는 것이 좋습니다. 이 문서에는 PolyBase 및 Blob Storage에 대한 레거시 설명서가 포함되어 있습니다.

Azure Synapse Analytics(이전 SQL Data Warehouse)는 MPP(대규모 병렬 처리)를 활용하여 페타바이트 단위의 데이터에서 복잡한 쿼리를 빠르게 실행하는 클라우드 기반 Enterprise Data Warehouse입니다. 빅 데이터 솔루션의 주요 구성 요소로 Azure를 사용합니다. 간단한 PolyBase T-SQL 쿼리 또는 COPY 문을 사용하여 빅 데이터를 Azure로 가져온 다음, MPP 기능을 사용하여 고성능 분석을 실행합니다. 데이터를 통합하고 분석할 때 데이터 웨어하우스는 비즈니스가 인사이트를 확보하기 위해 신뢰할 수 있는 유일한 버전이 됩니다.

Azure Synaps에서 Azure Blob Storage와 PolyBase 또는 COPY 문을 사용하여 Azure Databricks 클러스터와 Azure Synapse 인스턴스 간에 대량의 데이터를 효율적으로 전송하는 Apache Spark용 데이터 원본 구현인 Azure Synapse 커넥터를 사용하여 Azure Databricks의 Azure Synapse에 액세스할 수 있습니다.

Azure Databricks 클러스터 및 Azure Synapse 인스턴스는 둘 다 공용 Blob Storage 컨테이너에 액세스하여 이 두 시스템 간에 데이터를 교환합니다. Azure Databricks에서 Apache Spark 작업은 Azure Synapse 커넥터에 의해 트리거되어 Blob storage 컨테이너에서 데이터를 읽고 씁니다. Azure Synapse에서 PolyBase에 의해 수행되는 데이터 로드 및 언로드 작업은 Azure Synapse 커넥터에 의해 JDBC를 통해 트리거됩니다. Databricks Runtime 7.0 이상에서는 기본적으로 COPY를 사용하여 JDBC를 통해 Azure Synapse 커넥터에서 Azure Synapse에 데이터를 로드합니다.

참고

COPY향상된 성능을 제공하는 Azure Synapse Gen2 인스턴스에서만 사용할 수 있습니다. 데이터베이스에서 여전히 Gen1 인스턴스를 사용하는 경우 데이터베이스를 Gen2로 마이그레이션하는 것이 좋습니다.

Azure Synapse 커넥터는 각 쿼리를 실행하면 Blob Storage에 많은 양의 데이터를 추출할 수 있으므로 대화형 쿼리보다 ETL에 더 적합합니다. 동일한 Azure Synapse 테이블에 대해 여러 쿼리를 수행하려는 경우 추출된 데이터를 Parquet과 같은 형식으로 저장하는 것이 좋습니다.

요구 사항

Azure Synapse 데이터베이스 마스터 키.

인증

Azure Synapse 커넥터는 다음 세 가지 유형의 네트워크 연결을 사용합니다.

  • Azure Synapse로의 Spark 드라이버
  • Azure Storage 계정에 대한 Spark 드라이버 및 실행기
  • Azure 스토리지 계정에 대한 Azure Synapse
                                 ┌─────────┐
      ┌─────────────────────────>│ STORAGE │<────────────────────────┐
      │   Storage acc key /      │ ACCOUNT │  Storage acc key /      │
      │   Managed Service ID /   └─────────┘  OAuth 2.0 /            │
      │                               │                              │
      │                               │                              │
      │                               │ Storage acc key /            │
      │                               │ OAuth 2.0 /                  │
      │                               │                              │
      v                               v                       ┌──────v────┐
┌──────────┐                      ┌──────────┐                │┌──────────┴┐
│ Synapse  │                      │  Spark   │                ││ Spark     │
│ Analytics│<────────────────────>│  Driver  │<───────────────>│ Executors │
└──────────┘  JDBC with           └──────────┘    Configured   └───────────┘
              username & password /                in Spark

다음 섹션에서는 각 연결의 인증 구성 옵션에 대해 설명합니다.

Azure Synapse로의 Spark 드라이버

Spark 드라이버는 인증에 사용자 이름 및 암호를 사용하는 JDBC 또는 서비스 주체를 사용하는 OAuth 2.0을 사용하여 Azure Synapse에 연결할 수 있습니다.

사용자 이름 및 암호

두 인증 유형에 Azure Portal에서 제공하는 연결 문자열을 사용하는 것이 좋습니다. 이 문자열은 JDBC 연결을 통해 Spark 드라이버와 Azure Synapse 인스턴스 간에 전송되는 모든 데이터에 대해 SSL(Secure Sockets Layer) 암호화를 사용하도록 설정합니다. SSL 암호화를 사용하도록 설정되어 있는지 확인하려면 연결 문자열에서 encrypt=true를 검색할 수 있습니다.

Spark 드라이버와 Azure Synapse의 연결을 허용하려면 Azure Portal의 Azure Synapse 작업 영역의 네트워킹 창에서 Azure 서비스 및 리소스가 이 작업 영역에 액세스할 수 있도록 허용켜기로 설정하는 것이 좋습니다. 이 설정을 사용하면 모든 Azure IP 주소 및 모든 Azure 서브넷에서 통신할 수 있으므로 Spark 드라이버가 Azure Synapse 인스턴스에 연결할 수 있습니다.

서비스 주체를 사용하는 OAuth 2.0

기본 스토리지 계정에 대한 액세스 권한이 있는 서비스 주체를 사용하여 Azure Synapse Analytics에서 인증을 받을 수 있습니다. 서비스 주체 자격 증명을 사용하여 Azure Storage 계정에 액세스하는 방법에 대한 자세한 내용은 Connect to Azure Data Lake Storage 및 Blob Storage참조하세요. 커넥터가 서비스 주체를 사용하여 인증할 수 있도록 하려면 연결 구성 enableServicePrincipalAuth에서 true 옵션을 로 설정해야 합니다.

필요에 따라 Azure Synapse Analytics 연결에 다른 서비스 주체를 사용할 수 있습니다. 스토리지 계정에 대한 서비스 주체 자격 증명 및 Synapse에 대한 선택적 서비스 주체 자격 증명을 구성하는 예제는 다음과 같습니다.

이것
; Defining the Service Principal credentials for the Azure storage account
fs.azure.account.auth.type OAuth
fs.azure.account.oauth.provider.type org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
fs.azure.account.oauth2.client.id <application-id>
fs.azure.account.oauth2.client.secret <service-credential>
fs.azure.account.oauth2.client.endpoint https://login.microsoftonline.com/<directory-id>/oauth2/token

; Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.databricks.sqldw.jdbc.service.principal.client.id <application-id>
spark.databricks.sqldw.jdbc.service.principal.client.secret <service-credential>
스칼라
// Defining the Service Principal credentials for the Azure storage account
spark.conf.set("fs.azure.account.auth.type", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret", "<service-credential>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

// Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")
파이썬
# Defining the service principal credentials for the Azure storage account
spark.conf.set("fs.azure.account.auth.type", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret", "<service-credential>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

# Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")
R 프로그래밍 언어
# Load SparkR
library(SparkR)
conf <- sparkR.callJMethod(sparkR.session(), "conf")

# Defining the service principal credentials for the Azure storage account
sparkR.callJMethod(conf, "set", "fs.azure.account.auth.type", "OAuth")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.id", "<application-id>")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.secret", "<service-credential>")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

# Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
sparkR.callJMethod(conf, "set", "spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
sparkR.callJMethod(conf, "set", "spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")

Azure Storage 계정에 대한 Spark 드라이버 및 실행기

Azure Storage 컨테이너는 Azure Synapse에서 읽거나 쓸 때 대량 데이터를 저장하는 중간 매개 역할을 합니다. Spark는 드라이버를 사용하여 abfss 연결합니다.

다음 인증 옵션을 사용할 수 있습니다.

아래 예제에서는 스토리지 계정 액세스 키 접근 방식을 사용하는 두 가지 방법을 보여 줍니다. 마찬가지로 OAuth 2.0 구성도에도 적용됩니다.

Notebook 세션 구성(기본 설정)

이 방법을 사용하면 계정 액세스 키가 명령을 실행하는 Notebook과 연결된 세션 구성에서 설정됩니다. 이 구성은 동일한 클러스터에 연결된 다른 Notebook에는 영향을 주지 않습니다. spark는 Notebook에 제공된 SparkSession 개체입니다.

spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

전역 Hadoop 구성

이 방법은 모든 Notebook에서 공유하는 SparkContext 개체와 연결된 전역 Hadoop 구성을 업데이트합니다.

스칼라
sc.hadoopConfiguration.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")
파이썬

hadoopConfiguration은 PySpark의 모든 버전에서 노출되지 않습니다. 다음 명령은 일부 Spark 내부 기능에 따라 달라지지만 모든 PySpark 버전에서 작동해야 하며 나중에 중단되거나 변경될 가능성이 낮습니다.

sc._jsc.hadoopConfiguration().set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

Azure 스토리지 계정에 대한 Azure Synapse

또한 Azure Synapse는 임시 데이터를 로드하고 언로드하는 동안 스토리지 계정에 연결됩니다.

스토리지 계정에 대한 계정 키 및 비밀을 설정한 경우 forwardSparkAzureStorageCredentialstrue로 설정할 수 있습니다. 이 경우 Azure Synapse 커넥터는 Notebook 세션 구성 또는 전역 Hadoop 구성에서 설정된 계정 액세스 키를 자동으로 검색하고 임시 Azure 데이터베이스 범위 자격 증명을 만들어 연결된 Azure Synapse 인스턴스에 스토리지 계정 액세스 키를 전달합니다.

또는 OAuth 2.0 인증과 함께 ADLS를 사용하거나 Azure Synapse 인스턴스가 관리 서비스 ID(일반적으로 VNet + 서비스 엔드포인트 설정함께)를 갖도록 구성된 경우 useAzureMSItrue설정해야 합니다. 이 경우 커넥터는 데이터베이스 범위 자격 증명에 대해 IDENTITY = 'Managed Service Identity'를 지정하고 SECRET은 지정하지 않습니다.

스트리밍 지원

Azure Synapse 커넥터는 일괄 쓰기를 통해 일관된 사용자 환경을 제공하고, Azure Databricks 클러스터와 Azure Synapse 인스턴스 간의 대규모 데이터 전송을 위해 PolyBase 또는 COPY를 사용하는 Azure Synapse에 대해 효율적이고 확장 가능한 구조적 스트리밍 쓰기 지원을 제공합니다. 일괄 쓰기와 마찬가지로 스트리밍은 주로 ETL용으로 디자인되었으므로 경우에 따라 실시간 데이터 처리에 적합하지 않을 수 있는 더 긴 대기 시간을 제공합니다.

내결함성 의미 체계

기본적으로 Azure Synapse 테이블에 데이터 쓰기 시, Azure Synapse Streaming은 DBFS의 검사점 위치, Azure Synapse의 검사점 테이블 및 잠금 메커니즘을 결합하여 쿼리의 진행 상태를 안정적으로 추적함으로써 스트리밍이 모든 유형의 오류와 재시도, 및 쿼리 재시작 상황을 처리할 수 있도록 종단 간 정확히 한 번을 보장합니다. 선택 사항으로 spark.databricks.sqldw.streaming.exactlyOnce.enabled 옵션을 false로 설정하여 Azure Synapse 스트리밍에 대해 덜 제한적인 최소 한 번의 의미 체계를 선택할 수 있습니다. 이 경우, Azure Synapse에 대한 간헐적인 연결 오류 또는 예기치 않은 쿼리 종료 시 데이터 중복이 발생할 수 있습니다.

사용량(일괄)

Scala, Python, SQL 및 R Notebook에서 데이터 원본 API를 통해 이 커넥터를 사용할 수 있습니다.

스칼라


// Otherwise, set up the Blob storage account access key in the notebook session conf.
spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

// Get some data from an Azure Synapse table.
val df: DataFrame = spark.read
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("dbTable", "<your-table-name>")
  .load()

// Load data from an Azure Synapse query.
val df: DataFrame = spark.read
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("query", "select x, count(*) as cnt from table group by x")
  .load()

// Apply some transformations to the data, then use the
// Data Source API to write the data back to another table in Azure Synapse.
df.write
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("dbTable", "<your-table-name>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .save()

파이썬


# Otherwise, set up the Blob storage account access key in the notebook session conf.
spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

# Get some data from an Azure Synapse table.
df = spark.read \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "<your-table-name>") \
  .load()

# Load data from an Azure Synapse query.
df = spark.read \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("query", "select x, count(*) as cnt from table group by x") \
  .load()

# Apply some transformations to the data, then use the
# Data Source API to write the data back to another table in Azure Synapse.
df.write \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "<your-table-name>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .save()

SQL


-- Otherwise, set up the Blob storage account access key in the notebook session conf.
SET fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net=<your-storage-account-access-key>;

-- Read data using SQL.
CREATE TABLE example_table_in_spark_read
USING com.databricks.spark.sqldw
OPTIONS (
  url 'jdbc:sqlserver://<the-rest-of-the-connection-string>',
  forwardSparkAzureStorageCredentials 'true',
  dbTable '<your-table-name>',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>'
);

-- Write data using SQL.
-- Create a new table, throwing an error if a table with the same name already exists:
CREATE TABLE example_table_in_spark_write
USING com.databricks.spark.sqldw
OPTIONS (
  url 'jdbc:sqlserver://<the-rest-of-the-connection-string>',
  forwardSparkAzureStorageCredentials 'true',
  dbTable '<your-table-name>',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>'
)
AS SELECT * FROM table_to_save_in_spark;

R 프로그래밍 언어

# Load SparkR
library(SparkR)

# Otherwise, set up the Blob storage account access key in the notebook session conf.
conf <- sparkR.callJMethod(sparkR.session(), "conf")
sparkR.callJMethod(conf, "set", "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net", "<your-storage-account-access-key>")

# Get some data from an Azure Synapse table.
df <- read.df(
   source = "com.databricks.spark.sqldw",
   url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
   forward_spark_azure_storage_credentials = "true",
   dbTable = "<your-table-name>",
   tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

# Load data from an Azure Synapse query.
df <- read.df(
   source = "com.databricks.spark.sqldw",
   url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
   forward_spark_azure_storage_credentials = "true",
   query = "select x, count(*) as cnt from table group by x",
   tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

# Apply some transformations to the data, then use the
# Data Source API to write the data back to another table in Azure Synapse.
write.df(
  df,
  source = "com.databricks.spark.sqldw",
  url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
  forward_spark_azure_storage_credentials = "true",
  dbTable = "<your-table-name>",
  tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

사용량(스트리밍)

Scala 및 Python Notebook에서 구조적 스트리밍을 사용하여 데이터를 쓸 수 있습니다.

스칼라

// Set up the Blob storage account access key in the notebook session conf.
spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

// Prepare streaming source; this could be Kafka or a simple rate stream.
val df: DataFrame = spark.readStream
  .format("rate")
  .option("rowsPerSecond", "100000")
  .option("numPartitions", "16")
  .load()

// Apply some transformations to the data then use
// Structured Streaming API to continuously write the data to a table in Azure Synapse.
df.writeStream
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("dbTable", "<your-table-name>")
  .option("checkpointLocation", "/tmp_checkpoint_location")
  .start()

파이썬

# Set up the Blob storage account access key in the notebook session conf.
spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

# Prepare streaming source; this could be Kafka or a simple rate stream.
df = spark.readStream \
  .format("rate") \
  .option("rowsPerSecond", "100000") \
  .option("numPartitions", "16") \
  .load()

# Apply some transformations to the data then use
# Structured Streaming API to continuously write the data to a table in Azure Synapse.
df.writeStream \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "<your-table-name>") \
  .option("checkpointLocation", "/tmp_checkpoint_location") \
  .start()

구성

이 섹션에서는 커넥터, 필수 권한 및 기타 구성 매개 변수에 대한 쓰기 의미 체계를 구성하는 방법을 설명합니다.

이 구역의 내용:

일괄 쓰기에 지원되는 저장 모드

Azure Synapse 커넥터는 기본 모드가 ErrorIfExistsIgnore, Append, OverwriteErrorIfExists 저장 모드를 지원합니다. Apache Spark에서 지원되는 저장 모드에 대한 자세한 내용은 Spark SQL 설명서의 저장 모드를 참조하세요.

스트리밍 쓰기에 지원되는 출력 모드

Azure Synapse 커넥터는 레코드 추가 및 집계에 대한 AppendComplete 출력 모드를 지원합니다. 출력 모드 및 호환성 매트릭스에 대한 자세한 내용은 구조적 스트리밍 가이드를 참조하세요.

의미론 작성

참고

COPY은 Databricks Runtime 7.0 이상에서 사용 가능합니다.

PolyBase 외에도 Azure Synapse 커넥터는 COPY 문을 지원합니다. COPY 문은 외부 테이블을 만들지 않고도 Azure Synapse에 데이터를 로드하는 더 편리한 방법을 제공하고, 데이터를 로드하는 데 더 적은 사용 권한이 필요하며, Azure Synapse로 데이터 수집의 성능을 향상시킵니다.

기본적으로 커넥터는 최상의 쓰기 의미 체계를 자동으로 검색합니다(Azure Synapse Gen2 인스턴스를 대상으로 하는 경우 COPY, 그렇지 않은 경우 PolyBase). 다음 구성을 사용하여 쓰기 의미 체계를 지정할 수도 있습니다.

스칼라

// Configure the write semantics for Azure Synapse connector in the notebook session conf.
spark.conf.set("spark.databricks.sqldw.writeSemantics", "<write-semantics>")

파이썬

# Configure the write semantics for Azure Synapse connector in the notebook session conf.
spark.conf.set("spark.databricks.sqldw.writeSemantics", "<write-semantics>")

SQL

-- Configure the write semantics for Azure Synapse connector in the notebook session conf.
SET spark.databricks.sqldw.writeSemantics=<write-semantics>;

R 프로그래밍 언어

# Load SparkR
library(SparkR)

# Configure the write semantics for Azure Synapse connector in the notebook session conf.
conf <- sparkR.callJMethod(sparkR.session(), "conf")
sparkR.callJMethod(conf, "set", "spark.databricks.sqldw.writeSemantics", "<write-semantics>")

여기서 <write-semantics>polybase(PolyBase를 사용하는 경우) 또는 copy(COPY 문을 사용하는 경우)입니다.

PolyBase에 필요한 Azure Synapse 권한

PolyBase를 사용하는 경우 Azure Synapse 커넥터를 사용하려면 JDBC 연결 사용자에게 연결된 Azure Synapse 인스턴스에서 다음 명령을 실행할 수 있는 권한이 있어야 합니다.

첫 번째 명령의 필수 구성 요소로 커넥터에는 지정된 Azure Synapse 인스턴스에 대해 데이터베이스 마스터 키가 이미 있어야 합니다. 이 키가 없는 경우 CREATE MASTER KEY 명령을 사용하여 키를 만들 수 있습니다.

또한 dbTable에 언급된 테이블 또는 query을 통해 설정된 Azure Synapse 테이블을 읽으려면 JDBC 사용자에게 필요한 Azure Synapse 테이블에 액세스할 수 있는 권한이 있어야 합니다. dbTable을 통해 설정된 Azure Synapse 테이블에 데이터를 다시 쓰려면 JDBC 사용자에게 이 Azure Synapse 테이블에 대한 쓰기 권한이 있어야 합니다.

다음 표에는 PolyBase를 사용하는 모든 작업에 필요한 사용 권한이 요약되어 있습니다.

작업 사용 권한 외부 데이터 원본을 사용할 때 사용 권한
일괄 쓰기 제어 일괄 쓰기 참조
스트리밍 데이터 쓰기 제어 스트리밍 쓰기 참조
읽기 제어 "읽기를 참조하세요"

외부 데이터 원본 옵션을 사용하는 PolyBase에 필요한 필수 Azure Synapse 권한

미리 프로비전된 외부 데이터 원본에서 PolyBase를 사용할 수 있습니다. 자세한 내용은 externalDataSource 매개 변수를 참조하세요.

미리 프로비전된 외부 데이터 원본과 함께 PolyBase를 사용하려면 Azure Synapse 커넥터에 대해 JDBC 연결 사용자에게 연결된 Azure Synapse 인스턴스에서 다음 명령을 실행할 수 있는 권한이 있어야 합니다.

외부 데이터 원본을 만들려면 먼저 데이터베이스 범위 자격 증명을 만들어야 합니다. 다음 링크는 서비스 주체에 대한 범위 자격 증명 및 ABFS 위치에 대한 외부 데이터 원본을 만드는 방법을 설명합니다.

참고

외부 데이터 원본 위치는 컨테이너를 가리켜야 합니다. 위치가 컨테이너의 디렉터리인 경우 커넥터가 작동하지 않습니다.

다음 표에는 외부 데이터 원본 옵션을 사용한 PolyBase 쓰기 작업에 대한 사용 권한이 요약되어 있습니다.

작업 사용 권한(기존 테이블에 삽입) 사용 권한(새 테이블에 삽입)
일괄 쓰기 데이터베이스 대량 작업 관리
INSERT
CREATE TABLE
모든 SCHEMA 수정
외부 데이터 소스 수정 권한
외부 파일 형식 변경 권한 부여
데이터베이스 대량 작업 관리
INSERT
CREATE TABLE
모든 SCHEMA 수정
외부 데이터 소스 수정 권한
외부 파일 형식 변경 권한 부여
스트리밍 데이터 쓰기 데이터베이스 대량 작업 관리
INSERT
CREATE TABLE
모든 SCHEMA 수정
외부 데이터 소스 수정 권한
외부 파일 형식 변경 권한 부여
데이터베이스 대량 작업 관리
INSERT
CREATE TABLE
모든 SCHEMA 수정
외부 데이터 소스 수정 권한
외부 파일 형식 변경 권한 부여

다음 표에는 외부 데이터 원본 옵션을 사용한 PolyBase 읽기 작업에 대한 사용 권한이 요약되어 있습니다.

작업 사용 권한
읽기 CREATE TABLE
모든 SCHEMA 수정
외부 데이터 소스 수정 권한
외부 파일 형식 변경 권한 부여

Scala, Python, SQL 및 R Notebook에서 데이터 원본 API를 통해 읽을 때 이 커넥터를 사용할 수 있습니다.

스칼라
// Get some data from an Azure Synapse table.
val df: DataFrame = spark.read
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("externalDataSource", "<your-pre-provisioned-data-source>")
  .option("dbTable", "<your-table-name>")
  .load()
파이썬
# Get some data from an Azure Synapse table.
df = spark.read \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .option("externalDataSource", "<your-pre-provisioned-data-source>") \
  .option("dbTable", "<your-table-name>") \
  .load()
SQL
-- Read data using SQL.
CREATE TABLE example_table_in_spark_read
USING com.databricks.spark.sqldw
OPTIONS (
  url 'jdbc:sqlserver://<the-rest-of-the-connection-string>',
  forwardSparkAzureStorageCredentials 'true',
  dbTable '<your-table-name>',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>',
  externalDataSource '<your-pre-provisioned-data-source>'
);
R 프로그래밍 언어
# Get some data from an Azure Synapse table.
df <- read.df(
   source = "com.databricks.spark.sqldw",
   url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
   forward_spark_azure_storage_credentials = "true",
   dbTable = "<your-table-name>",
   tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>"
   externalDataSource = "<your-pre-provisioned-data-source>")

COPY 문에 필요한 Azure Synapse 권한

참고

Databricks Runtime 7.0 이상에서 사용 가능합니다.

COPY 문을 사용하는 경우 Azure Synapse 커넥터를 사용하려면 JDBC 연결 사용자에게 연결된 Azure Synapse 인스턴스에서 다음 명령을 실행할 수 있는 권한이 있어야 합니다.

대상 테이블이 Azure Synapse에 없는 경우 위의 명령 외에도 다음 명령을 실행할 수 있는 권한이 필요합니다.

다음 표에는 COPY를 사용한 일괄 및 스트리밍 쓰기에 대한 사용 권한이 요약되어 있습니다.

작업 사용 권한(기존 테이블에 삽입) 사용 권한(새 테이블에 삽입)
일괄 쓰기 데이터베이스 대량 작업 관리
INSERT
데이터베이스 대량 작업 관리
INSERT
CREATE TABLE
ALTER ON SCHEMA :: dbo
스트리밍 데이터 쓰기 데이터베이스 대량 작업 관리
INSERT
데이터베이스 대량 작업 관리
INSERT
CREATE TABLE
ALTER ON SCHEMA :: dbo

매개 변수

Spark SQL에 제공된 매개 변수 맵 OPTIONS는 다음 설정을 지원합니다.

매개 변수 필수 기본값 참고
dbTable query이 지정되지 않는 경우 예입니다. 기본값 없음 Azure Synapse에서 만들거나 읽을 테이블입니다. 이 매개 변수는 데이터를 Azure Synapse에 다시 저장할 때 필요합니다.
제공된 스키마의 테이블에 액세스하는 데 {SCHEMA NAME}.{TABLE NAME}을 사용할 수도 있습니다. 스키마 이름을 제공하지 않은 경우 JDBC 사용자와 연결된 기본 스키마가 사용됩니다.
이전에 지원된 dbtable 변형은 더 이상 사용되지 않으며 이후 릴리스에서 무시됩니다. 대신 "카멜 표기법" 이름을 사용합니다.
query dbTable이 지정되지 않는 경우 예입니다. 기본값 없음 Azure Synapse에서 읽기 위한 쿼리입니다.
쿼리에 언급된 테이블의 경우 제공된 스키마의 테이블에 액세스하는 데 {SCHEMA NAME}.{TABLE NAME}을 사용할 수도 있습니다. 스키마 이름을 제공하지 않은 경우 JDBC 사용자와 연결된 기본 스키마가 사용됩니다.
user 아니요 기본값 없음 Azure Synapse 사용자 이름입니다. password 옵션과 함께 사용해야 합니다. 사용자 및 암호가 URL에 전달되지 않은 경우에만 사용할 수 있습니다. 둘 다 전달하면 오류가 발생합니다.
password 아니요 기본값 없음 Azure Synapse 암호입니다. user 옵션과 함께 사용해야 합니다. 사용자 및 암호가 URL에 전달되지 않은 경우에만 사용할 수 있습니다. 둘 다 전달하면 오류가 발생합니다.
url 기본값 없음 sqlserver가 하위 프로토콜로 설정된 JDBC URL입니다. Azure Portal에서 제공하는 연결 문자열을 사용하는 것이 좋습니다. JDBC 연결의 SSL 암호화를 사용하도록 설정하므로 encrypt=true 설정하는 것이 좋습니다. userpassword가 별도로 설정된 경우 URL에 포함할 필요가 없습니다.
jdbcDriver 아니요 JDBC URL의 하위 프로토콜에 의해 결정됨 사용할 JDBC 드라이버의 클래스 이름입니다. 이 클래스는 클래스 경로에 있어야 합니다. 대부분의 경우 적절한 드라이버 클래스 이름이 JDBC URL의 하위 프로토콜에 의해 자동으로 결정되므로 이 옵션을 지정할 필요가 없습니다.
이전에 지원된 jdbc_driver 변형은 더 이상 사용되지 않으며 이후 릴리스에서 무시됩니다. 대신 "카멜 표기법" 이름을 사용합니다.
tempDir 기본값 없음 abfss URI입니다. Azure Synapse에 전용 Blob Storage 컨테이너를 사용하는 것이 좋습니다.
이전에 지원된 tempdir 변형은 더 이상 사용되지 않으며 이후 릴리스에서 무시됩니다. 대신 "카멜 표기법" 이름을 사용합니다.
tempFormat 아니요 PARQUET Azure Synapse에 쓸 때 Blob 저장소에 임시 파일을 저장할 형식입니다. 기본값은 PARQUET입니다. 현재는 다른 값을 사용할 수 없습니다.
tempCompression 아니요 SNAPPY Spark 및 Azure Synapse에서 임시로 인코딩/디코딩하는 데 사용할 압축 알고리즘입니다. 현재 지원되는 값은 UNCOMPRESSED, SNAPPYGZIP입니다.
forwardSparkAzureStorageCredentials 아니요 거짓 true인 경우 라이브러리는 Spark가 Blob Storage 컨테이너에 연결하는 데 사용하는 자격 증명을 자동으로 검색하고 JDBC를 통해 해당 자격 증명을 Azure Synapse로 전달합니다. 이러한 자격 증명은 JDBC 쿼리의 일부로 전송됩니다. 따라서 이 옵션을 사용하는 경우 JDBC 연결에 SSL 암호화를 사용하도록 설정하는 것이 좋습니다.
현재 버전의 Azure Synapse 커넥터에서는 forwardSparkAzureStorageCredentials, enableServicePrincipalAuth 또는 useAzureMSI 중 (정확히) 하나를 명시적으로 true로 설정해야 합니다.
이전에 지원된 forward_spark_azure_storage_credentials 변형은 더 이상 사용되지 않으며 이후 릴리스에서 무시됩니다. 대신 "카멜 표기법" 이름을 사용합니다.
useAzureMSI 아니요 거짓 true인 경우 라이브러리는 만든 데이터베이스 범위 자격 증명에 대해 IDENTITY = 'Managed Service Identity'를 지정하고 SECRET을 지정하지 않습니다.
현재 버전의 Azure Synapse 커넥터에서는 forwardSparkAzureStorageCredentials, enableServicePrincipalAuth 또는 useAzureMSI 중 (정확히) 하나를 명시적으로 true로 설정해야 합니다.
enableServicePrincipalAuth 아니요 거짓 true인 경우 라이브러리는 제공된 서비스 주체 자격 증명을 사용하여 JDBC를 통해 Azure Storage 계정 및 Azure Synapse Analytics에 연결합니다.
현재 버전의 Azure Synapse 커넥터에서는 forwardSparkAzureStorageCredentials, enableServicePrincipalAuth 또는 useAzureMSI 중 (정확히) 하나를 명시적으로 true로 설정해야 합니다.
tableOptions 아니요 CLUSTERED COLUMNSTORE INDEX DISTRIBUTION = ROUND_ROBIN Azure Synapse 테이블 세트를 생성할 때 테이블 옵션을 지정하기 위해 dbTable을 사용하는 문자열입니다. 이 문자열은 Azure Synapse에 대해 실행되는 WITH SQL 문의 CREATE TABLE 절에 글자 그대로 전달됩니다.
이전에 지원된 table_options 변형은 더 이상 사용되지 않으며 이후 릴리스에서 무시됩니다. 대신 "카멜 표기법" 이름을 사용합니다.
preActions 아니요 기본값 없음(빈 문자열) Azure Synapse 인스턴스에 데이터를 쓰기 전에 Azure Synapse에서 실행할 ;으로 구분된 SQL 명령 목록입니다. 이러한 SQL 명령은 Azure Synapse에서 허용한 유효한 명령이어야 합니다.
이러한 명령 중 하나라도 실패하면 오류로 처리되고 쓰기 작업이 실행되지 않습니다.
postActions 아니요 기본값 없음(빈 문자열) 커넥터가 Azure Synapse 인스턴스에 데이터를 성공적으로 쓴 후 Azure Synapse에서 실행할 ;으로 구분된 SQL 명령 목록입니다. 이러한 SQL 명령은 Azure Synapse에서 허용한 유효한 명령이어야 합니다.
이러한 명령이 실패하면 오류로 처리되고 데이터가 Azure Synapse 인스턴스에 성공적으로 기록된 후 예외가 발생합니다.
maxStrLength 아니요 256 Spark의 StringType은 Azure Synapse의 NVARCHAR(maxStrLength) 유형에 매핑됩니다. maxStrLength 사용하여 Azure Synapse에서 이름이 NVARCHAR(maxStrLength) 테이블에 있는 모든 dbTable 형식 열의 문자열 길이를 설정할 수 있습니다.
이전에 지원된 maxstrlength 변형은 더 이상 사용되지 않으며 이후 릴리스에서 무시됩니다. 대신 "카멜 표기법" 이름을 사용합니다.
checkpointLocation 기본값 없음 구조적 스트리밍에서 메타데이터 및 검사점 정보를 작성하는 데 사용할 DBFS의 위치입니다. 구조적 스트리밍 프로그래밍 가이드에서 Recovering from Failures with Checkpointing(체크포인팅을 통한 실패 복구)를 참조하세요.
numStreamingTempDirsToKeep 아니요 0 스트리밍에서 마이크로 일괄 처리를 주기적으로 정리하기 위해 유지할 (최신) 임시 디렉터리 수를 나타냅니다. 0설정하면 마이크로 일괄 처리가 커밋된 직후 디렉터리 삭제가 트리거되고, 그렇지 않으면 최신 마이크로 일괄 처리 수가 유지되고 나머지 디렉터리가 제거됩니다. 주기적인 정리를 사용하지 않도록 설정하려면 -1을 사용합니다.
applicationName 아니요 Databricks-User-Query 각 쿼리에 대한 연결 태그입니다. 지정하지 않거나 값이 빈 문자열이면 태그의 기본값이 JDBC URL에 추가됩니다. 기본값은 Azure DB 모니터링 도구가 쿼리에 대해 가짜 SQL 삽입 경고를 발생시키는 것을 방지합니다.
maxbinlength 아니요 기본값 없음 BinaryType 열의 길이를 제어합니다. 이 매개 변수는 VARBINARY(maxbinlength)로 변환됩니다.
identityInsert 아니요 거짓 true로 설정하면 IDENTITY_INSERT 모드를 사용하도록 설정합니다. 이 모드는 Azure Synapse 테이블의 ID 열에 DataFrame 제공 값을 삽입합니다.
IDENTITY 열에 값을 명시적으로 삽입을 참조하세요.
externalDataSource 아니요 기본값 없음 Azure Synapse에서 데이터를 읽을 미리 프로비전된 외부 데이터 원본입니다. 외부 데이터 원본은 PolyBase에서만 사용할 수 있으며, 커넥터가 데이터를 로드하기 위해 범위가 지정된 자격 증명 및 외부 데이터 원본을 만들 필요가 없으므로 CONTROL 권한 요구 사항을 제거합니다.
예를 들어 외부 데이터 원본을 사용할 때 필요한 사용 권한 목록 및 사용 예제는 외부 데이터 원본 외부 데이터 원본 옵션을 사용하는 PolyBase에 필요한 필수 Azure Synapse 권한을 참조하세요.
maxErrors 아니요 0 로드 작업(PolyBase 또는 COPY)이 취소되기 전에 읽기 및 쓰기 중에 거부될 수 있는 최대 행 수입니다. 거부된 행은 무시됩니다. 예를 들어 레코드 10개 중 2개에 오류가 있는 경우 8개의 레코드만 처리됩니다.
REJECT_VALUE 설명서를 살펴보시고, CREATE EXTERNAL 및 COPY에서 MAXERRORS 설명서를 확인하세요.

참고

  • tableOptions, preActions, postActionsmaxStrLength는 Azure Databricks의 데이터를 Azure Synapse의 새 테이블에 쓸 때만 관련이 있습니다.
  • externalDataSource는 PolyBase 의미 체계를 사용하여 Azure Synapse에서 데이터를 읽고 Azure Databricks의 데이터를 Azure Synapse의 새 테이블에 쓰는 경우에만 관련이 있습니다. externalDataSource 또는 forwardSparkAzureStorageCredentials와 같은 useAzureMSI를 사용하는 동안 다른 스토리지 인증 유형을 지정하지 않아야 합니다.
  • checkpointLocationnumStreamingTempDirsToKeep Azure Databricks에서 Azure Synapse의 새 테이블로 쓰기를 스트리밍하는 데만 관련이 있습니다.
  • 모든 데이터 원본 옵션 이름은 대소문자를 구분하지 않지만, 명확성을 높이기 위해 "카멜 케이스"로 지정하는 것이 좋습니다.

Azure Synapse로의 쿼리 푸시다운

Azure Synapse 커넥터는 다음 연산자를 Azure Synapse로 푸시하는 최적화 규칙 집합을 구현합니다.

  • Filter
  • Project
  • Limit

ProjectFilter 연산자는 다음 식을 지원합니다.

  • 대부분의 부울 논리 연산자
  • 비교
  • 기본 산술 연산
  • 숫자 및 문자열 캐스트

Limit 연산자의 경우 지정된 순서가 없는 경우에만 푸시다운이 지원됩니다. 예시:

SELECT TOP(10) * FROM table이지만, SELECT TOP(10) * FROM table ORDER BY col이 아닙니다.

참고

Azure Synapse 커넥터는 문자열, 날짜 또는 타임스탬프에서 작동하는 식을 푸시다운하지 않습니다.

Azure Synapse 커넥터를 사용하여 빌드된 쿼리 푸시다운은 기본적으로 사용하도록 설정됩니다. spark.databricks.sqldw.pushdownfalse로 설정하여 사용하지 않도록 설정할 수 있습니다.

임시 데이터 관리

Azure Synapse 커넥터는 Blob Storage 컨테이너에서 만든 임시 파일을 삭제하지 않습니다. 따라서 사용자가 제공한 tempDir 위치에서 임시 파일을 주기적으로 삭제하는 것이 좋습니다.

데이터 정리를 용이하게 하기 위해 Azure Synapse 커넥터는 데이터 파일을 tempDir 바로 아래에 저장하지 않고 대신 <tempDir>/<yyyy-MM-dd>/<HH-mm-ss-SSS>/<randomUUID>/ 형식의 하위 디렉터리를 만듭니다. 지정된 임계값(예: 2일)보다 오래된 하위 디렉터리를 재귀적으로 삭제하도록 정기적인 작업(Lakeflow 작업 기능 사용)을 설정할 수 있으며, 해당 임계값보다 오래 실행되는 Spark 작업은 있을 수 없다는 가정하에 가능합니다.

더 간단한 대안은 전체 컨테이너를 주기적으로 삭제하고 이름이 같은 새 컨테이너를 만드는 것입니다. 이렇게 하려면 Azure Synapse 커넥터에서 생성한 임시 데이터에 전용 컨테이너를 사용해야 하며 커넥터와 관련된 쿼리가 실행되고 있지 않음을 보장할 수 있는 기간을 찾을 수 있어야 합니다.

임시 개체 관리

Azure Synapse 커넥터는 Azure Databricks 클러스터와 Azure Synapse 인스턴스 간의 데이터 전송을 자동화합니다. Azure Synapse 테이블 또는 쿼리에서 데이터를 읽거나 Azure Synapse 테이블에 데이터를 쓰기 위해 Azure Synapse 커넥터는 내부적으로 DATABASE SCOPED CREDENTIAL, EXTERNAL DATA SOURCE, EXTERNAL FILE FORMATEXTERNAL TABLE을 포함하여 임시 개체를 만듭니다. 이러한 개체는 해당 Spark 작업 기간 동안에만 활성 상태가 되고 그 후에 자동으로 삭제됩니다.

클러스터가 Azure Synapse 커넥터를 사용하여 쿼리를 실행 중일 때 Spark 드라이버 프로세스가 충돌하거나 강제로 다시 시작되는 경우 또는 클러스터가 강제로 종료되거나 다시 시작되면 임시 개체가 삭제되지 않을 수 있습니다. 이러한 개체의 식별 및 수동 삭제를 용이하게 하기 위해 Azure Synapse 커넥터는 Azure Synapse 인스턴스에서 만든 모든 중간 임시 개체의 이름 앞에 tmp_databricks_<yyyy_MM_dd_HH_mm_ss_SSS>_<randomUUID>_<internalObject> 형식의 태그를 추가합니다.

다음과 같은 쿼리를 사용하여 유출된 개체를 주기적으로 찾는 것이 좋습니다.

  • SELECT * FROM sys.database_scoped_credentials WHERE name LIKE 'tmp_databricks_%'
  • SELECT * FROM sys.external_data_sources WHERE name LIKE 'tmp_databricks_%'
  • SELECT * FROM sys.external_file_formats WHERE name LIKE 'tmp_databricks_%'
  • SELECT * FROM sys.external_tables WHERE name LIKE 'tmp_databricks_%'

스트리밍 검사점 테이블 관리

Azure Synapse 커넥터 는 새 스트리밍 쿼리가 시작될 때 생성되는 스트리밍 검사점 테이블을 삭제하지 않습니다. 이 동작은 DBFS의 checkpointLocation과 일치합니다. 따라서 나중에 실행하지 않거나 이미 검사점 위치가 제거된 쿼리에 대해 DBFS에서 검사점 위치를 제거할 때 동시에 검사점 테이블을 주기적으로 삭제하는 것이 좋습니다.

기본적으로 모든 검사점 테이블의 이름은 <prefix>_<query-id>입니다. 여기서 <prefix>은 기본값이 databricks_streaming_checkpoint인 구성 가능한 접두사이며 query_id_ 문자가 제거된 스트리밍 쿼리 ID입니다. 부실 또는 삭제된 스트리밍 쿼리에 대한 모든 검사점 테이블을 찾으려면 쿼리를 실행합니다.

SELECT * FROM sys.tables WHERE name LIKE 'databricks_streaming_checkpoint%'

Spark SQL 구성 옵션 spark.databricks.sqldw.streaming.exactlyOnce.checkpointTableNamePrefix로 접두사를 구성할 수 있습니다.

질문과 대답(FAQ)

Azure Synapse 커넥터를 사용하는 동안 오류가 발생했습니다. 이 오류가 Azure Synapse 또는 Azure Databricks에서 발생했는지 어떻게 알 수 있나요?

오류를 디버그하는 데 도움이 되도록 Azure Synapse 커넥터와 관련된 코드에서 throw된 모든 예외는 SqlDWException 특성을 확장하는 예외에 래핑됩니다. 예외도 다음과 같이 구분됩니다.

  • SqlDWConnectorException은 Azure Synapse 커넥터에서 발생한 오류를 나타냅니다.
  • SqlDWSideException은 연결된 Azure Synapse 인스턴스에서 throw된 오류를 나타냅니다.

"No access key found in the session conf or the global Hadoop conf(세션 conf 또는 전역 Hadoop conf에서 액세스 키를 찾을 수 없음)" 오류로 인해 쿼리가 실패한 경우 어떻게 해야 하나요?

이 오류는 Azure Synapse 커넥터가 Notebook 세션 구성 또는 tempDir에 지정된 스토리지 계정에 대한 전역 Hadoop 구성에서 스토리지 계정 액세스 키를 찾을 수 없음을 의미합니다. 스토리지 계정 액세스를 올바르게 구성하는 방법에 대한 예제는 사용량(Batch)을 참조하세요. Azure Synapse 커넥터를 사용하여 Spark 테이블을 만든 경우 Spark 테이블에서 읽거나 쓰려면 스토리지 계정 액세스 자격 증명을 제공해야 합니다.

SAS(공유 액세스 서명)를 사용하여 tempDir에 지정된 Blob Storage 컨테이너에 액세스할 수 있나요?

Azure Synapse는 SAS를 사용하여 Blob Storage에 액세스하는 기능을 지원하지 않습니다. 따라서 Azure Synapse 커넥터를 사용하면 SAS에서는 tempDir에 지정된 Blob Storage 컨테이너에 액세스할 수 없습니다.

dbTable 옵션과 함께 Azure Synapse 커넥터를 사용하여 Spark 테이블을 만들고, 이 Spark 테이블에 일부 데이터를 쓴 다음, 이 Spark 테이블을 삭제했습니다. Azure Synapse 쪽에서 만든 테이블이 삭제되나요?

아니요. Azure Synapse는 외부 데이터 원본으로 간주됩니다. dbTable을 통해 이름이 설정된 Azure Synapse 테이블은 Spark 테이블을 삭제할 때 삭제되지 않습니다.

Azure Synapse에 DataFrame을 쓸 때 .option("dbTable", tableName).save()이 아닌 .saveAsTable(tableName)를 사용해야 하는 이유는 무엇인가요?

.option("dbTable", tableName)은 데이터베이스(즉, Azure Synapse) 테이블을 참조하고, .saveAsTable(tableName)은 Spark 테이블을 참조한다는 것을 명확하게 구분하기 위해서입니다. 실제로 df.write. ... .option("dbTable", tableNameDW).saveAsTable(tableNameSpark) 이 둘을 결합하여 Azure Synapse에 tableNameDW라는 테이블과 Spark에 Azure Synapse 테이블을 통해 지원되는 tableNameSpark라는 외부 테이블을 만들 수도 있습니다.

경고

.save().saveAsTable()은 다음과 같은 차이점이 있습니다.

  • df.write. ... .option("dbTable", tableNameDW).mode(writeMode).save()의 경우 writeMode는 예상대로 Azure Synapse 테이블에서 작동합니다.
  • df.write. ... .option("dbTable", tableNameDW).mode(writeMode).saveAsTable(tableNameSpark)의 경우, writeMode는 Spark 테이블에서 작업을 수행하며, 반면에 tableNameDW는 Azure Synapse에 이미 존재하면 자동으로 덮어씁니다.

이 동작은 다른 데이터 원본에 쓰는 동작과 다르지 않습니다. 이는 Spark DataFrameWriter API의 주의 사항일 뿐입니다.