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 の使用を開始する」を参照してください
- Data Lake Storage Gen1 アカウントにアクセスできる Azure HDInsight クラスター。 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 アカウントの間でデータのインポートまたはエクスポートを行うことができます。
この記事では、Linux クラスターが作成されていて、SSH を使用してクラスターに接続する必要があることを前提とします。 「 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 のパフォーマンスに関するブログ記事を参照してください。