Sqoop を使用して Data Lake Storage Gen1 と Azure SQL Database の間でデータをコピーする
Apache Sqoop を使用して、Azure SQL Database と Azure Data Lake Storage Gen1 の間でデータをインポートおよびエクスポートする方法について説明します。
Sqoop とは
ビッグ データ アプリケーションは、ログやファイルなどの非構造化データと半構造化データを処理するための自然な選択肢です。 ただし、リレーショナル データベースに格納されている構造化データを処理する必要がある場合もあります。
Apache Sqoop は、リレーショナル データベースと Data Lake Storage Gen1 などのビッグ データ リポジトリの間でデータを転送するように設計されたツールです。 これを使用して、Azure SQL Database などのリレーショナル データベース管理システム (RDBMS) から Data Lake Storage Gen1 にデータをインポートできます。 その後、ビッグ データ ワークロードを使用してデータを変換および分析し、そのデータを RDBMS にエクスポートし直すことができます。 この記事では、Azure SQL Database のデータベースをリレーショナル データベースとして使用し、インポート/エクスポートを行います。
前提条件
始める前に、次のものを用意する必要があります:
- Azure サブスクリプション。 Azure 無料試用版の取得に関するページを参照してください。
- Azure Data Lake Storage Gen1 アカウント。 アカウントを作成する方法については、「Azure Data Lake Storage Gen1 の使用を開始する」を参照してください。
- Azure HDInsight クラスター は、Data Lake Storage Gen1 アカウントにアクセスできます。 Data Lake Storage Gen1 を使用した HDInsight クラスターの作成に関する記事を参照してください。 この記事では、Data Lake Storage Gen1 アクセス権を持つ HDInsight Linux クラスターがあることを前提としています。
- Azure SQL データベース。 Azure SQL Database でデータベースを作成する方法については、「Azure SQL Database でのデータベースの作成」を参照してください。
データベースにサンプル テーブルを作成する
まず、データベースに 2 つのサンプル テーブルを作成します。 SQL Server Management Studio または Visual Studio を使用してデータベースに接続し、次のクエリを実行します。
Table1 の作成
CREATE TABLE [dbo].[Table1]( [ID] [int] NOT NULL, [FName] [nvarchar](50) NOT NULL, [LName] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [ID] ASC ) ) ON [PRIMARY] GO
Table2 の作成
CREATE TABLE [dbo].[Table2]( [ID] [int] NOT NULL, [FName] [nvarchar](50) NOT NULL, [LName] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Table_2] PRIMARY KEY CLUSTERED ( [ID] ASC ) ) ON [PRIMARY] GO
次のコマンドを実行して、いくつかのサンプル データを Table1 に追加します。 Table2 は空のままにします。 後で、Table1 から Data Lake Storage Gen1 にデータをインポートします。 次に、Data Lake Storage Gen1 から Table2 にデータをエクスポートします。
INSERT INTO [dbo].[Table1] VALUES (1,'Neal','Kell'), (2,'Lila','Fulton'), (3, 'Erna','Myers'), (4,'Annette','Simpson');
Data Lake Storage Gen1 にアクセスできる HDInsight クラスターから Sqoop を使用する
HDInsight クラスターには、Sqoop パッケージが既に用意されています。 Data Lake Storage Gen1 を追加のストレージとして使用するように HDInsight クラスターを構成した場合は、Sqoop (構成を変更せずに) を使用して、Azure SQL Database などのリレーショナル データベースと Data Lake Storage Gen1 アカウントの間でデータをインポート/エクスポートできます。
この記事では、クラスターに接続するために SSH を使用する必要があるため、Linux クラスターを作成していることを前提としています。 Linux ベースの HDInsight クラスターへの接続を参照してください。
クラスターから Data Lake Storage Gen1 アカウントにアクセスできるかどうかを確認します。 SSH プロンプトから次のコマンドを実行します。
hdfs dfs -ls adl://<data_lake_storage_gen1_account>.azuredatalakestore.net/
このコマンドは、Data Lake Storage Gen1 アカウント内のファイル/フォルダーの一覧を提供します。
Azure SQL Database から Data Lake Storage Gen1 にデータをインポートする
Sqoop パッケージが使用可能なディレクトリに移動します。 通常、この場所は
/usr/hdp/<version>/sqoop/bin
。Table1 から Data Lake Storage Gen1 アカウントにデータをインポートします。 次の構文を使用します。
sqoop-import --connect "jdbc:sqlserver://<sql-database-server-name>.database.windows.net:1433;username=<username>@<sql-database-server-name>;password=<password>;database=<sql-database-name>" --table Table1 --target-dir adl://<data-lake-storage-gen1-name>.azuredatalakestore.net/Sqoop/SqoopImportTable1
sql-database-server-name プレースホルダーは、データベースが実行されているサーバーの名前を表します。 sql-database-name プレースホルダーは、実際のデータベース名を表します。
たとえば、
sqoop-import --connect "jdbc:sqlserver://mysqoopserver.database.windows.net:1433;username=user1@mysqoopserver;password=<password>;database=mysqoopdatabase" --table Table1 --target-dir adl://myadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1
データが Data Lake Storage Gen1 アカウントに転送されたことを確認します。 次のコマンドを実行します。
hdfs dfs -ls adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/
次の出力が表示されます。
-rwxrwxrwx 0 sshuser hdfs 0 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/_SUCCESS -rwxrwxrwx 0 sshuser hdfs 12 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/part-m-00000 -rwxrwxrwx 0 sshuser hdfs 14 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/part-m-00001 -rwxrwxrwx 0 sshuser hdfs 13 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/part-m-00002 -rwxrwxrwx 0 sshuser hdfs 18 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/part-m-00003
各 part-m-* ファイルは、ソース テーブル Table1 の行に対応します。 確認する part-m-* ファイルの内容を表示できます。
Data Lake Storage Gen1 から Azure SQL Database にデータをエクスポートする
Data Lake Storage Gen1 アカウントから Azure SQL Database の空のテーブル Table2 にデータをエクスポートします。 以下の構文を使用します。
sqoop-export --connect "jdbc:sqlserver://<sql-database-server-name>.database.windows.net:1433;username=<username>@<sql-database-server-name>;password=<password>;database=<sql-database-name>" --table Table2 --export-dir adl://<data-lake-storage-gen1-name>.azuredatalakestore.net/Sqoop/SqoopImportTable1 --input-fields-terminated-by ","
たとえば、
sqoop-export --connect "jdbc:sqlserver://mysqoopserver.database.windows.net:1433;username=user1@mysqoopserver;password=<password>;database=mysqoopdatabase" --table Table2 --export-dir adl://myadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1 --input-fields-terminated-by ","
データが SQL Database テーブルにアップロードされたことを確認します。 SQL Server Management Studio または Visual Studio を使用して Azure SQL Database に接続し、次のクエリを実行します。
SELECT * FROM TABLE2
このコマンドには、次の出力が必要です。
ID FName LName ------------------- 1 Neal Kell 2 Lila Fulton 3 Erna Myers 4 Annette Simpson
Sqoop の使用中のパフォーマンスに関する考慮事項
Data Lake Storage Gen1 にデータをコピーするための Sqoop ジョブのパフォーマンス チューニングについては、 Sqoop パフォーマンスのブログ投稿を参照してください。