Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Multiple Dimension Spreadのご紹介

163 views

Published on

MDS(Multiple Dimension Spread)は、スキーマレスのカラム型ストレージフォーマットです。
JSONのような柔軟な表現と、他のカラム型ストレージフォーマットに似た効率的な読み込みを提供します。

OSSとして公開しています。
興味がある方は気軽にご連絡ください!

GitHub:
https://github.com/yahoojapan/multiple-dimension-spread

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Multiple Dimension Spreadのご紹介

  1. 1. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 2018年11月19日 ヤフー株式会社 井島 洸二 、大戸 康紀 Multiple-Dimension- Spread
  2. 2. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 自己紹介 2 井島 洸二 ヤフー株式会社 データ&サイエンスソリューション統括本部 データプラットフォーム本部データデリバリー部 所属 大戸 康紀 ヤフー株式会社 データ&サイエンスソリューション統括本部 データプラットフォーム本部データデリバリー部 所属
  3. 3. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 目次 3 1. 目的/背景 2. ゴール設定 3. 構成 4. チュートリアル 5. 開発状況 6. パフォーマンス 7. 今後の予定 8. まとめ
  4. 4. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 目的/背景
  5. 5. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 目的 Data Lake に最適な データフォーマットを提供
  6. 6. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Data Lake とは データを湖のように蓄えておく • 保存時には使われ方(データ形式)を気にしない • 利用時に考える Data Lake 生データで保存 柔軟なデータ利用 SQL/HQL でアクセス
  7. 7. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. データフォーマット (初期) 生データを保存、利用時に解釈 • テキスト や JSON など • Ex. Apache log Data Lake 柔軟なデータ利用 SQL/HQL でアクセス 生データで保存
  8. 8. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 問題 溢れるデータ データが級数的に増加 総務省 平成29年版 情報通信白書 データ流通量の爆発的増大 http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h29/html/nc121210.html
  9. 9. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 問題 溢れるデータ 生データ保存では、 増え続けるデータに対抗できない Data Lake SQL/HQL でアクセス 生データで保存
  10. 10. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 問題 溢れるデータ 増え続けるデータに対抗する • 効率の良いデータ圧縮 • 利用しやすいデータ形式 効率的なデータ保存、利用
  11. 11. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. データフォーマット (現在) カラムナデータフォーマットで保存 • ORC, Parquet, Carbondata Data Lake SQL/HQL でアクセス カラムナデータフォーマットで保存
  12. 12. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. カラムナ データフォーマット 列方向にデータを収集、圧縮する • 同種データによる圧縮率の向上 • 集計時にデータ全体を解凍しなくて良い • 生成時に データ形式/Schema が 必要 圧縮
  13. 13. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. カラムナ データフォーマット 列方向にデータを収集、圧縮する • 同種データによる圧縮率の向上 • 集計時にデータ全体を解凍しなくて良い • 生成時に データ形式/Schema が 必要 圧縮 効率性 柔軟性
  14. 14. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 既存技術 14 Server APIWeb/App Request JSON message Schema registry ETL HDFS カラムナー フォーマット MR/TEZ Spark HIVE/Presto 事前に Schema の 設定が必要
  15. 15. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 既存技術 まとめ 大量のデータを柔軟に処理したい • Data Lake 構想 • カラムナーフォーマットによる効率的な保存 • データ保存時の柔軟性が犠牲
  16. 16. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. ゴール設定
  17. 17. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. モチベーション 17 事象を自然なデータ構造で表現できる世界
  18. 18. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 目指すところ 18 効率と柔軟性の両立 効率 柔軟性 JSON Apache ORC Apache Parquet Apache Carbondata MDS 生データ
  19. 19. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 効率 19 • 処理で必要最小限の読み込み Storage InputStream Col-1 Col-4 In-Memory Col-1 Col-2 Col-3 Col-4 Col-5 Col-1 Col-2 Col-3 Col-4 Col-5 Col-1 Col-4 Col-1 Col-4 Volume Decompress/CopyNetwork,Disk/IO Main Processing
  20. 20. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 柔軟性 20 • データ保存時に Schema 設定がいらない
  21. 21. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Other 21 • Hadoop エコシステムに連携 • MR/TEZ • Spark • Hive/Presto …
  22. 22. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. ユースケース 22 Server APIWeb/App Request JSON message Schema registry ETL Schema-less data pipeline HDFS MDS MR/TEZ Spark HIVE/Presto
  23. 23. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 構成
  24. 24. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 言語 • Java
  25. 25. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 前提 25 • 分散ストレージ上での蓄積と分散処理 フレームワークに対応にフォーカス
  26. 26. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. ファイルレイアウト 26 File File Header Block-1 Block-X Block Metadata Spread-1 Spread-2 … Spread-X Block-2 Block Metadata Spread-1 … MDS形式のファイルとして認識する ための情報や読み込みに必要な設定が 含まれる。 ファイルは複数のブロックで構成され る。 ブロックはカラムの構成や統計情報を 保持するメタデータと複数の Spread で構成される。 Spread は複数の Column で構成さ れる。 Block Metadata Spread-1
  27. 27. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Spread 27 Root Spread Child Spread Child Spread Root ColColCol Col Col Col Col Col Spread は Root を持つ木構 造で表現される。 Column は子を持つことがで きる。 そのノード以下は子 Spread として表現される。 単一の Spread は Column[] と同等の意味を持つ。
  28. 28. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Column 28 ColCol Root String : encoding class name String : compress class name String : column name ColumnType : column type Int : row count Int : raw data size Int : logical data size Int : cardinality Int : binary start offset Int : binary length Byte[] : data Col
  29. 29. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. File Header 29 File File Header Magic Byte[] 4byte BlockSize Int 4byte Class name length of BlockReader Int 4byte Class name of BlockReader Char[] Xbyte
  30. 30. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Block 30 Block-1 Block Metadata Block index Number of spread Spread row counts Byte[] Xbyte Int 4byte Int[] Xbyte Metadata length Int 4byte
  31. 31. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Spread 31 Spread metadata Spread data Byte[] Xbyte Byte[] Xbyte Block-1 Spread-1 Spread-2 … Spread-X
  32. 32. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. MDSReaderMDSWriter Write/Read 32 deserializer Message object IBlockMaker List<ColumnBinary> IColumnBinaryMaker MDSRecordWriter Spread MDS File Byte[] IBlockReader IColumnBinaryMaker List<ColumnBinary> MDSRecordReader Spread serializer Message object Byte[] ProcessingETL Spread MessageMessage Spread
  33. 33. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Message のシリアライズ/デシリアライズ 33 • 同時に開発したスキーマライブラリを利用 https://github.com/yahoojapan/dataplatform-schema-lib IParser Reader Avro JSON Etc… AvroReader JsonReader Writer AvroWriter JsonWriter Avro JSON Etc… 共通のインターフェースを通じてデータのアクセスと変換を提供
  34. 34. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 入力データからデータ構造を構築 34 message Spread { “col-3” : “val” } { “col-1” : “val” , “col-5” : “val” } { “col-2” : “val” , “col-4” : “val” , “col-5” : “val” } Col-3 Col-1 Col-3 Col-5 Null Null Null Col-1 Col-2 Col-3 Col-4 Col-5 Null Null Null Null Null Null Null Null Null 初期状態では何もデータ構造をもっ ていない、入力データに応じた構造 が構築される。 入力データで新規に出現したキーが ある場合には、データ構造に追加さ れる。 これによりスキーマレスな書き込み を実現。
  35. 35. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. カラム毎の独立したエンコーディング 35 Column Col-2 Null Null Col-1 IColumnBinaryMaker Encoder ICompressor Col-1 ColumnBinary Col-2 IColumnBinaryMaker Encoder ICompressor Col-2 ColumnBinary Column Col-1 Null Null
  36. 36. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. オプティマイザ 36 MDSWriter Analyzer Column IColumnAnalizeResult IOptimizer IColumnAnalizeResult IColumnBinaryMaker カラムを解析し統計情報を(rows, cardinality…)を取得する。 統計情報に応じてエンコーディング 方式を選定する。
  37. 37. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 高速なファイルのマージ 37 MDS File File Header Block-1 Block-2 MDS File File Header Block-1 Block-2 MDSWriter deserializer Message object IBlockMaker List<ColumnBinary> IColumnBinaryMaker MDSRecordWriter Spread MDS File Byte[] List<ColumnBinary> ファイルのマージはメッセージ のデシリアライズ、カラムのエ ンコーディング/圧縮をスキッ プできる。 ボトルネックをディスク/ネッ トワークIOとする事により HDFS 上に数GB単位のファイ ルを作成する事が可能。
  38. 38. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Splitable 38 MDS File File Header Block-1 Block-2 Block-3 Block-4 Block-5 Processing Processing Processing Processing Processing MDS はブロック単位で並列して処 理が可能。 ブロックサイズはファイルのオプ ションで設定できる。 デフォルトは128MBとなる。 128MB 128MB 128MB 128MB XMB
  39. 39. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Projection Pushdown 39 MDSReader Processing [ col2 , col5] MDS File File Header Block-1 Spread-1 Col-1 Col-2 Col-3 Col-4 Col-5 List<ColumnBinary> [ col-2,col-3] Skip Read Skip Read Spread 読み込むカラムを設定 ストレージから必要なカラムのデータのみを読み込み
  40. 40. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Predicate Pushdown 40 MDSReader Processing MDS File File Header Block-1 Block-2 Block-3 Spread-1 Spread-2 Spread-1 Spread-2 Spread-1 Spread-2 確実にデータが含まれない Block , Spread をスキップ Spread Col-1 < X and Col-3 = X List<ColumnBinary> Skip Skip Read Read 入力に必要なデータの条件を設定 Col-1 Col-2 Col-3 Col-4 Col-5 Skip Read Read 確実にデータが含まれない行をスキップ
  41. 41. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Expand 41 timestamp (BIGINT) total_price (BIGINT) Items (STRUCT) item_id (STRING) price (BIGINT) number (INT) 1516773762 1000 I_001 300 1 1516773762 1000 I_005 350 2 1516773765 200 I_002 50 4 MDSReader Processing timestamp (BIGINT) total_price (BIGINT) Items (ARRAY) Items (Struct) item_id (STRING) price (BIGINT) number (INT) 1516773762 1000 I_001 300 1 I_005 350 2 1516773765 200 I_002 50 4 Spread Expand Spread Spread Expand ‘items’ 展開したいArray要素のカラムを設定 指定されたカラムを展開した Spread を作成
  42. 42. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Flatten 42 timestamp (BIGINT) total_price (BIGINT) item_id (STRING) price (BIGINT) number (INT) 1516773762 1000 I_001 300 1 1516773762 1000 I_005 350 2 1516773765 200 I_002 50 4 MDSReader Processing Spread Flatten Spread Spread Flatten items.item_id -> item_id items.price -> price items.number -> number 平坦化したいカラムを設定 指定されたカラムを平坦化した Spread を作成 timestamp (BIGINT) total_price (BIGINT) Items (STRUCT) item_id (STRING) price (BIGINT) number (INT) 1516773762 1000 I_001 300 1 1516773762 1000 I_005 350 2 1516773765 200 I_002 50 4
  43. 43. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Expand & Flatten 43 timestamp (BIGINT) total_price (BIGINT) Items (STRUCT) item_id (STRING) price (BIGINT) number (INT) 1516773762 1000 I_001 300 1 1516773762 1000 I_005 350 2 1516773765 200 I_002 50 4 MDSReader Processingtimestamp (BIGINT) total_price (BIGINT) Items (ARRAY) Items (Struct) item_id (STRING) price (BIGINT) number (INT) 1516773762 1000 I_001 300 1 I_005 350 2 1516773765 200 I_002 50 4 Spread Spread Expand , Flatten を設定 timestamp (BIGINT) total_price (BIGINT) item_id (STRING) price (BIGINT) number (INT) 1516773762 1000 I_001 300 1 1516773762 1000 I_005 350 2 1516773765 200 I_002 50 4 Expand & Flatten Spread Expand ‘items’ Flatten items.item_id -> item_id items.price -> price items.number -> number Expand Spread
  44. 44. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. チュートリアル
  45. 45. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 環境構築 $ git clone https://github.com/yahoojapan/multiple-dimension-spread.git $ cd multiple-dimension-spread/ $ mvn package $ bin/setup.sh
  46. 46. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. JSON メッセージの変換 $ bin/mds.sh create -i src/example/src/main/resources/sample_json.txt -f json -o /tmp/sample.mds $ bin/mds.sh cat -i /tmp/sample.mds -o '-' # show whole data {"summary":{"total_price":550,"total_weight":412},"number":5,"price":110 ,"name":"apple","class":"fruits"} {"summary":{"total_price":800,"total_weight":600},"number":10,"price":80 ,"name":"orange","class":"fruits"}
  47. 47. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Hive テーブルの作成 47 $ hive -i jars/mds/add_jar.hql > create database test; > use test; > create external table sample_json ( summary struct<total_price: bigint, total_weight: bigint>, number bigint, price bigint, name string, class string ) ROW FORMAT SERDE 'jp.co.yahoo.dataplatform.mds.hadoop.hive.MDSSerde‘ STORED AS INPUTFORMAT 'jp.co.yahoo.dataplatform.mds.hadoop.hive.io.MDSHiveLineInputFormat‘ OUTPUTFORMAT 'jp.co.yahoo.dataplatform.mds.hadoop.hive.io.MDSHiveParserOutputFormat‘ LOCATION '/tmp/ss'; > select * from sample_json; {"total_price":550,"total_weight":412} 5 110 apple fruits {"total_price":800,"total_weight":600} 10 80 orange fruits
  48. 48. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 開発状況
  49. 49. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 機能 機能 MDS ORC Row Store Text, JSON, ORC, Avro Text, Sequence, Avro Compress Data type specific ○ ○ Change by column base ○ ☓ Format GZIP,LZ4,ZSTD ZLIB, SNAPPY, LZO Splittable ○ ○ Vectorization ○ ○ Pushdown Projection ○ ○ Predication ○ ○
  50. 50. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. データ型 基本型 説明 Boolean true/false Byte 8ビット整数 Bytes バイト列 Short 16ビット整数 Integer 32ビット整数 Long 64ビット整数 Float 32ビット単精度浮動小数点数 Double 64ビット倍精度浮動小数点数 String 文字列 Null 欠損データ 複合型 説明 Array 配列 Map マップ Struct 構造体 Union 共用体(異なる型を保持)
  51. 51. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. MDSの対応エコシステム エコシステム 対応 URL Hive ○ hive.apache.org Spark △※1 spark.apache.org Presto △※1 prestodb.io Drill ☓ drill.apache.org Impala ☓ impala.apache.org Arrow ○ arrow.apache.org ※1:本資料公開時にはOSSには公開していません
  52. 52. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. パフォーマンス
  53. 53. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. TPC-H 1000 53 TPC-H スケール1000(GB)で比較 MDS,Apache ORC,Apache parquet で比較 圧縮フォーマットは全てGZIP 各データは Hive で変換を実施
  54. 54. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. バージョン 54 Hive:1.2.1 Spark:2.2.0
  55. 55. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. TPC-H 1000 - データサイズ 55 0 50 100 150 200 250 300 MDS Apache ORC Apache parquet データサイズ(GB) Law is better
  56. 56. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. TPC-H 1000 - テーブル別のサイズ 56 0 20 40 60 80 100 120 140 160 180 region nation supplier part customer partsupp orders lineitem テーブル別データサイズ(GB) MDS Apache ORC Apache parquet Law is better
  57. 57. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. TPC-H 1000 - Hive 57 ※テーブルスキャンオペレーション(Map)のみ計測 ※q19:いずれも実行に時間がかかりすぎたため計測を断念 0 10000 20000 30000 40000 50000 60000 70000 80000 90000 100000 q6 q16 q14 q1 q15 q11 q22 q2 q12 q20 q13 q10 q4 q3 q7 q8 q5 q9 q17 q18 q21 CPU TIME(SEC) MDS Apache ORC Apache parquet Law is better
  58. 58. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. TPC-H 1000 - Spark 58 0 10000 20000 30000 40000 50000 60000 70000 80000 q6 q14 q12 q1 q10 q13 q3 q20 q8 q7 q5 q9 q4 q17 Executor CPU TIME(SEC) MDS Apache ORC Apache parquet ※q2,11,15,18,21,22:テーブル作成の HQL を書き換えなければいけないため断念 ※q16,19:いずれも実行に時間がかかりすぎたため計測を断念 Law is better
  59. 59. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Expand&Flatten 59 社内で利用しているArrayを使って状態を表しているログを利用 元のデータ構造のまま SQL で展開して処理する場合と、利用する フィールドだけフラットにして単純な SQL を実行した場合の速度 を比較する timestamp (BIGINT) total_price (BIGINT) Items (ARRAY) Items (Struct) item_id (STRING) price (BIGINT) number (INT) 151677376 2 1000 I_001 300 1 I_005 350 2 timestamp (BIGINT) total_price (BIGINT) item_id (STRING) price (BIGINT) number (INT) 1516773762 1000 I_001 300 1 1516773762 1000 I_005 350 2 Array 展開のSQL SQL MDS File ※図は処理のイメージであり実際に利用されているログではありません。
  60. 60. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. Expand&Flatten - Hive 60 0 20000 40000 60000 80000 100000 120000 140000 160000 not flatten flatten CPU TIME(SEC) 90% down
  61. 61. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 今後の予定
  62. 62. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 今後の提供機能 62 各フレームワークの型に対応 Sparkに対応したコードをOSS公開 型の拡張(Date,Timestamp…etc)
  63. 63. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. パフォーマンス 63 ベンチマークの整備 Write処理の効率化
  64. 64. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. OSS 活動について 64 コントリビューター募集 利用者・導入事例を増やす取り組み ドキュメントや運営周りの整備 イベントでの宣伝
  65. 65. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. まとめ 65
  66. 66. Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. MDS とは 66 事象を自然なデータ構造で表現できる世界 大量のデータを柔軟に効率よく扱うための フォーマット を実現する

×