web-dev-qa-db-ja.com

sqoopの次のコマンドは何ですか?

誰でも、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

12
DrewRose

-split-by:インポートの分割を生成するために使用されるテーブルの列を指定するために使用されます。つまり、クラスターにデータをインポートするときに、分割を作成するために使用する列を指定します。これを使用して、より大きな並列処理を実現することにより、インポートのパフォーマンスを向上させることができます。 Sqoopは、インポートコマンドを介してユーザーが--split-byで指定したテーブルの特定の列の値に基づいてスプリットを作成します。使用できない場合は、入力テーブルの主キーを使用して分割が作成されます。

使用する理由:主キーの最小値と最大値の間に値の均等な分布がない場合があります(これは--split-byが使用できない場合に分割を作成するために使用されます)。このような状況では、効率的なインポートのための分割を作成するためにデータが適切に分散されている他の列を指定できます。

-boundary-query:デフォルトでは、sqoopはクエリselect min()、max()fromを使用して、スプリットを作成するための境界を検出します。場合によっては、このクエリが最適ではないため、-boundary-query引数を使用して2つの数値列を返す任意のクエリを指定できます。

使用する理由: --split-byが最適なパフォーマンスを提供していない場合、これを使用してパフォーマンスをさらに改善できます。

36
Tariq

-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)」などを実行する場合があります。 。

21
Mukesh S

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;
12
KevinC

また、二重引用符( "")内で_--query_値を指定する場合は、_$CONDITIONS_の前にslash(\)を付ける必要があります。

_--query "select * from table where id=5 AND \$CONDITIONS"
_

さもなければ

_--query 'select * from table where id=5 AND $CONDITIONS' 
_
2
jatin bhola

分割:

  1. なぜそれが使われるのですか? -> rdbmsからhadoopにデータをフェッチする際の速度を向上させる
  2. 使い方? ->デフォルトではsqoopに4つのマッパーがあるため、インポートは並行して動作します。データ全体が等しいパーティションに分割されます。 Sqoopはデータを分割するために主キー列を考慮し、そこから最大範囲と最小範囲を見つけて、4つのマッパーが機能するように4つの範囲を作成します。 主キー列に1000レコード、最大値= 1000、最小値-0なので、sqoopは(0-250)、(250-500)、(500-750)、 (750-1000)および列の値に応じて、データが分割され、4つのマッパーに渡されてHDFSに格納されます。そのため、主キー列が均等に分散されていない場合は、split-byを使用して、均等に分割するように列名を変更できます。

要するに:並列化をサポートし、パフォーマンスを向上させるためのデータのパーティション化に使用されます

1
Tutu Kumari