銷售: 1-800-867-1380

SSIS 分區化和 Azure 元件

任何要在 Azure™ SQL 資料庫中使用的非一般資料集,都需要某種程度的分區化。您可以使用條件式分割和多個目的地配接器,在 Microsoft® SQL Server® Integration Services (SSIS) 中完成分區化。但這項技術受到若干限制:

  • 設計程序繁瑣。當您使用許多元件時,SSIS 的設計介面就會變得龐大而笨重。有些分區化配置可能會包含數百個分區。要設計可到達所有目的地的 SSIS 封裝,將成為耗時又容易出錯的工作,因為您必須開啟並設定每個元件。此外,如果您要將元件直接從開發環境移至實際執行環境,而不重新設計,則每個元件都必須有一個需要參數化的連線管理員。

    如需分區化的詳細討論 (包括原因和技術),請參閱部落格文章使用 SQL Azure 進行分區化

  • 在持續變動的環境下,常須重新設計。參數容許伺服器名稱和資料庫名稱的變動,但不容許目的地數量的變動。在分區化資料存放區中,分區的數量可能會頻繁變動。就傳統的預設元件而言,若要變動,則必須重新設計並部署 SSIS 封裝。SSIS 分區化目的地元件可克服此問題,因為它可在每次執行時讀取分區化目錄,並根據分區化目錄的內容建立正確的連線。

  • 預設目的地中的資料表名稱不是動態的。若要在 Azure SQL 資料庫中插入資料,您可以使用 ADO.NET、ODBC 或 OLE DB 目的地配接器。但在這所有的元件中都必須設定資料表,且資料表不可參數化。在某些邏輯分區化案例中,是可以實際變動資料表名稱,或新增其他資料表的。分區化元件容許資料表名稱在目的地中也是動態的。

  • 沒有可用於 Azure 或壓縮的 SSIS 元件存在。當您的資料透過廣域或低頻寬連線移動時,您必須壓縮檔案並分割大型的資料集,讓資料可從來源藉由解壓縮處理到達目的地。Blob 來源和目的地元件可讓您分割資料、壓縮檔案、移入及移出 Azure Blob 存放裝置 (在兩階段的移動作業中,或是在移入用於 HDInsight 之 Blob 存放裝置的作業中),並可讓您選擇性地使用佇列在受限的網路兩端啟用封裝功能,以處理管線中的區塊資料。

SSIS 資料庫分區化元件可協助您克服這些難題。

元件和分區化目錄設定指令碼可從 Microsoft 下載中心個別下載取得。若要使用元件的完整功能,請依照下列方式下載並安裝兩個檔案。

若要下載並安裝元件:

  1. 下載網站下載 SSIS Database Sharding Components.zip 檔案。

  2. 開啟檔案,並將內容移至您要安裝 SSIS 元件的電腦目錄中。

    note附註
    Microsoft SQL Server 2012 的 SSIS 必須安裝在預定要安裝這些元件的電腦上。

  3. 執行 SSISDatabaseSharding64.msi 安裝程式。

  4. 接受授權合約,然後按 [下一步]。所有元件和相依項目都會安裝。

  5. 開啟 SQL Server Data Tools,並啟動新的 SSIS 專案。

  6. 將資料流程工作拖曳至設計介面上,並點按兩下。

  7. 查看 SSIS 工具列,確定 Blob 目的地、Blob 來源和資料庫分區化元件都出現在工具箱中,如圖 1 所示。

    圖 1圖 1. 元件正確安裝後,Blob 目的地、Blob 來源和資料庫分區化元件都出現在您的資料流程工具箱中。

若要安裝分區化目錄:

  • 下載網站下載 Sharding Catalog Setup Scripts.zip 檔案。

  • 在 SQL Server 資料庫,或是在設計及執行封裝時可供使用的 Azure SQL 資料庫中,執行 ShardingSchema.sql 指令碼,然後執行 ShardingStoredProcedures.sql 指令碼。這兩個指令碼包含分區化目錄的資料表定義,以及可協助您設定有效分區化目錄的預存程序。

  • TestAndExamples.sql 指令碼中包含範例,說明如何使用預存程序來設定分區化目錄。

在安裝元件和分區化目錄後,您即可使用元件連接到任何 OLE DB 相容資料存放區中的分區化資料目的地,並將資料移至此處。

您可以使用分區化目的地,以手動方式輸入資料目的地。但若要在不重新開發封裝的情況下,使目的地的分區化配置變更功能發揮完整的效益,您必須設定分區化目錄。本節將為您逐步解說使用預存程序設定分區化目錄的步驟。

完整設定的分區化目錄會包含下列元素:

  1. 一或多部資料庫伺服器在分區化目錄中,您必須輸入每部包含要在分區化配置中使用之資料庫的伺服器。這項資訊會指出伺服器的定位方式,且會包含分區化元件將用來建置連線字串的伺服器名稱。

  2. 您必須設定的一或多個資料庫。每個資料庫都必須存在於已輸入分區化目錄中的伺服器內。分區化目的地元件會使用資料庫名稱來建立必要連線。

  3. 您至少必須建立一個的分區集。分區集會指出您將如何識別要用來分送資料的分區化配置。分區化資料存放區是最理想的分區集。

  4. 您至少必須為每個分區集建立一個的分區化分佈。此分佈會將分區化配置定義為 POINTRANGE、定義要以哪一個資料行作為分區化索引鍵,以及定義資料行的資料類型為何此外,如果使用了 FLOATDOUBLE 之類的資料類型,則也會提供資料行的相關資訊。

  5. 您必須為每個分區化分佈設定的成員。此成員資格會定義將會傳送哪些包含特定值的資料表和資料庫資料列。每個分區成員都必須與一個資料庫相關聯。

以下提供完整的範例設定。

-- First, add the server.
DECLARE @srvid INT

EXEC [ShardMeta].[AddServerToShardingScheme] 
@ServerName= 'changed.database.windows.net'
,@Descr= 'Destination Server for the Demo'
,@ServerID = @srvid OUTPUT

-- Next, add the shard databases.

DECLARE @shard0ID INT
DECLARE @shard1ID INT
DECLARE @shard2ID INT
DECLARE @shard3ID INT
DECLARE @shard4ID INT
DECLARE @shard5ID INT
DECLARE @shard6ID INT
DECLARE @shard7ID INT
DECLARE @shard8ID INT
DECLARE @shard9ID INT
DECLARE @shard10ID INT

EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD000'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard0ID OUTPUT

EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD001'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard1ID OUTPUT

EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD002'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard2ID OUTPUT

EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD003'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard3ID OUTPUT

EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD004'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard4ID OUTPUT


EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD005'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard5ID OUTPUT

EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD006'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard6ID OUTPUT


EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD007'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard7ID OUTPUT

EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD008'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard8ID OUTPUT

EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD009'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard9ID OUTPUT


EXEC [ShardMeta].[AddDatabaseToShardingScheme]
@ServerID= @srvid
,@DatabaseName= 'SHARD010'
,@Descr= 'Destination Database for the Demo'
,@DatabaseID= @shard10ID OUTPUT

-- Next, add the shard set.

DECLARE @ShardSID INT

EXEC [ShardMeta].[AddShardSetToShardingScheme]
@name= 'Point Distro For demo'
,@Descr= 'Point Distribution for Demo'
,@ShardSetID= @ShardSID OUTPUT

-- Add a distribution to the shard set.

-- There are only two types of @Distribution_type:
-- POINT and RANGE
-- POINT means only one value per shard. Example: col1 = 1 or col1 = 2
-- RANGE means a range goes into the shard. Example: -1 < col1 <= 2
-- When @Boundary_value_in_high, the upper bound of a range is included
-- in the shard, but not the lower. So when this is set to 1,
-- a range of -1 to 2 would be: -1 < col1 <= 2
-- Conversely, if it is set to 0, the range from -1 to 2 would be
-- defined as: -1 <= col1 < 2
-- If the sharding column is a system data type, both the
-- @System_Type_Name and @User_type_name parameters contain the system data type name.
-- If the user type is different, name the type name in the @User_Type_Name 
-- parameter.


EXEC [ShardMeta].[AddShardDistributionToShardingScheme]
@ShardSetID= @ShardSID
,@Distribution_Name= 'Point Distro For demo'
,@Distribution_Type= 'POINT'
,@System_Type_Name= 'INT'
,@User_type_name= 'INT'
,@Boundary_value_in_high = 1

-- Add in the members for the “Point Distro For demo” distribution.

-- @MemberID must be unique within each @ShardSetID.
-- The order of MemberID is the order in which the conditions will be
-- evaluated for placement into a shard.
-- @Name is the case-sensitive name of the column as it
-- will appear in the SSIS dataflow. If this is the name
-- of the column in the source, nothing must be done
-- to change this in the SSIS dataflow. However, if it does
-- not exist in the source, use a derived column to create the 
-- column in the dataflow before it reaches the sharding destination.
-- For POINT distributions, @Range_Low and @Range_High are the same.


EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 0
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard0ID
,@TableName= 'dbo.TestData'
,@Range_Low= 0
,@Range_High= 0

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 1
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard1ID
,@TableName= 'dbo.TestData'
,@Range_Low= 1
,@Range_High= 1

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 2
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard2ID
,@TableName= 'dbo.TestData'
,@Range_Low= 2
,@Range_High= 2

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 3
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard3ID
,@TableName= 'dbo.TestData'
,@Range_Low= 3
,@Range_High= 3

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 4
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard4ID
,@TableName= 'dbo.TestData'
,@Range_Low= 4
,@Range_High= 4

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 5
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard5ID
,@TableName= 'dbo.TestData'
,@Range_Low= 5
,@Range_High= 5

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 6
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard6ID
,@TableName= 'dbo.TestData'
,@Range_Low= 6
,@Range_High= 6

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 7
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard7ID
,@TableName= 'dbo.TestData'
,@Range_Low= 7
,@Range_High= 7

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 8
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard8ID
,@TableName= 'dbo.TestData'
,@Range_Low= 8
,@Range_High= 8

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 9
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard9ID
,@TableName= 'dbo.TestData'
,@Range_Low= 9
,@Range_High= 9

EXEC [ShardMeta].[AddShardSetMemberToShardingScheme]
@ShardSetID= @ShardSID
,@MemberID= 10
,@Distribution_Name= 'Point Distro For demo'
,@Name= 'ShardingKey'
,@DatabaseID= @Shard10ID
,@TableName= 'dbo.TestData'
,@Range_Low= 10
,@Range_High= 10

在示範資料集中,設定了 11 個分區。每個分區分別位於不同的資料庫中。其中設定了單一分區集和分區化分佈。資料分區化在 ShardingKey 上 (請留意須區分大小寫)。對於每個會進行資料導向的分區,都設定了一個分區集成員。在此配置中,只有 ShardingKey 0 到 10 中的項目會傳送至目的地。

建議您盡可能使用預存程序。但由於每個預存程序對資料輸入都會進行驗證,因此您可以在目錄資料表中找到預存程序所輸入的資料,且不需要預存程序即可加以修改。若要尋找您在預存程序中輸入的資料,請查看 ShardMeta 結構描述中的資料表。

在分區化目錄完成設定並指向實際資料庫後,您可以將此目錄用於資料傳輸。本節將以範例說明如何建立會使用分區化元件與分區化目錄的封裝。

在此範例中,來源和目的地資料表具有定義如下的結構描述。

CREATE TABLE [dbo].[TestData](
[KeyCol] [bigint] NOT NULL,
[IntCol1] [int] NOT NULL,
[IntCol2] [int] NOT NULL,
[IntCol3] [int] NOT NULL,
[CharCol1] [nvarchar](50) NOT NULL,
[CharCol2] [nvarchar](50) NOT NULL,
[CharCol3] [nvarchar](50) NOT NULL,
[CharCol4] [nvarchar](50) NOT NULL,
PRIMARY KEY CLUSTERED 
(
[KeyCol] ASC
)
)

您可以建立此資料表,並為其填入隨機資料,以使用您先前設定的分區目錄配置繼續完成範例設定:

  1. 開啟 SQL Server Data Tools,並建立新的 SSIS 專案。

  2. 在專案中建立封裝。

  3. 在封裝中新增資料流程工作,然後按一下 [資料流程] 索引標籤。

  4. 將 ADO.NET 來源拖曳至資料流程的設計介面上。

  5. 依照步驟建立連線管理員,並將其指向您的來源資料表。設定完成後,請加以關閉。

    note附註
    在上一節的分區化配置設定中,分區化索引鍵是名為 ShardingKey 的資料行。此索引鍵未存在於來源資料中,但它必須存在於 SSIS 資料流程中,資料才能到達資料庫分區化目的地。請使用衍生資料行在 SSIS 資料流程中建立此資料行。如果分區化索引鍵存在於本身的資料中,則無須執行此步驟。

  6. 將衍生資料行轉換拖曳至 SSIS 資料流程的設計介面上,然後將 ADO.NET 來源的輸出連接到這個元件。

  7. 依照下列方式設定衍生資料行轉換:

    1. ShardingKey 作為衍生資料行名稱。此名稱須區分大小寫,且必須符合分區化目錄中的分區化索引鍵資料行名稱。

    2. 在運算式中使用 [KeyCol] % 11。這會為分區化索引鍵指定 0 到 10 的可能值;此值會指出要如何設定分區化目錄以進行資料列導向。

    設定後的衍生資料行應會如圖 2 所示。

    圖 2圖 2. 將 ShardingKey 資料行新增至資料流程,並將其定義為 KeyCol 上的模數 11,而完整設定的衍生資料行。

  8. 將資料庫分區化目的地拖曳至資料流程設計介面上,並將衍生資料行轉換的輸出連接過去。

  9. 按兩下設計加以開啟,然後執行下列步驟:

    1. [請連接到分區化目錄] 下按一下 [新增],然後依序執行步驟,以定義指向您先前建立之分區化目錄資料庫的連線管理員。

    2. [請選取分區集] 清單中,選取您為此示範建立的分區集 (Point Distro for demo)。

    3. [目的地連線管理員] 下,按一下 [新增]。新的分區化連線管理員 (SHARDINGCM) 隨即出現。

    4. 指定要用來連接到目的地資料庫的使用者名稱和密碼。對於 Azure 資料庫,您無法使用安全性支援提供者介面 (SSPI)。

      note附註
      您可以僅定義一個使用者名稱和密碼,用以連接到所有參與分區化配置的伺服器和資料庫。請確定您具有使用者名稱和密碼,且在每個資料庫中都有足夠的權限。

      note附註
      雖然您直接在此示範中設定使用者名稱和密碼,但這些項目都是可參數化的 — 如同在 SSIS 的其他連線管理員中設定的使用者名稱和密碼。由於使用者名稱和密碼是可參數化的,因此您可以在開發之後移動封裝,或是在執行時修改您的登入資訊。

      圖 3 顯示分區化目的地配接器的編輯器在您執行前述步驟後所呈現的內容。

      圖 3圖 3. 分區化目的地配接器的範例頁面 1。drxufmq90b.database.windows.net.ShardCatalog.AzureCat 連線管理員指向分區化目錄。使用的分區集名稱為 Point Distro For Azure CAT Summit。名為 SQL Sharding Connection Manager 的連線管理員,包含將用來連接到分區化配置中所有目的地資料庫的使用者名稱和密碼。

    5. 按一下 [確定],以結束 [分區化目的地連線管理員] 設定。

    6. 在分區化目的地配接器的編輯器中,按一下左窗格中的 [連線]。此時,編輯器會連接到分區化目錄,並依照分區化目錄中目前的定義顯示目的地,如圖 4 所示。請注意,其中只包含目前存在於分區化目錄中的資料。您可以在設計之後修改這項資料,因為在每次執行時,元件都會連接到分區化目錄以確認目前的目錄狀態。雖然您可能會想個別插入資料列以處理可能的主索引鍵違規,但在一般情況下,請選取 [使用大量插入] 核取方塊。

      圖 4圖 4. 分區化目的地配接器的連線頁面。運算式和資料表中的資訊皆已從定義於頁面 1 上的分區化目錄中提取出來。

    7. 按一下左窗格中的 [對應]。元件會自動對應同名的資料行,如圖 5 所示。但如果資料行具有不同的名稱,您可以手動加以對應。在此情況下請留意到,ShardingKey 以外的所有資料行都會對應。ShardingKey 不會存在於目的地資料表中,而僅存在於資料流程中,以便分區化目的地元件將資料列導向至正確的分區。

      圖 5圖 5. 分區化目的地配接器中的對應頁面。

    8. 按一下 [確定] 以結束編輯器。

  10. 選取資料庫分區化目的地配接器,然後按一下 SQL Server Data Tools 中的 [屬性] 索引標籤。在自訂屬性中,請特別留意 FaultToleranceRetryStrategy。暫時性錯誤處理會建置到分區化目的地中。在此會設定屬性,以便您變更重試策略、要嘗試的重試次數,以及重試間隔。這些屬性全都會設定為自訂屬性,因此全部皆可參數化,讓您能夠在執行時加以變更。

至此,封裝已可供執行或部署。如果您新增或移除分區,或是在兩次執行之間變更了分區,新的分區化組態將會在下次執行封裝時被讀取。資料將會依照它在執行開始時存在於目錄中的狀態,傳送至資料庫和資料表。

除了資料庫分區化目的地以外,您也可以使用元件將資料傳送至 Azure Blob 存放裝置,或是從 Azure Blob 存放裝置擷取資料。這些元件是 Blob 來源和 Blob 目的地元件。

要完成 Blob 目的地配接器的資訊,必須指定 Azure 存放裝置帳號和金鑰、解壓縮資料的目標區塊大小,以及用來儲存檔案的基本檔案名稱。請使用 [容器] 清單來選取目標容器。[存在的 Blob] 清單只會顯示已儲存在所選容器中的檔案,以協助您避免名稱衝突。編輯器在填入內容後,可能會如圖 6 所示。

圖 6

圖 6. SSIS 的 Azure Blob 目的地範例。

在 SSIS 封裝執行時,Blob 目的地會分割資料,並在指定的 Blob 容器中建立 GNU zip (gzip) 檔案。此外也會在與指定的檔案名稱同名的儲存帳號中建立佇列。Blob 目的地會在您必須進一步處理壓縮檔案時,將每個已建立之檔案的名稱放在此佇列中。您可以使用 Neudesic Azure 存放裝置總管之類的工具檢視佇列及其內容,或是在您必須重新作業時清除佇列。

Blob 來源元件可作為 Blob 目的地元件所建立之資料檔案的來源。若要使用 Blob 來源元件,請完成 [儲存帳號名稱][儲存帳號金鑰] 方塊中的資訊。接著即會自動填入容器清單。請選取容器,然後選擇是否必須從佇列中進行擷取。(建議您一律使用此選項。如果要對同一組資料檔案執行多個封裝執行個體,則務必要使用此選項。)範例如圖 7 所示。

圖 7

圖 7

由於 Blob 儲存目的地只會在 Blob 存放裝置中儲存壓縮的分隔符號檔案,因此 HDInsight 可直接取用產生的檔案。資料列會以資料列分隔符號標籤分隔,資料行則會以資料行分隔符號標籤分隔。資料行標頭會儲存在檔案存放所在的容器所載入的資料行標頭檔案中。

本文對您有任何幫助嗎?
(剩餘 1500 個字元)
感謝您提供意見
顯示:
© 2015 Microsoft