複数のHDFSストレージフォーマットでのSqoop全量およびインクリメンタルインポート

6224 ワード

背景環境の紹介
  • CentOS 6.7
  • MySQL 5.7
  • Coudera 5.13.0

  • 1.データの準備(MySQL)
    1.mysqlでsqp_を作成するtestテーブル
    drop table if exists sqp_test;
    create table sqp_test(
        id bigint PRIMARY KEY AUTO_INCREMENT  COMMENT '  ID',
        c1 varchar(64),
        c2 text,
        c3 int,
        c4 bigint,
        c5 double,
        c6 decimal(22,6),
        c7 datetime
    );
    

    2.さまざまなタイプのデータを挿入します.文字列には特殊な文字が含まれています.
    truncate table sqp_test;
    
    INSERT INTO sqp_test
    (c1, c2, c3, c4, c5, c6, c7)
    VALUES('    ', '    ', 100, 100, 100.2, 100.2, '2019-01-01 12:10:10');
    INSERT INTO sqp_test
    (c1, c2, c3, c4, c5, c6, c7)
    VALUES('null  ', null, null, null, null, null, '2019-01-01 23:59:59');
    
    INSERT INTO sqp_test
    (c1, c2, c3, c4, c5, c6, c7)
    VALUES('    ', '', null, null, null, null, null);
    
    INSERT INTO sqp_test
    (c1, c2, c3, c4, c5, c6, c7)
    VALUES('    ', '\t|\\|\'|
    |,|\"|@|', null, null, null, null, '2019-01-02 12:12:12.2345'); INSERT INTO sqp_test (c1, c2, c3, c4, c5, c6, c7) VALUES('end', 'ABCDEFG,ABCD', PI(), PI(), PI(), PI(), '2019-01-02 12:12:12.2345');

    2.ORCストレージでのSqoopインポート
    ORC(Optimized Row Columnar、最適化された行列記憶)は、データの読み書き速度が速く、サポートされるデータ型が広く、ZLIB、SNAPPY圧縮をサポートしています.
    2.1全量
    ターゲットテーブルorcフォーマットストレージを作成し、SNAPPY方式で圧縮するターゲットテーブル
    drop table if exists default.sqp_test_orc;
    create table default.sqp_test_orc(
        id bigint COMMENT '  ID',
        c1 string,
        c2 string,
        c3 int,
        c4 bigint,
        c5 double,
        c6 decimal(22,6),
        c7 string
    ) stored as orc tblproperties ("orc.compress"="SNAPPY");
    

    sqoopインポート1.インポート前にターゲットテーブルを空にする
    hive -e "truncate table default.sqp_test_orc"
    

    2.sqoopインポートの実行
    sqoop import  \
    --connect "jdbc:mysql://quickstart.cloudera:3306/devdb?useUnicode=true&characterEncoding=UTF-8" \
    --username devuser \
    --password devuser \
    --table  sqp_test \
    --split-by id \
    --num-mappers 1 \
    --hcatalog-database default \
    --hcatalog-table sqp_test_orc \
    --hcatalog-storage-stanza 'stored as orc tblproperties ("orc.compress"="SNAPPY")'
    

    **関連パラメータの説明**
  • –num-mappersまたは-mはN個のmapを起動してデータを並列にインポートします.デフォルトは4個です.数値をクラスタのノード数より高く設定しないほうがいいです.テスト環境リソースは1つの
  • しか指定しません.
  • –split-by mapタスクの分割に使用するフィールドを指定し、指定した一意性の高いフィールドを使用することを推奨します.このパラメータを指定しないと、ソース・テーブルのプライマリ・キー・フィールドが自動的に検索され、ソース・テーブルにプライマリ・キー・フィールドがないとエラーが表示されます.-num-mappersが1に指定されている場合、mapタスクの分割は行われず、このオプションは無効です.
  • –hcatalog-databaseターゲットライブラリ名
  • –hcatalog-tableターゲットテーブル名
  • –hcatalog-storage-stanzaストレージフォーマットを指定します.デフォルト:stored as orcfile**注意:hcatalogモード–hive-overwriteは効果がないので、truncateデータプログラム**
  • を追加します.
    2.2増分
    インクリメンタルパーティション表の作成
    drop table if exists default.sqp_test_orc_add;
    create table default.sqp_test_orc_add(
        id bigint COMMENT '  ID',
        c1 string,
        c2 string,
        c3 int,
        c4 bigint,
        c5 double,
        c6 decimal(22,6),
        c7 string
    )
    COMMENT 'sqoop       '
    partitioned by (etl_date string  COMMENT '    ') 
    stored as orc tblproperties ("orc.compress"="NONE");
    

    1.データをインポートする前にターゲットパーティションデータを空にする
    hive -e "alter table default.sqp_test_orc_add DROP IF EXISTS partition(etl_date='20190101')"
    

    2.sqoopインポートを実行し、queryでインクリメンタルフィルタ条件をフィルタする
    sqoop import  \
    --connect "jdbc:mysql://quickstart.cloudera:3306/devdb?useUnicode=true&characterEncoding=UTF-8" \
    --username devuser \
    --password devuser \
    --query "select * from  sqp_test where c7>='2019-01-01' and c7

    3.次の日のデータを実行し、–whereでインクリメンタルフィルタ条件を指定します.
    hive -e "alter table default.sqp_test_orc_add DROP IF EXISTS partition(etl_date='20190102')"
    
    sqoop import  \
    --connect "jdbc:mysql://quickstart.cloudera:3306/devdb?useUnicode=true&characterEncoding=UTF-8" \
    --username devuser \
    --password devuser \
    --table  sqp_test \
    --where "c7>='2019-01-02' and c7

    3.TextFileでのSqoopインポート
    3.1全量
    TextFileはhiveのデフォルトのフォーマットで、最初にインポートしたときにhiveがテーブルを作成しなかった場合、リレーショナル・データベースのテーブル構造に基づいて自動的にhiveテーブルが生成されます.
    sqoop import  \
    --connect "jdbc:mysql://quickstart.cloudera:3306/devdb?useUnicode=true&characterEncoding=UTF-8" \
    --username devuser \
    --password devuser \
    --table  sqp_test \
    --null-string '\\N'   \
    --null-non-string '\\N'   \
    --hive-drop-import-delims \
    --split-by id \
    --num-mappers 1 \
    --hive-import \
    --hive-overwrite \
    --hive-database default \
    --hive-table sqp_test_txt
    

    **関連パラメータの説明**
  • -null-string文字タイプnull値のフォーマットです.指定されていない場合、文字列nullが使用されます.Nはhiveによってnull値
  • と識別できます.
  • –null-non-string非文字タイプnullのフォーマット.指定されていない場合、文字列nullは
  • で使用されます.
  • –hive-drop-import-delims hiveにデータをインポートすると、rと01のような文字
  • が削除されます.
  • –hive-delims-replacementデータの、r,and01などの文字
  • をカスタム文字列で置き換えます.
  • –directダイレクトインポートモード.リレーショナル・データベースに付属するインポート・エクスポート・ツールを使用します.TextFileでは効率を向上させることができますが、-null-string、-null-non-string、-hive-drop-import-delimsなどのオプションと競合しています.

  • 注意-hive-drop-import-delimsオプションは、hiveにデータをインポートすると、rおよび01のようなデフォルトの分割記号のみが削除されるため、ターゲットテーブルでは–fields-terminated-byおよび–lines-terminated-byパラメータを指定せずにデフォルトの分割方法を使用することが望ましい
    3.2増分
    sqoop import  \
    --connect "jdbc:mysql://quickstart.cloudera:3306/devdb?useUnicode=true&characterEncoding=UTF-8" \
    --username devuser \
    --password devuser \
    --table  sqp_test \
    --where "c7>='2019-01-01' and c7='2019-01-02' and c7

    4.ParquetでのSqoopインポート
    Parquetは劣勢なストレージ実装です.
    4.1全量
    sqoop import  \
    --connect "jdbc:mysql://quickstart.cloudera:3306/devdb?useUnicode=true&characterEncoding=UTF-8" \
    --username devuser \
    --password devuser \
    --table  sqp_test \
    --split-by id \
    --num-mappers 1 \
    --as-parquetfile \
    --hive-import \
    --hive-overwrite \
    --hive-database default \
    --hive-table sqp_test_prq
    

    4.2増分
    5.hbaseでのSqoopインポート
    5.1全量
    5.2増分