1. 概要Sqoop は、構造化データと Hadoop 間のバッチデータ移行のためのツールです。構造化データは、MySQL や Oracle などの RDBMS にすることができます。 Sqoop は、最下層で MapReduce プログラムを使用して、抽出、変換、およびロードを実装します。 MapReduce の固有の特性により、並列化と高い耐障害性が保証されます。 Kettle などの従来の ETL ツールと比較すると、タスクは Hadoop クラスター上で実行されるため、ETL サーバー リソースの使用量が削減されます。特定のシナリオでは、抽出プロセスのパフォーマンスが大幅に向上します。 Sqoop アーキテクチャ: - 公式サイト: https://sqoop.apache.org/
- 公式ドキュメント: https://sqoop.apache.org/docs/1.99.7/index.html
- GitHub: https://github.com/apache/sqoop
- Sqoop についてさらに詳しく知りたい場合は、次の記事も参照してください: Big Data Hadoop - データ同期ツール Sqoop
- ここでの Hadoop 環境の展開については、私の記事を参照してください: [クラウドネイティブ] Hadoop HA on k8s 環境の展開
- MySQL環境のデプロイについては、私の記事を参照してください: [Cloud Native] MySQL on k8s環境のデプロイ
2. オーケストレーションとデプロイメントを開始する1) Sqoopデプロイメントパッケージをダウンロードするダウンロードアドレス: http://archive.apache.org/dist/sqoop/ wget http://archive.apache.org/dist/sqoop/1.99.7/sqoop-1.99.7-bin-hadoop200.tar .gz tar - xf sqoop - 1.99 .7 - bin - hadoop200 .tar .gz 2) イメージを構築するDockerファイル myharbor.com/bigdata/centosより: 7.9.2009 RUN rm -f / etc / localtime && ln -sv / usr / share / zoneinfo / Asia / Shanghai / etc / localtime && echo "アジア/上海" > / etc / timezone 環境変数LANG = zh_CN .UTF - 8
groupadd --system --gid=10000 admin && useradd --system --home-dir /home/admin --uid=10000 --gid=admin -m admin を実行します。
### ツールをインストールする 実行 yum install -y vim tar wget curl less telnet net -tools lsof mysql
mkdir -p / opt / apacheを実行します
docker-entrypoint.sh/opt/apache/ をコピーします chmod + x /opt/apache/docker-entrypoint.sh を実行します。
JDK ADD jdk - 8 u212 - linux - x64 .tar .gz / opt / apache / 環境変数JAVA_HOME /opt/apache/jdk1.8.0_212 環境変数PATH = $JAVA_HOME / bin : $PATH
スクープ ADD sqoop - 1.99.7 - bin - hadoop200.tar.gz / opt / apache / # 環境変数を設定する ENV SQOOP_HOME =/ opt / apache / sqoop 環境変数PATH = $SQOOP_HOME / bin : $PATH 環境変数 SQOOP_SERVER_EXTRA_LIB = $SQOOP_HOME / lib ln -s / opt / apache / sqoop - 1.99.7 - bin - hadoop200 $SQOOP_HOME を実行します。 環境変数PATH = $SQOOP_HOME / bin : $PATH
# sqoop hadoop 環境設定 ADD hadoop - 3.3 .2 .tar .gz / opt / apache / ENV HADOOP_HOME =/ opt / apache / hadoop 実行ln -s / opt / apache / hadoop - 3.3 .2 $HADOOP_HOME ENV HADOOP_CONF_DIR = $ { HADOOP_HOME } / etc / hadoop 環境変数PATH = $ { HADOOP_HOME } / bin : $PATH
#mysql JDBC ドライバー # wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar コピー mysql -コネクタ- java - 8.0 .30 .jar $SQOOP_HOME / lib /
# チョーン chown - R admin を実行します: admin / opt / apache
#作業ディレクトリを設定する ワークディレクトリ $SQOOP_HOME
# スクリプトを実行します。イメージのビルド時には実行されませんが、インスタンスの実行時には実行されます。 エントリポイント[ "/opt/apache/docker-entrypoint.sh" ] イメージの構築を開始する ビルド sqoop を docker で実行します。 --キャッシュなし
# 画像をアップロードする docker push myharbor.com/bigdata/sqoop:sqoop-1.99.7-bin-hadoop200
# 画像を削除する docker rmi myharbor.com/bigdata/sqoop:sqoop-1.99.7-bin-hadoop200 crictl rmi myharbor.com/bigdata/sqoop:sqoop-1.99.7-bin-hadoop200 3) sqoopチャートテンプレートを作成するヘルムはsqoopを作成します 4) YAMLレイアウトを変更する画像: リポジトリ: myharbor.com/bigdata/sqoop プルポリシー: IfNotPresent # デフォルトがチャートの appVersionであるイメージ タグをオーバーライドします。 タグ: "sqoop-1.99.7-bin-hadoop200"
セキュリティコンテキスト: 実行ユーザー: 10000 実行グループ: 10000 特権: true
サービス: タイプ: ClusterIP ポート: 12000 - sqoop/テンプレート/configmap.yaml
APIバージョン: v1 種類: ConfigMap メタデータ: 名前: { { "sqoop.fullname"を含めます。 } } ラベル: { { - "sqoop.labels"を含めます。 |ニンデント4 } } データ: sqoop .properties : |- # Sqoop の設定。 # org .apache .sqoop .log4j .debug = false org .apache .sqoop .log4j .rootLogger = INFO 、ファイル org .apache .sqoop .log4j .category .org .apache .sqoop = INFO org .apache .sqoop .log4j .appender .file = org .apache .log4j .RollingFileAppender org .apache .sqoop .log4j .appender .file .File = @LOGDIR@ / sqoop .log org .apache .sqoop .log4j .appender .file .MaxFileSize = 25 MB org .apache .sqoop .log4j .appender .file .MaxBackupIndex = 5 org .apache .sqoop .log4j .appender .file .layout = org .apache .log4j .PatternLayout org .apache .sqoop .log4j .appender .file .layout .Cnotallow =% d { ISO8601 } %- 5 p [ % l ] % m % n # FileAuditLogger のデフォルト設定の監査ロガー org .apache .sqoop .log4j .logger .audit = INFO 、監査 org .apache .sqoop .log4j .appender .audit = org .apache .log4j .RollingFileAppender org .apache .sqoop .log4j .appender .audit .File = @LOGDIR@ / audit .log org .apache .sqoop .log4j .appender .audit .MaxFileSize = 25 MB org .apache .sqoop .log4j .appender .audit .MaxBackupIndex = 5 org .apache .sqoop .log4j .appender .audit .layout = org .apache .log4j .PatternLayout org .apache .sqoop .log4j .appender .audit .layout .Cnotallow =% d { ISO8601 } %- 5 p [ % l ] % m % n
# # 監査ロガーの設定 # ここでは複数の監査ロガーを指定できます。指定するには # 監査ロガーの場合、少なくとも org .apache .sqoopを追加する必要があります。 # 監査ロガー。 [ロガー名] .class .また、 # org .apache .sqoopを使用すると、より多くの構成オプションが利用可能になります。 # 監査ロガー。 [ LoggerName ]プレフィックスを付けると、これらすべてのオプション # はロガークラスに解析されます。 # org .apache .sqoop .auditlogger .default .class = org .apache .sqoop .audit .FileAuditLogger org .apache .sqoop .auditlogger .default .logger =監査
# # リポジトリの設定 # リポジトリサブシステムは特別なプレフィックスを提供します。 # は「org.apache.sqoop.repository.sysprop」です。いかなる財産も #が指定されている場合は、このプレフィックスが解析され、 # システムプロパティ。例えば、組み込みのDerbyリポジトリの場合 #が使用されている場合、 syspropプレフィックス付きプロパティを使用できます # 起動時にDerbyの設定に影響を与えるには、 # 適切なシステムプロパティ。 #
# リポジトリプロバイダー org.apache.sqoop.repository.provider = org.apache.sqoop.repository.JdbcRepositoryProvider
# リポジトリのアップグレード # trueに設定すると、 sqoop リポジトリ スキーマはアップグレードされません。デフォルトでは、サーバーの起動時にアップグレードが開始されます。 org .apache .sqoop .repository .schema .immutable = false
# JDBC リポジトリプロバイダーの設定 org .apache .sqoop .repository .jdbc .handler = org .apache .sqoop .repository .derby .DerbyRepositoryHandler org .apache .sqoop .repository .jdbc .transaction .isolatinotallow = READ_COMMITTED org .apache .sqoop .リポジトリ.jdbc .最大.cnotallow = 10 org .apache .sqoop .repository .jdbc .url = jdbc : derby : @BASEDIR@ / repository / db ;作成=真 org .apache .sqoop .repository .jdbc .driver = org .apache .derby .jdbc .EmbeddedDriver org .apache .sqoop .リポジトリ.jdbc .ユーザー= sa org .apache .sqoop .リポジトリ.jdbc .パスワード=
# 埋め込み Derby 構成のシステム プロパティ org .apache .sqoop .repository .sysprop .derby .stream .error .file = @LOGDIR@ / derbyrepo .log
# # Sqoop コネクタの設定 # trueに設定すると、サーバーの起動時にコネクタ構成のアップグレードが開始されます # org .apache .sqoop .connector .autoupgrade = false
# # Sqoop ドライバーの設定 # trueに設定すると、サーバーの起動時にドライバー構成のアップグレードが開始されます # org .apache .sqoop .driver .autoupgrade = false
# 設定ファイルを再読み込みするためのスリープ期間( 1 分に 1 回) org .apache .sqoop .core .configuration .provider .properties .sleep = 60000
# # 送信エンジンの設定 #
# 送信エンジンクラス org .apache .sqoop .submission .engine = org .apache .sqoop .submission .mapreduce .MapreduceSubmissionEngine
# ミリ秒数。この制限より前に作成された投稿は削除されます。デフォルトは 1 日です。 #org .apache .sqoop .submission .purge .threshold =
# パージスレッドがスリープするミリ秒数。デフォルトでは1 日 #org .apache .sqoop .submission .purge .sleep =
#更新スレッドがスリープするミリ秒数。デフォルトでは5分 #org .apache .sqoop .submission .update .sleep =
#Hadoop 構成ディレクトリ org .apache .sqoop .submission .engine .mapreduce .configuration .directory =/ opt / apache / hadoop / etc / hadoop /
# Sqoop Mapper / Reducer のログレベル org .apache .sqoop .submission .engine .mapreduce .configuration .loglevel = INFO
# #実行エンジンの設定 # org .apache .sqoop .execution .engine = org .apache .sqoop .execution .mapreduce .MapreduceExecutionEngine
# #認証設定 # #org .apache .sqoop .security .authentication .type = SIMPLE # org.apache.sqoop.security.authentication.handler = org.apache.sqoop.security.authentication.SimpleAuthenticationHandler #org .apache .sqoop .security .authentication .annotallow = true #org .apache .sqoop .security .authentication .type = KERBEROS # org.apache.sqoop.security.authentication.handler = org.apache.sqoop.security.authentication.KerberosAuthenticationHandler #org .apache .sqoop .security .authentication .kerberos .principal = sqoop / _HOST@NOVALOCAL #org .apache .sqoop .security .authentication .kerberos .keytab =/ home / kerberos / sqoop .keytab #org .apache .sqoop .security .authentication .kerberos .http .principal = HTTP / _HOST@NOVALOCAL #org .apache .sqoop .security .authentication .kerberos .http .keytab =/ home / kerberos / sqoop .keytab #org .apache .sqoop .security .authentication .enable .doAs = true #org .apache .sqoop .security .authentication .proxyuser .#USER# .users =* #org .apache .sqoop .security .authentication .proxyuser .#USER# .groups =* #org .apache .sqoop .security .authentication .proxyuser .#USER# .hosts =*
# デフォルトユーザー、デフォルト値は「sqoop.anonymous.user」です #org .apache .sqoop .security .authentication .default .user =
# # 認証設定 # # org.apache.sqoop.security.authorization.handler = org.apache.sqoop.security.authorization.DefaultAuthorizationHandler # org.apache.sqoop.security.authorization.access_cnotallow = org.apache.sqoop.security.authorization.DefaultAuthorizationAccessController # org.apache.sqoop.security.authorization.validator = org.apache.sqoop.security.authorization.DefaultAuthorizationValidator # org.apache.sqoop.security.authorization.authentication_provider = org.apache.sqoop.security.authorization.DefaultAuthenticationProvider #org .apache .sqoop .security .authorization .server_name = SqoopServer1
# # SSL / TLS 設定 # #org .apache .sqoop .security .tls .enabled = false #org .apache .sqoop .security .tls .protocol = "TLSv1.2" #org .apache .sqoop .security .tls .keystore = #org .apache .sqoop .security .tls .keystore_password =
# # リポジトリの暗号化 #
#org .apache .sqoop .security .repo_encryption .enabled = true #org .apache .sqoop .security .repo_encryption .password = #org .apache .sqoop .security .repo_encryption .password_generator = #org .apache .sqoop .security .repo_encryption .hmac_algorithm = HmacSHA256 #org .apache .sqoop .security .repo_encryption .cipher_algorithm = AES #org .apache .sqoop .security .repo_encryption .cipher_key_size = 16 #org .apache .sqoop .security .repo_encryption .cipher_spec = AES / CBC / PKCS5Padding #org .apache .sqoop .security .repo_encryption .initialization_vector_size = 16 #org .apache .sqoop .security .repo_encryption .pbkdf2_algorithm = PBKDF2WithHmacSHA1 #org .apache .sqoop .security .repo_encryption .pbkdf2_rounds = 4000
# 外部コネクタの負荷パス # "/path/to/external/connectors/" :指定されたフォルダ内のすべてのコネクタJARを追加します # org .apache .sqoop .connector .external .loadpath =
# Sqoop アプリケーション クラスパス # sqoopに含める jar の":"区切りリスト。 # org .apache .sqoop .classpath .extra =
# すべてのジョブに含まれる Sqoop の追加クラスパス # マップジョブクラスパスに含める jar の":"区切りリスト。 # org .apache .sqoop .classpath .job =
# # Jetty サーバーの設定 # #org .apache .sqoop .jetty .thread .pool .worker .max = 500 #org .apache .sqoop .jetty .thread .pool .worker .min = 5 #org .apache .sqoop .jetty .thread .pool .worker .alive .time = 60 org .apache .sqoop .jetty .port = { { .Values .service .port } }
# ブラックリストに登録されたコネクタ # コネクタ名を「:」で区切ってリストしたもの。 # sqoopconnector .propertiesファイル org .apache .sqoop .connector .blacklist = - sqoop/テンプレート/statefulset.yaml
apiバージョン:アプリ/ v1 種類:ステートフルセット メタデータ: 名前: { { "sqoop.fullname"を含めます。 } } ラベル: { { - "sqoop.labels"を含めます。 |ニンデント4 } } 仕様: serviceName : { { "sqoop.fullname"を含めます。 } } { { - .Values .autoscaling .enabledでない場合} } レプリカ: { { .Values .replicaCount } } { { -終わり} } セレクター: マッチラベル: { { - "sqoop.selectorLabels"を含めます。 |ニンデント6 } } テンプレート: メタデータ: { { - .Values .podAnnotationsを使用} } 注釈: { { - toYaml 。 |ニンデント8 } } { { -終わり} } ラベル: { { - "sqoop.selectorLabels"を含めます。 |ニンデント8 } } 仕様: { { - .Values .imagePullSecretsを使用} } イメージプルシークレット: { { - toYaml 。 |ニンデント8 } } { { -終わり} } serviceAccountName : { { 「sqoop.serviceAccountName」を含めます。 } } セキュリティコンテキスト: { { - toYaml .Values .podSecurityContext |ニンデント8 } } コンテナ: -名前: { { .Chart .Name } } セキュリティコンテキスト: { { - toYaml .Values .securityContext |ニンデント12 } } 画像: "` `.`Values`.`image`.`repository `:{{ .Values.image.tag | default .Chart.AppVersion }}" イメージプルポリシー: { { .Values .image .pullPolicy } } ポート: -名前: sqoop コンテナポート: { { .Values .service .port } } プロトコル: TCP ボリュームマウント: -名前: { { .Release .Name } } - conf マウントパス: /opt/apache/sqoop/conf/sqoop.properties サブパス: sqoop .properties ライブネスプローブ: tcpソケット: ポート: sqoop 準備状況プローブ: tcpソケット: ポート: sqoop リソース: { { - toYaml .Values .resources |ニンデント12 } } { { - .Values .nodeSelectorを使用} } ノードセレクタ: { { - toYaml 。 |ニンデント8 } } { { -終わり} } { { - .Values .affinityを使用} } 親和性: { { - toYaml 。 |ニンデント8 } } { { -終わり} } { { - .Values .tolerationsを使用} } 許容範囲: { { - toYaml 。 |ニンデント8 } } { { -終わり} } 巻数: -名前: { { .Release .Name } } - conf 構成マップ: 名前: { {テンプレート"sqoop.fullname" 。 } } 5) 展開を開始する helm で sqoop をインストールします。/sqoop -n sqoop --create-namespace kubectl get pods 、 svc - n sqoop - wide を実行します。 6) テスト検証1. MYSQLからHDFSにデータをインポートする(インポート) [1] JDBC接続を作成する $ kubectl exec - it `kubectl get pods - n sqoop | awk 'NR>1{$1 を印刷}' |ヘッド- 1 ` - n sqoop -- sqoop2-shell
sqoop : 000 >サーバーの設定--host sqoop-0.sqoop.sqoop --port 12000 --webapp sqoop #sqoop : 000 >サーバーの設定--url http://sqoop-0.sqoop.sqoop:12000/sqoop # まずコネクタを確認してください sqoop : 000 >コネクタを表示 # MySQL接続を作成する sqoop : 000 >リンクの作成-コネクタ汎用- jdbc -コネクタ generic - jdbc - connector という名前のコネクタのリンクを作成しています 新しいリンクオブジェクトを作成するには、次の値を入力してください 名前: mysql - jdbc -リンク
データベース接続
ドライバークラス: com .mysql .cj .jdbc .Driver 接続文字列: jdbc : mysql : // mysql - primary .mysql : 3306 / sqoop?characterEncoding = utf8 & useSSL = false & serverTimeznotallow = UTC & rewriteBatchedStatements = true ユーザー名: root パスワード: ****** #MGSwjTorGj フェッチサイズ: 接続プロパティ: 現在マップには0 個の値があります: エントリ#
SQL方言
識別子を囲む: 検証ステータスが OK で、名前が mysql - jdbc - link の新しいリンクが正常に作成されました。 スクイープ: 000 >
sqoop : 000 >リンクを表示 # 消去 # sqoop : 000 >リンクを削除--name mysql-jdbc-link 【2】HDFS接続を作成する sqoop : 000 >リンクの作成-コネクタ hdfs -コネクタ hdfs - connector という名前のコネクタのリンクを作成しています 新しいリンクオブジェクトを作成するには、次の値を入力してください 名前: hdfs -リンク
HDFS クラスター
URI : hdfs : // myhdfs #URI : hdfs : // hadoop - ha - hadoop - hdfs - nn - 0.hadoop - ha - hadoop - hdfs - nn.hadoop - ha.svc.cluster.local : 8082 confディレクトリ: / opt / apache / hadoop / etc / hadoop 追加設定:: 現在マップには0 個の値があります: エントリ# 検証ステータスが OK で名前がhdfs - link の新しいリンクが正常に作成されました
sqoop : 000 >リンクを表示 【3】ジョブを作成するまず、HDFSストレージディレクトリを作成します hadoop fs -mkdir -p /ユーザー/管理者/ sqoop /出力/ 次にデータ変換を実行します $ kubectl exec - it `kubectl get pods - n sqoop | awk 'NR>1{$1 を印刷}' |ヘッド- 1 ` - n sqoop -- sqoop2-shell
sqoop : 000 >サーバーの設定--url http://sqoop-0.sqoop.sqoop:12000/sqoop
sqoop : 000 >ジョブを作成- f "mysql-jdbc-link" - t "hdfs-link" 開始名が mysql - jdbc - link で終了名がhdfs - link のリンクのジョブを作成しています 新しいジョブオブジェクトを作成するには、次の値を入力してください 名前: mysql2hdfs
データベースソース
スキーマ名: sqoop テーブル名: test1 SQL文: 列名: 現在リストには0 個の値があります: 要素# パーティション列: パーティション列のNULL可能: 境界クエリ:
増分読み取り
チェック列: 最終値:
ターゲット構成
null値を上書き: NULL値: ファイル形式: 0 :テキストファイル 1 :シーケンスファイル 2 :パーケットファイル 選択: 0 圧縮コーデック: 0 :なし 1 :デフォルト 2 :空気を抜く 3 : ZIP 4 : BZIP2 5 :エルゾー 6 : LZ4 7 :スナッピー 8 :カスタム 選択: 0 カスタムコーデック: 出力ディレクトリ: / user / admin / sqoop / output 追加モード: 1
リソースの調整
抽出機: 1 ローダー: 1
クラスパス構成
追加のマッパージャー: 現在リストには0 個の値があります: 要素# 新しいジョブが正常に作成され、検証ステータスが OKで名前が mysql2hdfs になりました sqoop : 000 >ジョブを表示 +------+----------------------+------------------------------------------+------------------------------------------+---------+ | ID |名前|コネクタから|コネクタへ|有効| +------+----------------------+------------------------------------------+------------------------------------------+---------+ | 2 |翻訳: mysql - jdbc -リンク(汎用- jdbc -コネクタ) | hdfs-リンク( hdfs-コネクタ) |本当| +------+----------------------+------------------------------------------+------------------------------------------+---------+ スクイープ: 000 > 【4】ジョブを実行する sqoop : 000 >ジョブを表示 sqoop : 000 >ジョブを開始- n mysql2hdfs 永続的なジョブ送信オブジェクトを表示します 提出物を表示 提出内容を表示--j ジョブ名 送信を表示--job ジョブ名 --detail 2. データのエクスポート (Haoop->RDBMS) この例のデモンストレーションについては、私の記事「ビッグデータ Hadoop - データ同期ツール Sqoop」を参照してください。 7) アンインストール helm アンインストール sqoop - n sqoop kubectl ns sqoopを削除します--force Git アドレス: https://gitee.com/hadoop-bigdata/sqoop-on-k8s |