More Related Content
Similar to Hadoopエコシステムのデータストア振り返り (20)
More from NTT DATA OSS Professional Services (20)
Hadoopエコシステムのデータストア振り返り
- 1. © 2018 NTT DATA Corporation
NTTデータ テクノロジーカンファレンス 2018
© 2018 NTT DATA Corporation© 2018 NTT DATA Corporation
Hadoopエコシステムのデータストア振り返り
2018年10月31日
株式会社NTTデータ 岩崎正剛
- 2. © 2018 NTT DATA Corporation 2
Hadoopエコシステムのデータストア
• 今回(も)取り上げるのは以下の3つ
– HDFS: 分散ファイルシステム
– HBase: 分散キーバリューストア
– Kudu: 分散Columnarストア
- 3. © 2018 NTT DATA Corporation 3
背景とお題
• クラウドサービスの充実
• 自分でHadoopを運用するのは大変
• マネージドサービスで済むなら楽
• 使い分けのポイントは? とか
俺Hadoopが活きる場面はなんだろう?
という切り口でHDFS、HBase、Kuduを眺めてみる
• おもにコスト以外の側面で
- 4. © 2018 NTT DATA Corporation 4
比較されがちなマネージドサービス
• HDFS:
– Amazon S3
– Azure Blob Strage
• HBase:
– Amazon DynamoDB
– Google Cloud Bigtable
• Kudu(+Impala):
– Google Bigquery
– Google Cloud Spanner
- 5. © 2018 NTT DATA Corporation 5
HDFSとHadoop FileSystem API
- 6. © 2018 NTT DATA Corporation 6
HDFS(Hadoop Distributed File System)の概要
• POSIX非準拠なユーザ空間分散ファイルシステム
• 大きなファイル(100+MB)の格納に最適化
• 分散処理FW向けの高スループットなデータIO
– データローカリティ: データのある場所で処理実行
• マスターノードがメタデータを管理
NameNode
DataNode
DataNode
DataNode
DataNode
- 7. © 2018 NTT DATA Corporation 7
ファイルシステム?
• データをファイルという単位で管理する
• ファイルはデータ(バイト列)の入れ物
• ディレクトリはファイルやディレクトリの入れ物
• 階層的なディレクトリ構造でファイルを整理
• ディレクトリは中身の一覧を取得できる
• ファイルとディレクトリはメタデータ(owner, ...)を持つ
• ...
- 8. © 2018 NTT DATA Corporation 8
Hadoop FileSystem API
• Hadoopが提供するファイル操作インタフェース
• 基本的にはHDFSの機能を抽象化したもの
boolean mkdirs(Path f, FsPermission permission)
FSDataOutputStream create(Path f)
FSDataInputStream open(Path f)
FSDataOutputStream append(Path f)
boolean delete(Path f, boolean recursive)
FileStatus[] listStatus(Path f)
void setPermission(Path p, FsPermission permission)
void setOwner(Path p, String username, String groupname)
void setXAttr(Path path, String name, byte[] value, EnumSet<XAttrSetFlag>
Path createSnapshot(Path path)
...
- 9. © 2018 NTT DATA Corporation 9
FileSystem実装いろいろ
• FileSystem APIを使ってアプリケーションを書くと
HDFS以外のデータストアにも透過的にアクセスできる
• MapReduceやSparkが(使っているパーツが)活用
• Hadoopビルトインの実装もいろいろ
• ファイルシステムではないデータストア用もある
DistributedFileSystem
LocalFileSystem
S3AFileSystem
NativeAzureFileSystem
AdlFileSystem
SwiftNativeFileSystem
...
- 10. © 2018 NTT DATA Corporation 10
Amazon S3
• マネージドサービスなオブジェクトストレージ
• 最大5TBのデータを格納
• REST APIでアクセス
– PUT, GETで読み書き
• オブジェクト(データ)はフラットなキー空間で管理
– 階層的なディレクトリはない
• FileSystem実装はS3をファイルシステムにみせかける
• ユーザが多く歴史が長い
- 11. © 2018 NTT DATA Corporation 11
NDFS
• Hadoopは元々Nutchのサブモジュールだった
• Googleが論文として発表したGFSやMapReduceを参考にDoug Cuttingが...
• Nutch Distributed File System
• ローカルFSでも透過的にアプリを実行する仕組みを用意
• その後、モジュールは切り出されてHadoopに
– NUTCH-193: MapReduce and NDFS code moved to new project, Hadoop.
LocalFileSystem extends NutchFileSystem
NDFSFileSystem extends NutchFileSystem
- 12. © 2018 NTT DATA Corporation 12
Path should use URI syntax
• HADOOP-571
• PathをURIで指定できるように
• クライアントライブラリ内で
URIのスキームに応じてFileSystem実装を自動切替
• 複数のデータストア間のファイル操作に便利
$ hadoop fs -cp file:///a/b hdfs://ns/c/d
$ hadoop fs -cp hdfs://ns/c/d s3a://bc/e/f
- 13. © 2018 NTT DATA Corporation 13
S3FileSystem
• HADOOP-574: want FileSystem implementation for Amazon S3
– Resolved: 14/Dec/2006
• s3://でアクセス
• S3FileSystemで書いたファイルしか読めない
– ファイルはHDFSと同じ要領でブロックに分けて管理
• pathがキーのオブジェクトにブロックIDのリストを格納
• ブロックIDがキーのオブジェクトに実データを格納
/dir1
/dir1/file1
block-6415776850131549260
block-3026438247347758425
- 14. © 2018 NTT DATA Corporation 14
NativeS3FileSystem
• HADOOP-930: Add support for reading regular (non-block-
based) files from S3 in S3FileSystem
• s3n://でアクセス
• オブジェクトのデータ=ファイルのデータ
– write時はローカルファイルに書いてclose時にupload
• ディレクトリは専用suffixを持つ空オブジェクトで表現
– 末尾に _$folder$ が付く
– MIME typeを使うと識別するのに各オブジェクトに要アクセス
– キー名で区別がつくとキー一覧取得だけでlsが実現できる
$ hadoop fs -mkdir s3n://bc/a/b
-> /a/b_$folder$
- 15. © 2018 NTT DATA Corporation 15
S3AFileSystem
• HADOOP-10400: Incorporate new S3A FileSystem implementation
• s3a://でアクセス
• ディレクトリはキー末尾が "/" の空オブジェクトで表現
– 他のS3用ツールで使われだした流儀に合わせる
• NativeS3FileSystemをリプレースする改良版
– 複数ファイルの処理の並列化
– IAMロールベースの認証
– エラー処理の改善
– multipart upload
– seekの高速化
- 16. © 2018 NTT DATA Corporation 16
FileSystem on Microsoft Azure
• NativeAzureFileSystem
– HADOOP-9629:
Support Windows Azure Storage - Blob file system in Hadoop
– wasb://...
• AdlFileSystem
– HADOOP-12666:
Support Microsoft Azure Data Lake - as a file system in Hadoop
– adl://...
• AzureBlobFileSystem
– HADOOP-15407:
Support Windows Azure Storage - Blob file system in Hadoop
– adfs://...
- 17. © 2018 NTT DATA Corporation 17
FileSystem specification
• HADOOP-9361: Strictly define the expected behavior of
filesystem APIs and write tests to verify compliance
• FileSystemの仕様をちゃんと文書化
– https://hadoop.apache.org/docs/r3.1.0/hadoop-project-
dist/hadoop-common/filesystem/index.html
• 仕様の満足度のテストシステムを追加
@Test
public void testGetFileStatusRoot() throws Throwable {
ContractTestUtils.assertIsDirectory(
getFileSystem().getFileStatus(new Path("/")));
}
- 18. © 2018 NTT DATA Corporation 18
FileSystem on S3の課題
• S3のeventual consistency
– オブジェクトをUpdateした直後に古いデータが見える
– Deleteしたオブジェクトが直後に見える
– Createしたオブジェクトが直後にリストに出ない
• 後続ジョブが前段の出力を使うときに問題
• renameが高コスト
– キーの変更はできない
– なので新規オブジェクトにデータコピーして元を削除
– ディレクトリのrenameはその繰り返し
- 19. © 2018 NTT DATA Corporation 19
S3Guard: Improved Consistency for S3A
• HADOOP-13345
• S3AFileSystemの一貫性を改善するアドオン
– createしたファイルが確実にlsに出てくる
• 補助的なメタデータ置き場としてDynamoDBを利用
– create: S3にオブジェクト作成後、DynamoDBに記録
– listStatus: S3(キー一覧)とDynamoDBの両方を見る
• inspired by EMRFS and s3mper
– https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-fs.html
– https://github.com/Netflix/s3mper
https://issues.apache.org/jira/secure/attachment/12821464/S3GuardImprovedConsistencyforS3AV2.pdf
- 20. © 2018 NTT DATA Corporation 20
HDFSとFileSystem API まとめ
• FileSystem APIは各種データストアへのアクセスを提供
– オブジェクトストレージのサービスも使える
– アプリケーションをデータストア透過的に書ける
– データストアの併用もできる
• HDFSならではのポイント
– ファイルシステムのセマンティクス
• 一貫性があり高速なメタデータ管理
• 細かいAPI(read, write, fsync (HBaseの項で後述)
– データローカリティもあるよ
- 22. © 2018 NTT DATA Corporation 22
HBaseの概要
• 分散キーバリューストア
– キーのレンジパーティショニングでデータを分散
– プリミティブなAPI(put, get, scan, batch)
– スケーラブル
• データ増加に応じてテーブルを自動分割
• ノード間で自動rebalance
• HDFS上に実装
– HADOOP-1045: Add contrib/hbase, a BigTable-like online database.
– データファイルとWALファイルをHDFSに書く
– 小データのランダムwrite/readが得意
• HDFSの苦手なワークロードをカバー
NameNode
RegionServer
RegionServer
RegionServer
HMaster
DataNode
DataNode
DataNode
- 23. © 2018 NTT DATA Corporation 23
HBaseのデータモデル
row
family:f1 family:f2
qualifier:a qualifier:b qualifier:c qualifier:d
r1 a1 b1 c1 d1
r2 b2 d2
$ hbase o.a.h.h.io.hfile.HFile -f .../f1/2c15a -p
K: r1/f1:a/1540305882646/Put/vlen=2/seqid=4 V: a1
K: r1/f1:b/1540305889773/Put/vlen=2/seqid=5 V: b1
K: r2/f1:b/1540305914939/Put/vlen=2/seqid=6 V: b2
$ hbase o.a.h.h.io.hfile.HFile -f .../f2/2c15a -p
K: r1/f2:c/1540305975753/Put/vlen=2/seqid=7 V: c1
K: r1/f2:d/1540305981923/Put/vlen=2/seqid=8 V: d1
K: r2/f2:d/1540306017649/Put/vlen=2/seqid=9 V: d2
論理的な行
atomicに更新可能
テーブルは
サイズベース
で水平分割
- 24. © 2018 NTT DATA Corporation 24
HBaseのWAL書き込み
• HDFSのhflush/hsyncを利用
– HADOOP-1700: Append to files in HDFS
– HADOOP-2657: Enhancements to DFSClient to support flushing data at any point in time
• fsyncに相当: ファイルをcloseせずwriteをdurableに
• WALエントリのwrite確定後にクライアントにレスポンス
DataNode
NameNode
DataNode
Client
DataNode
write
ack
write
IBR
addBlock
LocatedBlock
write
ack
ackwrite済みのデータの
ackが戻るまで待つ
hsyncだとackを返
す前にfsync
- 25. © 2018 NTT DATA Corporation 25
HBase on Amazon S3
• HBASE-17437: Support specifying a WAL directory
outside of the root directory
– contributed by AWS
– https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hbase-s3.html
<property>
<name>hbase.rootdir</name>
<value>s3a://mybucket/hbase-root</value>
</property>
<property>
<name>hbase.wal.dir</name>
<value>hdfs://mycluster/hbase-wal</value>
</property>
- 26. © 2018 NTT DATA Corporation 26
HBase 1.0 API
• APIをクリーンアップ
– HBASE-10479: HConnection interface is public but is used internally, and contains a bunch of methods
– HBASE-12127: Move the core Connection creation functionality into ConnectionFactory
– ..........
• Googleのエンジニアが協力
• HBaseのアプリがそのままCloud Bigtableに接続可能
– ConnectionFactgory#createConnectionが返すオブジェクトを切り替え
– 利用できないAPIもある
• https://cloud.google.com/bigtable/docs/hbase-differences
<property>
<name>hbase.client.connection.impl</name
<value>com.google.cloud.bigtable.hbase1_x.BigtableConnection</value>
</property>
- 27. © 2018 NTT DATA Corporation 27
Coprocessor
• HBASE-2000: Coprocessors
• サーバプロセス内で任意の処理を実行する機構
– しくじればサーバプロセスは落ちる
• Endpoint: ストアドプロシージャのようなもの
• Observer: トリガーのようなもの
• MasterObserver
• RegionObserver
• RegionServerObserver
• WALObserver
• ...
• HBase自身も活用
– 既存コードと新規機能を完全分離できる
- 28. © 2018 NTT DATA Corporation 28
RegionObserverのメソッド
preAppend
preAppendAfterRowLock
preBatchMutate
preBulkLoadHFile
preCheckAndDelete
preCheckAndDeleteAfterRowLock
preCheckAndPut
preCheckAndPutAfterRowLock
preClose
preCommitStoreFile
preCompact
preCompactScannerOpen
preCompactSelection
preDelete
preExists
preFlush
preFlush
preFlushScannerOpen
preGetOp
preIncrement
preIncrementAfterRowLock
preMemStoreCompaction
preMemStoreCompactionCompact
preMemStoreCompactionCompactScannerOpen
preOpen
prePrepareTimeStampForDeleteVersion
prePut
preReplayWALs
preScannerClose
preScannerNext
preScannerOpen
preStoreFileReaderOpen
preStoreScannerOpen
preWALRestore
postAppend
postBatchMutate
postBatchMutateIndispensably
postBulkLoadHFile
postCheckAndDelete
postCheckAndPut
postClose
postCloseRegionOperation
postCommitStoreFile
postCompact
postCompactSelection
postDelete
postExists
postFlush
postFlush
postGetOp
postIncrement
postInstantiateDeleteTracker
postMemStoreCompaction
postMutationBeforeWAL
postOpen
postPut
postReplayWALs
postScannerClose
postScannerFilterRow
postScannerNext
postScannerOpen
postStartRegionOperation
postStoreFileReaderOpen
postWALRestore
- 29. © 2018 NTT DATA Corporation 29
ACL
• HBASE-3025: Coprocessor based simple access control
• 各種処理の前後でアクセス制御
• 後にCell単位でも制御可能に
– HBASE-7662: [Per-KV security] Per cell ACLs stored in tags
...
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.regionserver.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
- 30. © 2018 NTT DATA Corporation 30
MultiRowMutationEndpoint
• HBASE-5229: Provide basic building blocks for "multi-row" local transactions.
• 同一region内の複数行をatomicに更新する
– 本体(HRegion)への機能追加だがpublicなAPIにしたくないのでEndpointを利用
• metaテーブルの操作のために作った
– assignやsplitのときmetaに複数行をatomicにputしたい
• 昔はZooKeeperで制御: see HBASE-11059: ZK-less region assignment
– metaテーブルはsplitされない
• 普通のテーブルで使うにはRegionSplitPolicyによる工夫が必要
return TableDescriptorBuilder.newBuilder(TableName.META_TABLE_NAME)
...
.setCoprocessor(CoprocessorDescriptorBuilder.newBuilder(
MultiRowMutationEndpoint.class.getName())
.setPriority(Coprocessor.PRIORITY_SYSTEM)
.build());
- 31. © 2018 NTT DATA Corporation 31
Apache Tephra
• TransactionAwareHTable implements Table
• cellのタイムスタンプにトランザクションIDを埋め込む
public RegionScanner preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> e, Scan
throws IOException {
Transaction tx = getFromOperation(scan);
if (tx != null) {
projectFamilyDeletes(scan);
scan.setMaxVersions();
scan.setTimeRange(TxUtils.getOldestVisibleTimestamp(ttlByFamily, tx, readNonTxnData),
TxUtils.getMaxVisibleTimestamp(tx));
Filter newFilter = getTransactionFilter(tx, ScanType.USER_SCAN, scan.getFilter());
scan.setFilter(newFilter);
}
return s;
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.tephra.hbase.coprocessor.TransactionProcessor</value>
</property>
- 32. © 2018 NTT DATA Corporation 32
HBaseまとめ
• Google Cloud BigtableはHBase APIをサポート
– アプリケーションをBigtable透過的に書ける
• HBaseならではのポイント
– フルセットのHBase API
– Coprocessorによる高い拡張性
– それを活かして作られたツール群
- 34. © 2018 NTT DATA Corporation 34
Kuduの概要
• 分散Columnarストア
– Analytics向け: 構造化データに対する高速なscan
– INSERT/UPDATEをサポート
• SQL処理系は提供しない
– API(insert, update, scan)でデータにアクセス
– SQL処理系から使われることを想定
– Impalaが標準SQLエンジン的な扱い
id(pk): int64 ts:timestamp foo:string
1 1111111 f
2 2222222 ff
3 3333333 fff
- 35. © 2018 NTT DATA Corporation 35
更新を実現する仕組み
• HBaseと同じLSM-x
– データファイルはrandom updateできない/しない
– 書き込みはメモリに -> 溜まったらファイルに書き出す
– 読み込みはメモリとディスクの両方みる
– データファイルはときどきまとめつつゴミ掃除
• HBaseと同じようにHDFS上に作れそうだが
HFile
CFile
HFile
Cfile
MemStore
HFile
CFile
readwrite
flush compaction
- 36. © 2018 NTT DATA Corporation 36
HBaseとの違い
• HDFSやZooKeeperに非依存
– 他のミドルウェアに依存するとバージョン間整合の維持が厄介
– コントロールできない部分が残る: 例) HBaseのデータローカリティ
– スピード感が落ちる: 例) HDFSに修正を提案しても反応が鈍い
– 必要な機能(leader electionとデータ冗長化)はRaft実装を作って賄う
• JavaではなくC++で実装
– ヒープサイズの上限に縛られない(オフヒープは煩雑)
– OS/HWをフル活用できない(JNIは煩雑)
• Kudu作者はもともとHadoopおよびHBaseのコア開発者
– あえての選択
– 過去にRaftを参考にNameNode-HA(QJM+JournalNode)を作った
• HDFS-3077: Quorum-based protocol for reading and writing edit logs
- 37. © 2018 NTT DATA Corporation 37
Kuduのテーブル分割
• KUDU-818: Support table partitioning other than PK range partitioning
• RangeパーティショニングとHashパーティショニング
• 動的分割ではない
– hashのバケット数は後から変えられない
– rangeは手動で追加、削除可能
• 組み合わせ可能: rangeは1つ、hashは多次元化できる
(2016/01, 333) (2017/05, 333) (2018/04, 333)
(2016/02, 222) (2017/04, 222) (2018/08, 222)
(2016/03, 111) (2017/03, 111) (2018/12, 111)
hash
range
2016 2017 2018
- 38. © 2018 NTT DATA Corporation 38
kudu-spark
• Spark SQLのData Sourcesに対応
• 基本的なfilterはプッシュダウンされる
– o.a.spark.sql.sources.Filter => o.a.kudu.client.KuduPredicate
• KuduのJava APIと併用もできる
spark.read.options(Map("kudu.master" -> "lh","kudu.table" -> "foo"))
.kudu.as[Foo].foreachPartition { it => foobar(it, kuduContext) }
...
def foobar(it: Iterator[Foo], kc: KuduContext): Unit = {
val client = kc.syncClient
val session = client.newSession()
val bar = client.openTable("bar")
while(it.hasNext) {
val f = it.next
val b = bar.newUpdate()
b.getRow.addLong("a", f.id)
...
- 39. © 2018 NTT DATA Corporation 39
Kuduのconsistency
• KUDU-430: Consistent Operations
– Analyticsでもイベントの順序関係が重要なケースのために
• timestampベースの仕組みを提供
– Read:
• READ_LATEST: 最新のcommit済データを読む
• READ_AT_SNAPSHOT: scannerにセットしたタイムスタンプ時点のデータを読む
• READ_YOUR_WRITES: 自分のwriteが読めるようなタイムスタンプを自動セット
– READ_AT_SNAPSHOTのバリエーション
– KUDU-1704: Add a new read mode to perform bounded staleness snapshot reads
– Write:
• CLIENT_PROPAGATED: クライアント間で順序を保つためにtimestampをやりとり
• COMMIT_WAIT: ノード間の時刻ずれ分commitを待つ
• 複数行をatomicに更新する仕組みは(まだ)ない
- 40. © 2018 NTT DATA Corporation 40
Kuduまとめ
• SQLだと...もともと透過的に使いやすい
• Kuduならではのポイント
– データを随時追加、更新可能
– 柔軟なテーブル分割戦略
– SQLエンジンと疎結合
• SparkやMapReduceからの利用
• データローカリティもあるよ
– 一貫性まわりの機能
- 42. © 2018 NTT DATA Corporation 42
おわりに
• クラウドサービス充実した
• それでもHadoopは役に立つ
– クラウドサービスを透過的に活用できるAPI
– バックグラウンドの知識
• Hadoopはオープンソースソフトウェア
– 中が見えるっていいよね
– ロマンあふれる魔改造も
- 43. © 2018 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。