使用 Spark 連接器加速即時巨量資料分析

適用于:Azure SQL資料庫 Azure SQL 受控執行個體

注意

截至 2020 年 9 月,這個連接器都不在主動維護範圍內。 不過,適用於 SQL Server 和 Azure SQL 的 Apache Spark 連接器現在已可供使用,並支援 Python 和 R 繫結,提供更容易使用的介面,方便您大量插入資料,同時還提供許多其他改善項目。 強烈建議您評估並使用新的連接器,而不要使用這個連接器。 舊連接器相關資訊 (此頁面) 的保留僅供保存使用。

Spark 連接器可讓 Azure SQL Database、Azure SQL 受控執行個體和 SQL Server 中的資料庫作為 Spark 作業的輸入資料來源或輸出資料接收。 此連接器可讓您利用巨量資料分析中的即時交易資料,並將保存臨機操作查詢或報告的結果。 相較於內建的 JDBC 連接器,此連接器提供大量插入資料至至您資料庫的能力。 這可以用快 10 到 20 倍的效能執行逐列插入。 Spark 連接器支援 Azure Active Directory (Azure AD) 驗證以連接至 Azure SQL Database 和 Azure SQL 受控執行個體,讓您可以使用 Azure AD 帳戶從 Azure Databricks 連接您的資料庫。 它提供類似內建 JDBC 連接器的介面。 您可以輕鬆移轉現有的 Spark 作業以使用此新的連接器。

下載及建立 Spark 連接器

先前與此頁面連結的舊連接器所使用的 GitHub 存放庫不在主動維護範圍內。 我們反而會強烈建議您評估並使用新的連接器

官方支援的版本

元件 版本
Apache Spark 2.0.2 或更新版本
Scala 2.10 或更新版本
Microsoft JDBC Driver for SQL Server 6.2 或更新版本
Microsoft SQL Server SQL Server 2008 或更新版本
Azure SQL Database 支援
Azure SQL 受控執行個體 支援

Spark 連接器使用 Microsoft JDBC Driver for SQL Server,在 Spark 工作節點和資料庫之間移動資料:

資料流程如下:

  1. Spark 主要節點會連線到 SQL Database 或 SQL Server 中的資料庫,然後從特定資料表或使用特定 SQL 查詢來載入資料。
  2. Spark 主要節點將資料散發到背景工作節點以供轉換。
  3. 工作節點會連線到與 SQL Database 和 SQL Server 連接的資料庫,並將資料寫入資料庫。 使用者可以選擇使用逐列插入或大量插入。

下圖說明此資料流程。

圖表顯示描述的流程,其中主要節點會直接連線到資料庫,並連接到三個連接到資料庫的背景工作節點。

建立 Spark 連接器

目前,連接器專案會使用 maven。 若要建置沒有相依性的連接器,您可以執行︰

  • mvn 全新套件
  • 從發行資料夾下載最新版 JAR
  • 包含 SQL Database Spark JAR

使用 Spark 連接器連接和讀取資料

您可以從 Spark 作業連線到 SQL Database 和 SQL Server 中的資料庫,以讀取或寫入資料。 您也可以在 SQL Database 和 SQL Server 中的資料庫執行 DML 或 DDL 查詢。

從 Azure SQL 和 SQL Server 讀取資料

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
  "url"            -> "mysqlserver.database.windows.net",
  "databaseName"   -> "MyDatabase",
  "dbTable"        -> "dbo.Clients",
  "user"           -> "username",
  "password"       -> "*********",
  "connectTimeout" -> "5", //seconds
  "queryTimeout"   -> "5"  //seconds
))

val collection = sqlContext.read.sqlDB(config)
collection.show()

使用指定的 SQL 查詢,從 Azure SQL 和 SQL Server 讀取資料

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
  "url"          -> "mysqlserver.database.windows.net",
  "databaseName" -> "MyDatabase",
  "queryCustom"  -> "SELECT TOP 100 * FROM dbo.Clients WHERE PostalCode = 98074" //Sql query
  "user"         -> "username",
  "password"     -> "*********",
))

//Read all data in table dbo.Clients
val collection = sqlContext.read.sqlDB(config)
collection.show()

將資料寫入 Azure SQL 和 SQL Server

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

// Aquire a DataFrame collection (val collection)

val config = Config(Map(
  "url"          -> "mysqlserver.database.windows.net",
  "databaseName" -> "MyDatabase",
  "dbTable"      -> "dbo.Clients",
  "user"         -> "username",
  "password"     -> "*********"
))

import org.apache.spark.sql.SaveMode
collection.write.mode(SaveMode.Append).sqlDB(config)

在 Azure SQL 和 SQL Server 中執行 DML 或 DDL 查詢

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.query._
val query = """
              |UPDATE Customers
              |SET ContactName = 'Alfred Schmidt', City = 'Frankfurt'
              |WHERE CustomerID = 1;
            """.stripMargin

val config = Config(Map(
  "url"          -> "mysqlserver.database.windows.net",
  "databaseName" -> "MyDatabase",
  "user"         -> "username",
  "password"     -> "*********",
  "queryCustom"  -> query
))

sqlContext.sqlDBQuery(config)

使用 Azure AD 驗證,從 Spark 建立連線

您可以使用 Azure AD 驗證,連線到 Azure SQL Database 和 SQL 受控執行個體。 使用 Azure AD 驗證集中管理資料庫使用者的身分識別,並作為 SQL Server 的替代驗證。

使用 ActiveDirectoryPassword 驗證模式來連線

安裝需求

如果您使用 ActiveDirectoryPassword 驗證模式,必須下載 azure-activedirectory-library-for-java 及其相依項目,並將它們包含在 Java 建置路徑中。

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
  "url"            -> "mysqlserver.database.windows.net",
  "databaseName"   -> "MyDatabase",
  "user"           -> "username",
  "password"       -> "*********",
  "authentication" -> "ActiveDirectoryPassword",
  "encrypt"        -> "true"
))

val collection = sqlContext.read.sqlDB(config)
collection.show()

使用存取權杖來連線

安裝需求

如果您使用存取權杖型驗證模式,必須下載 azure-activedirectory-library-for-java及其相依項目,並將它們包含在 Java 建置路徑中。

請參閱使用 Azure Active Directory 驗證系統進行驗證,了解如何取得 Azure SQL Database 或 Azure SQL 受控執行個體中資料庫的存取權杖。

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
  "url"                   -> "mysqlserver.database.windows.net",
  "databaseName"          -> "MyDatabase",
  "accessToken"           -> "access_token",
  "hostNameInCertificate" -> "*.database.windows.net",
  "encrypt"               -> "true"
))

val collection = sqlContext.read.sqlDB(config)
collection.show()

使用大量插入來寫入資料

傳統 jdbc 連接器使用逐列插入方式將資料寫入您的資料庫。 使用 Spark 連接器,您可以使用大量插入功能,將資料寫入 Azure SQL 和 SQL Server。 在載入大型資料集或將資料載入使用資料行存放區索引的資料表時,它會大幅改善寫入效能。

import com.microsoft.azure.sqldb.spark.bulkcopy.BulkCopyMetadata
import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

/**
  Add column Metadata.
  If not specified, metadata is automatically added
  from the destination table, which may suffer performance.
*/
var bulkCopyMetadata = new BulkCopyMetadata
bulkCopyMetadata.addColumnMetadata(1, "Title", java.sql.Types.NVARCHAR, 128, 0)
bulkCopyMetadata.addColumnMetadata(2, "FirstName", java.sql.Types.NVARCHAR, 50, 0)
bulkCopyMetadata.addColumnMetadata(3, "LastName", java.sql.Types.NVARCHAR, 50, 0)

val bulkCopyConfig = Config(Map(
  "url"               -> "mysqlserver.database.windows.net",
  "databaseName"      -> "MyDatabase",
  "user"              -> "username",
  "password"          -> "*********",
  "dbTable"           -> "dbo.Clients",
  "bulkCopyBatchSize" -> "2500",
  "bulkCopyTableLock" -> "true",
  "bulkCopyTimeout"   -> "600"
))

df.bulkCopyToSqlDB(bulkCopyConfig, bulkCopyMetadata)
//df.bulkCopyToSqlDB(bulkCopyConfig) if no metadata is specified.

下一步

如果您還沒有下載此連接器,請從 azure-sqldb-spark GitHub 存放庫下載 Spark 連接器,並探索存放庫中的其他資源:

您也可以檢閱 Apache Spark SQL、DataFrame 和 Dataset 指南 (英文) 和 Azure Databricks 文件