データ基盤構築についてのメモ
Athena
Avro
OpenMetadata
Glue
DataCatalog
avroのメタデータの入れ方
Avroって何?
Apache Avro is for transform data among systems and seriarizing format.(by using at Hadroop and Kalfa)
What benefits:
Encode to accommodate various schemas by binary..For evolution of schema
Parquet:Columns
Apache:Row
Apache Iceberg is an open table format designed for managing large-scale data tables. Some of Iceberg's metadata is stored in Avro files.
OpenMetadata って何?
メタデータを管理する。さまざまなデータソースからメタデータで自動的に収集。
データカタログ作るのとデータリネージとは、データの生成から使用までの流れを追跡するツール
包括的な感じを受ける
aws glue 初めて使ってる。がUIが色々多くて迷う。
avroファイルでスキーマをどんどん追加していく(スキーマエヴォリューション)がその過程や差分を追いたい...そういった時に必要になるのが可視化ツール
OpenMetadataやAthenaでも可能dbtなどもぎりぎりできるみたい
とりあえずOpenMetadataで少量のスキーマで試作する。
公式のdocker compose yamlをインストールするところからやる
For OpenMetadata with PostgreSQL Database -
docker compose -f docker-compose-postgres.yml up --detach
postgresql用のopenmetadataを入れる
docker上に構築していたが、重すぎた。
サンドボックス環境があるのでそちらを使用
AWSとの連携をしたいのでs3に何か大きめのデータを置く。
athena とglueを使いavroのスキーマエヴォリューションを確認できるような挙動を試して、openmetadataで可視化....という感じ?
スキーマエヴォリューションってどうやってやるの?
複数のcsvがある状態から
それぞれのCSVバージョンに対応するAvroスキーマを作成
S3にCSVを保存
AWS Glue Crawlerを使ってデータカタログを作成
Athenaを使ってクエリを実行
OpenMetadataとの接続
あえてawsですべてやってから他の方法も試す
簡単なparquetを作るコード 圧縮方法はいくつかあったがsnappy
import duckdb
import pandas as pd
data = {
"customer_id": [101, 102, 103, 104, 105],
"customer_name": ["Alice Smith", "Bob Johnson", "Charlie Lee", "David Brown", "Eve Davis"],
"age": [29, 34, 41, 27, 38],
"city": ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix"],
"transaction_amount": [250.50, 500.00, 75.00, 200.00, 600.00],
"transaction_date": ["2024-01-15", "2024-02-10", "2024-02-22", "2024-03-05", "2024-04-01"]
}
df = pd.DataFrame(data)
con = duckdb.connect()
con.execute("CREATE TABLE customer_data AS SELECT * FROM df")
output_path = './customer_transactions.parquet'
con.execute(f"""
COPY customer_data TO '{output_path}'
(FORMAT 'parquet', CODEC 'snappy');
""")
こんどはavroを作るコード 検証不足で違う値がprintされている
import fastavro
schema = {
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "age", "type": "int"},
{"name": "email", "type": "string"}
]
}
data = [
{"name": "Alice", "age": 25, "email": "alice@example.com"},
{"name": "Bob", "age": 30, "email": "bob@example.com"},
]
with open("users.avro", "wb") as avro_file:
# Avroファイルにデータを書き込みます
fastavro.writer(avro_file, schema, data)
with open("users.avro", "rb") as avro_file:
reader = fastavro.reader(avro_file)
for record in reader:
print(record)
意外なほどに二つとも簡単に作れる
メタデータを付与する場合はどうすれば良いのか、あとここから発展してデータの変化をopenmetadata上で見たい。スタースキーマまで作る?