データ収集の概要
ETLは基本的に、データ抽出(Extract)、変換(Transform)、ロード(Load)などのデータ収集の代表的なものです。データソースはビッグデータプラットフォーム全体のアップストリームであり、データ収集はデータソースとデータウェアハウス間のパイプラインです。収集プロセスでは、ビジネスシナリオに従ってデータが管理され、データのクリーニングが完了します。
ビッグデータのシナリオでは、ビジネスデータベース、ログデータ、写真、ビデオ、その他のマルチメディアデータなど、データソースは複雑で多様です。データ収集の形式も、タイミング、リアルタイム、インクリメンタル、フルボリュームなど、より複雑で多様である必要があります。一般的なデータ収集ツールも多様であり、さまざまなビジネスニーズを満たすことができます。
典型的なデータ読み込みアーキテクチャ:
3つの一般的なデータ収集シナリオ:
- シナリオ1:FTP、SFTP、HTTPおよびその他のプロトコルをサポートするデータソースからデータを取得する
- シナリオ2:ビジネスデータベースからデータを取得し、データの収集と入力後にビジネスシステムをサポートする
- シナリオ3:データソースは、Kafkaなどのメッセージキューを介してリアルタイムでデータを収集する必要があります
データ収集システムの要件:
- データソース管理とステータス監視
- タイミング、リアルタイム、フル、インクリメンタルなどのマルチモードデータ取得とタスク監視。
- メタデータ管理、データ補足取得、データアーカイブ
一般的なデータ収集ツール
Sqoop
Sqoopは、リレーショナルデータベースとHDFSの間で一般的に使用されるデータインポートおよびエクスポートツールであり、インポートまたはエクスポートコマンドをMapReduceプログラムに変換します。したがって、Hadoopと従来のデータベース(Mysq |、Postgresq |など)の間でデータを転送するためによく使用されます。
データは、HadoopMapReduceを介してリレーショナルデータベースからHadoopクラスターにインポートできます。Sqoopを使用して大量の構造化データまたは半構造化データを転送するプロセスは完全に自動化されています。
Sqoopデータ送信図:
Sqoopインポートプロセス:
- ソースデータテーブルのMetaData情報を取得します
- パラメータに基づいてMapReduceタスクを送信する
- テーブルの各行はレコードとして使用され、データは計画どおりにインポートされます
** Sqoopエクスポートプロセス:***
- ターゲットデータテーブルのMetaData情報を取得します
- パラメータに基づいてMapReduceタスクを送信する
- HDFSファイルのデータの各行を指定された文字で分割し、データベースにエクスポートします
Apache Flume
Apache Flumeは本質的に、分散型で信頼性が高く、可用性の高いログ収集システムであり、複数のデータソースと柔軟な構成をサポートします。Flumeは、大量のログを収集、集約、および送信できます。
Flumeシステムは、ソース(データソースの読み取りを担当)、シンク(データ出力を担当)、およびチャネル(データの一時ストレージチャネルとして)の3つのコンポーネントに分割されます。これらの3つのコンポーネントは、エージェントを形成します。Flumeを使用すると、ユーザーは、複数のエージェントを通過して最終的に着陸するデータなど、複雑なデータフローを構築できます。
水路データ伝送図:
複数のデータソースと複数のエージェントを使用したFlumeでのデータ送信の概略図:
Flumeマルチシンクマルチエージェントでのデータ送信の概略図:
Flumeの実用的な内容については、以下を参照してください。
DataX
公式文書:
DataXは、異種データソース用のAliのオープンソースオフライン同期ツールであり、リレーショナルデータベース(MySQL、Oracleなど)、HDFS、Hive、ODPS、HBase、FTPなどのさまざまな異種データソース間で効率的かつ安定したデータ同期機能を実現することに取り組んでいます。DataXは、複雑なメッシュ同期リンクを、優れたスケーラビリティを備えたスターデータ同期リンクに変換します。
メッシュ同期リンクとDataXスターデータ同期リンクの比較チャート:
DataXアーキテクチャの概略図:
Dataxデータ収集実際の戦闘
公式文書:
GitHubのダウンロードアドレスに移動してDataXをダウンロードするか、ソースコードをプルしてコンパイルします。
ダウンロードしたインストールパッケージをサーバーにアップロードします。
[root@hadoop ~]# cd /usr/local/src
[root@hadoop /usr/local/src]# ls |grep datax.tar.gz
datax.tar.gz
[root@hadoop /usr/local/src]#
インストールパッケージを適切なディレクトリに解凍します。
[root@hadoop /usr/local/src]# tar -zxvf datax.tar.gz -C /usr/local
[root@hadoop /usr/local/src]# cd ../datax/
[root@hadoop /usr/local/datax]# ls
bin conf job lib plugin script tmp
[root@hadoop /usr/local/datax]#
DataXのセルフチェックスクリプトを実行します。
[root@hadoop /usr/local/datax]# python bin/datax.py job/job.json
...
任务启动时刻 : 2020-11-13 11:21:01
任务结束时刻 : 2020-11-13 11:21:11
任务总计耗时 : 10s
任务平均流量 : 253.91KB/s
记录写入速度 : 10000rec/s
读出记录总数 : 100000
读写失败总数 : 0
CSVファイルデータをHiveにインポートします
検出に問題がない場合は、CSVファイルのデータをHiveにインポートする方法を簡単に説明します。hdfswriterとtxtfilereaderを使用する必要があります。公式文書:
- https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md
- https://github.com/alibaba/DataX/blob/master/txtfilereader/doc/txtfilereader.md
まず、Hiveでデータベースを作成します。
0: jdbc:hive2://localhost:10000> create database db01;
No rows affected (0.315 seconds)
0: jdbc:hive2://localhost:10000> use db01;
次に、テーブルを作成します。
create table log_dev2(
id int,
name string,
create_time int,
creator string,
info string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
stored as orcfile;
ライブラリとテーブルが作成されると、HDFSに対応するディレクトリファイルがあります。
[root@hadoop ~]# hdfs dfs -ls /user/hive/warehouse/db01.db
Found 1 items
drwxr-xr-x - root supergroup 0 2020-11-13 11:30 /user/hive/warehouse/db01.db/log_dev2
[root@hadoop ~]#
テストデータを準備します。
[root@hadoop ~]# cat datax/db.csv
1,创建用户,1554099545,hdfs,创建用户 test
2,更新用户,1554099546,yarn,更新用户 test1
3,删除用户,1554099547,hdfs,删除用户 test2
4,更新用户,1554189515,yarn,更新用户 test3
5,删除用户,1554199525,hdfs,删除用户 test4
6,创建用户,1554299345,yarn,创建用户 test5
DataXは、json形式の構成ファイルを介してETLタスクを定義し、jsonファイルを作成vim csv2hive.json
します。定義するETLタスクの内容は次のとおりです。
{
"setting":{
},
"job":{
"setting":{
"speed":{
"channel":2
}
},
"content":[
{
"reader":{
"name":"txtfilereader",
"parameter":{
"path":[
"/root/datax/db.csv"
],
"encoding":"UTF-8",
"column":[
{
"index":0,
"type":"long"
},
{
"index":1,
"type":"string"
},
{
"index":2,
"type":"long"
},
{
"index":3,
"type":"string"
},
{
"index":4,
"type":"string"
}
],
"fieldDelimiter":","
}
},
"writer":{
"name":"hdfswriter",
"parameter":{
"defaultFS":"hdfs://192.168.243.161:8020",
"fileType":"orc",
"path":"/user/hive/warehouse/db01.db/log_dev2",
"fileName":"log_dev2.csv",
"column":[
{
"name":"id",
"type":"int"
},
{
"name":"name",
"type":"string"
},
{
"name":"create_time",
"type":"INT"
},
{
"name":"creator",
"type":"string"
},
{
"name":"info",
"type":"string"
}
],
"writeMode":"append",
"fieldDelimiter":",",
"compress":"NONE"
}
}
}
]
}
}
- dataxは構成ファイルとしてjsonを使用し、ファイルはローカルまたはリモートのhttpサーバーにすることができます
- JSON構成ファイルの最外層は1である
job
、job
などsetting
とcontent
されている2つの部品、setting
するために使用されるjob
構成全体をし、content
データのソース及び目的であります setting
:グローバルチャネル構成、ダーティデータ構成、速度制限構成などを設定するために使用します。この例では、チャネル番号1のみが構成されています。つまり、データ送信はシングルスレッドを使用して実行されます。content
:- リーダー:データの読み取り先を構成します
name
:プラグインの名前は、プロジェクト内のプラグインの名前と一致している必要がありますparameter
:プラグインに対応する入力パラメータpath
:ソースデータファイルのパスencoding
:データエンコーディングfieldDelimiter
:データセパレータcolumn
:セパレータで区切られた後のソースデータの位置とデータタイプ
- ライター:データを書き込む場所を構成します
name
:プラグイン名。プロジェクトのプラグイン名と一致している必要がありますparameter
:プラグインに対応する入力パラメータpath
:ターゲットパスfileName
:ターゲットファイル名のプレフィックスwriteMode
:ターゲットディレクトリへの書き込み方法
- リーダー:データの読み取り先を構成します
DataXのPythonスクリプトを使用して、定義済みのETLタスクを実行します。
[root@hadoop ~]# python /usr/local/datax/bin/datax.py datax/csv2hive.json
...
任务启动时刻 : 2020-11-15 11:10:20
任务结束时刻 : 2020-11-15 11:10:32
任务总计耗时 : 12s
任务平均流量 : 17B/s
记录写入速度 : 0rec/s
读出记录总数 : 6
读写失败总数 : 0
対応するデータファイルがHDFSにすでに存在するかどうかを確認します。
[root@hadoop ~]# hdfs dfs -ls /user/hive/warehouse/db01.db/log_dev2
Found 1 items
-rw-r--r-- 3 root supergroup 825 2020-11-15 11:10 /user/hive/warehouse/db01.db/log_dev2/log_dev2.csv__f19a135d_6c22_4988_ae69_df39354acb1e
[root@hadoop ~]#
Hiveに移動して、インポートされたデータが期待を満たしていることを確認します。
0: jdbc:hive2://localhost:10000> use db01;
No rows affected (0.706 seconds)
0: jdbc:hive2://localhost:10000> show tables;
+-----------+
| tab_name |
+-----------+
| log_dev2 |
+-----------+
1 row selected (0.205 seconds)
0: jdbc:hive2://localhost:10000> select * from log_dev2;
+--------------+----------------+-----------------------+-------------------+----------------+
| log_dev2.id | log_dev2.name | log_dev2.create_time | log_dev2.creator | log_dev2.info |
+--------------+----------------+-----------------------+-------------------+----------------+
| 1 | 创建用户 | 1554099545 | hdfs | 创建用户 test |
| 2 | 更新用户 | 1554099546 | yarn | 更新用户 test1 |
| 3 | 删除用户 | 1554099547 | hdfs | 删除用户 test2 |
| 4 | 更新用户 | 1554189515 | yarn | 更新用户 test3 |
| 5 | 删除用户 | 1554199525 | hdfs | 删除用户 test4 |
| 6 | 创建用户 | 1554299345 | yarn | 创建用户 test5 |
+--------------+----------------+-----------------------+-------------------+----------------+
6 rows selected (1.016 seconds)
0: jdbc:hive2://localhost:10000>
MySQLデータをHiveにインポートします
次に、MySQLデータをHiveにインポートする方法を示します。この機能を実現するには、mysqlreaderを使用してMySQLからデータを読み取る必要があります。公式ドキュメントは次のとおりです。
まず、次のSQLを実行して、いくつかのテストデータを作成します。
CREATE DATABASE datax_test;
USE `datax_test`;
CREATE TABLE `dev_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`create_time` int(11) DEFAULT NULL,
`creator` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`info` varchar(2000) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1069 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert into `dev_log`(`id`,`name`,`create_time`,`creator`,`info`) values
(1,'创建用户',1554099545,'hdfs','创建用户 test'),
(2,'更新用户',1554099546,'yarn','更新用户 test1'),
(3,'删除用户',1554099547,'hdfs','删除用户 test2'),
(4,'更新用户',1554189515,'yarn','更新用户 test3'),
(5,'删除用户',1554199525,'hdfs','删除用户 test4'),
(6,'创建用户',1554299345,'yarn','创建用户 test5');
次に、Hivedb01
データベースに別のテーブルを作成します。
create table log_dev(
id int,
name string,
create_time int,
creator string,
info string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
stored as textfile;
ETLタスクの構成ファイルを作成します。
[root@hadoop ~]# vim datax/mysql2hive.json
ファイルの内容は次のとおりです。
{
"job":{
"setting":{
"speed":{
"channel":3
},
"errorLimit":{
"record":0,
"percentage":0.02
}
},
"content":[
{
"reader":{
"name":"mysqlreader",
"parameter":{
"username":"root",
"password":"123456a.",
"column":[
"id",
"name",
"create_time",
"creator",
"info"
],
"where":"creator='${creator}' and create_time>${create_time}",
"connection":[
{
"table":[
"dev_log"
],
"jdbcUrl":[
"jdbc:mysql://192.168.1.11:3306/datax_test?serverTimezone=Asia/Shanghai"
]
}
]
}
},
"writer":{
"name":"hdfswriter",
"parameter":{
"defaultFS":"hdfs://192.168.243.161:8020",
"fileType":"text",
"path":"/user/hive/warehouse/db01.db/log_dev",
"fileName":"log_dev3.csv",
"column":[
{
"name":"id",
"type":"int"
},
{
"name":"name",
"type":"string"
},
{
"name":"create_time",
"type":"INT"
},
{
"name":"creator",
"type":"string"
},
{
"name":"info",
"type":"string"
}
],
"writeMode":"append",
"fieldDelimiter":",",
"compress":"GZIP"
}
}
}
]
}
}
- mysqlreaderは
where
、読み取る必要のあるデータをフィルタリングするための着信条件をサポートします。dataxスクリプトの実行時に特定のパラメーターを渡すことができます。この変数置換方法により、増分同期サポートを実現できます。
mysqlreaderのデフォルトのドライバーパッケージは5.xです。MySQLのバージョンは8.xなので、mysqlreaderのドライバーパッケージを置き換える必要があります。
[root@hadoop ~]# cp /usr/local/src/mysql-connector-java-8.0.21.jar /usr/local/datax/plugin/reader/mysqlreader/libs/
[root@hadoop ~]# rm -rf /usr/local/datax/plugin/reader/mysqlreader/libs/mysql-connector-java-5.1.34.jar
次に、ETLタスクを実行します。
[root@hadoop ~]# python /usr/local/datax/bin/datax.py datax/mysql2hive.json -p "-Dcreator=yarn -Dcreate_time=1554099547"
...
任务启动时刻 : 2020-11-15 11:38:14
任务结束时刻 : 2020-11-15 11:38:25
任务总计耗时 : 11s
任务平均流量 : 5B/s
记录写入速度 : 0rec/s
读出记录总数 : 2
读写失败总数 : 0
対応するデータファイルがHDFSにすでに存在するかどうかを確認します。
[root@hadoop ~]# hdfs dfs -ls /user/hive/warehouse/db01.db/log_dev
Found 1 items
-rw-r--r-- 3 root supergroup 84 2020-11-15 11:38 /user/hive/warehouse/db01.db/log_dev/log_dev3.csv__d142f3ee_126e_4056_af49_b56e45dec1ef.gz
[root@hadoop ~]#
Hiveに移動して、インポートされたデータが期待を満たしていることを確認します。
0: jdbc:hive2://localhost:10000> select * from log_dev;
+-------------+---------------+----------------------+------------------+---------------+
| log_dev.id | log_dev.name | log_dev.create_time | log_dev.creator | log_dev.info |
+-------------+---------------+----------------------+------------------+---------------+
| 4 | 更新用户 | 1554189515 | yarn | 更新用户 test3 |
| 6 | 创建用户 | 1554299345 | yarn | 创建用户 test5 |
+-------------+---------------+----------------------+------------------+---------------+
2 rows selected (0.131 seconds)
0: jdbc:hive2://localhost:10000>
データガバナンスの概要
倉庫にデータを収集した後に直面した問題:
- 従来のデータウェアハウスのビッグデータ時代と比較して、データはより多様で複雑であり、データの量はより多くなります
- あらゆる場所でのデータの不整合、データ品質の向上、およびデータモデルの組み合わせの完了が困難
- 複数の収集ツールと複数の保存方法により、データウェアハウスまたはデータレイクは徐々にデータの沼になります
データガバナンスで解決すべき問題:
- データに依存しない:ユーザーは自分が持っているデータを知らず、データとビジネスの関係も知りません
- 制御不能なデータ:統一されたデータ標準がなければ、データを統合および統一することはできません
- 望ましくないデータ:ユーザーがデータを簡単に取得できない、または取得したデータが利用できない
- データを接続できない:データ間の関係が反映されず、データの深い価値が反映されない
データガバナンスの目標:
- 統一されたデータ標準とデータ仕様を確立して、データ品質を確保します
- データのライフサイクル全体を制御するためのデータ管理手順を開発する
- ユーザーが使用するプラットフォームツールを形成する
データガバナンス:
- データガバナンスには、メタデータ管理、データ品質管理、データ血縁関係管理などが含まれます。
- データガバナンスは、データ収集、データクリーニング、データ計算、およびその他のリンクにあります
- データガバナンスはテクノロジーではなく、プロセス、コラボレーション、および管理です
メタデータ管理:
- 管理データのデータベーステーブル構造などのスキーマ情報
- データストレージスペース、読み取りおよび書き込みレコード、権限の帰属、およびその他のさまざまな統計情報
データ血縁関係管理:
- データ間の血縁関係とライフサイクル
- テーブルBのデータはテーブルAから収集されるため、テーブルBとAには血縁関係があります。
- データビジネス属性情報とビジネスデータモデル
データガバナンス手順の簡単な説明:
- データ仕様とデータ定義を統合し、ビジネスモデルと技術モデルを開きます
- データ品質を向上させ、データライフサイクル管理を実現
- データの価値をマイニングして、ビジネス担当者がデータを便利かつ柔軟に使用できるようにします
データガバナンスと周辺システム:
- ODS、DWD、DM、およびその他のレベルのメタデータは、集中管理のためにデータガバナンスプラットフォームに組み込まれています
- データの収集および処理プロセスで生成されたメタデータは、データガバナンスプラットフォームに組み込まれ、血縁関係が確立されます。
- データ管理サービスインターフェイスを提供し、データモデルの変更をアップストリームとダウンストリームにタイムリーに通知します
ApacheAtlasデータガバナンス
一般的なデータガバナンスツール:
- Apache Atlas:Hortonworksが推進するデータガバナンスオープンソースプロジェクト
- Metacat:Netflixのオープンソースメタデータ管理およびデータ検出コンポーネント
- ナビゲーター:Clouderaが提供するデータ管理ソリューション
- WhereHows:LinkedInとオープンソースによって内部的に使用されるデータ管理ソリューション
Apache Altas:
- データ分類:メタデータを自動的にキャプチャ、定義、注釈付けし、ビジネス指向のデータを分類します
- 一元化された監査:すべてのステップ、アプリケーション、およびデータの相互作用のアクセス情報をキャプチャします
- 検索と血縁関係:関連データとデータの関係の分類と監査に基づいており、視覚化によって表示されます
Apache Altasアーキテクチャ図:
- タイプシステム:タイプで構成される、管理対象のメタデータオブジェクトから抽象化されたエンティティ
- Ingest \ Export:メタデータの自動収集およびエクスポートツール。エクスポートはイベントとしてトリガーできるため、ユーザーは時間内に応答できます。
- グラフエンジン:グラフデータベースとグラフ計算エンジンを介してデータ間の関係を表示します
メタデータキャプチャ:
- フック:各コンポーネントのフックは、ストレージ用のデータを自動的にキャプチャします
- エンティティ:各統合システムは、操作中に書き込み用のイベントをトリガーします
- メタデータを取得しながら、データ間の関係を取得し、血縁関係を構築します