誰でも、sqoopでの--split-byおよび境界クエリの使用法を教えてもらえますか?
sqoop import --connect jdbc:mysql:// localhost/my --username user --password 1234 --query 'select * from table where id = 5 AND $ CONDITIONS' --split-by table.id --target- dir/dir
-split-by:インポートの分割を生成するために使用されるテーブルの列を指定するために使用されます。つまり、クラスターにデータをインポートするときに、分割を作成するために使用する列を指定します。これを使用して、より大きな並列処理を実現することにより、インポートのパフォーマンスを向上させることができます。 Sqoopは、インポートコマンドを介してユーザーが--split-byで指定したテーブルの特定の列の値に基づいてスプリットを作成します。使用できない場合は、入力テーブルの主キーを使用して分割が作成されます。
使用する理由:主キーの最小値と最大値の間に値の均等な分布がない場合があります(これは--split-byが使用できない場合に分割を作成するために使用されます)。このような状況では、効率的なインポートのための分割を作成するためにデータが適切に分散されている他の列を指定できます。
-boundary-query:デフォルトでは、sqoopはクエリselect min()、max()fromを使用して、スプリットを作成するための境界を検出します。場合によっては、このクエリが最適ではないため、-boundary-query引数を使用して2つの数値列を返す任意のクエリを指定できます。
使用する理由: --split-byが最適なパフォーマンスを提供していない場合、これを使用してパフォーマンスをさらに改善できます。
-split-byは、テーブルからの値をマッパー全体に均一に分散するために使用されます。つまり、uに100個の一意のレコード(主キー)があり、4つのマッパーがある場合、-split-by(主キー列)は、データセットをマッパー間で均等に分散するのに役立ちます。
$ CONDITIONSはSqoopプロセスで使用され、内部で一意の条件式に置き換えられてデータセットを取得します。並列インポートを実行する場合、マップタスクは$ CONDITIONSの代わりに異なる値を使用してクエリを実行します。たとえば、1つのマッパーが「select bla from foo WHERE(id> = 0 AND id <10000)」を実行し、次のマッパーが「select bla from foo WHERE(id> = 10000 AND id <20000)」などを実行する場合があります。 。
Sqoopを使用すると、データを並行してインポートでき、-split-byおよび--boundary-queryを使用すると、より詳細に制御できます。テーブルをインポートするだけの場合は、PRIMARY KEYを使用しますが、より高度なクエリを実行する場合は、並列分割を行うために列を指定する必要があります。
つまり、
sqoop import \
--connect 'jdbc:mysql://.../...' \
--direct \
--username uname --password pword \
--Hive-import \
--Hive-table query_import \
--boundary-query 'SELECT 0, MAX(id) FROM a' \
--query 'SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND $CONDITIONS'\
--num-mappers 3
--split-by a.id \
--target-dir /data/import \
--verbose
境界クエリでは、最適化されたクエリを指定して最大値、最小値を取得できます。それ以外の場合は、-queryステートメントでMIN(a.id)、MAX(a.id)を実行しようとします。
結果は(min = 0、max = 30の場合)並列で実行される3つのクエリになります。
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 0 AND 10;
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 11 AND 20;
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 21 AND 30;
また、二重引用符( "")内で_--query
_値を指定する場合は、_$CONDITIONS
_の前にslash(\)
を付ける必要があります。
_--query "select * from table where id=5 AND \$CONDITIONS"
_
さもなければ
_--query 'select * from table where id=5 AND $CONDITIONS'
_
分割:
要するに:並列化をサポートし、パフォーマンスを向上させるためのデータのパーティション化に使用されます