Seven Databases in Seven Weeks HBase ふつかめ. Hbase とは何か Google File Sytem (GFS) MapReduceBigTable Google の 内部システム (発表した論文より) Hadoop Distributed File Sytem.

Slides:



Advertisements
Similar presentations
Seven Databases in Seven Weeks HBase. HDFS (Hadoop Distributed File System) Server DFS HBase.
Advertisements

DTM を使った楽曲制作 DTM を扱う職業などの調査 北海道情報大学 情報メディア学 部 情報メディア学科 新井山ゼミ 宮本 拓美.
P HI T S スクリプト言語を用いた PHITS の連続 実行 Multi-Purpose Particle and Heavy Ion Transport code System title 年 2 月改訂.
DTM を使った楽曲制作 DTM を扱う職業などの調査 北海道情報大学 情報メディア学 部 情報メディア学科 新井山ゼミ 宮本 拓美.
数学のかたち 数学解析の様々なツール GRAPSE編 Masashi Sanae.
SS2-15:A Study on Image Recognition and Understanding
SQLite3
インターネット技術特論 H:SQLite3 山口 実靖
計算機工学III オペレーティングシステム #14 ファイル: より進んだファイルシステム 2006/07/21 津邑 公暁
Kyoto Tycoonのご紹介 FAL Labs
JPAを利用した RESTful Webサービスの開発
SAP システムにおける SQL Server 運用ノウハウ
3-1 MySQLについて 発表者:藤村元彦 自然言語処理研究室.
スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成
SLAT2/ChaKi.NET DB Model 解説資料 (兼 ChaKi-SLAT 統合状況の経過説明)
第5回 2007年5月25日 応用Java (Java/XML).
第4回 2007年5月11日 応用Java (Java/XML).
第13回 プログラミングⅡ 第13回
Ruby勉強会(第1回) 2006/06/29 竹内豪.
キャンパスクラウドによる 実験環境の構築 情報ネットワーク特論 講義資料.
卒研:データベースチーム 第4回 DOMを使った処理
Visual Studio LightSwitchの概要
輪講: 詳解TCP/IP ACE B3 suzuk.
プログラムNo.:論文タイトル 氏名1(所属1),氏名2(所属2),…
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
CiNii Articlesトップページ クイックガイド <キーワードによる検索方法>
パフォーマンスチューニング on Rails
14.テーブル定義,一対多の関係,多対多の関係, 外部キー,索引(インデックス),データベース操作
スクリプト言語を用いたPHITSの連続実行
マイクロソフト Access での SQL 演習 第1回 SQL問い合わせ(クエリ)
2004/05/13 3-4 データ型(カラムタイプ) について 発表者:藤村元彦 自然言語処理研究室.
Cisco Catalyst 2960L Loop Detection のご紹介 2018 年 1 月.
SQL パフォーマンス チューニング ~ カバーリングインデックス/クエリヒントの利用~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
第10回 2007年6月29日 応用Java (Java/XML).
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
3-10. MySQLシステムの管理  2004年6月10日  大北高広                01T6010F.
第1回.リレーショナルデータベースを使ってみよう
第1回.リレーショナルデータベースを使ってみよう
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
東京工科大学 コンピュータサイエンス学部 亀田弘之
第3回 2007年4月27日 応用Java (Java/XML).
わんくま同盟・techbank.jp 夏椰 Insight Technology, Inc. 今川 美保
Windows PowerShell Cmdlet
MPIとOpenMPを用いた Nクイーン問題の並列化
第6回 2007年6月1日 応用Java (Java/XML).
2008/09/20 RDBでCDB 山ノ内.
第3回.テーブルの結合 結合条件 SQL を用いた結合問い合わせ.
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
情報工学概論 (アルゴリズムとデータ構造)
講義ノート共有データベース NoteTotter?
カラム指向型データベース向けハードウェアキャッシュ機構の検討
ソフトウェア保守のための コードクローン情報検索ツール
プログラミング入門.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
B演習(言語処理系演習)第2回 田浦.
プログラミング演習Ⅲ- Sorting Quick Sort and Merge Sort
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
CQI: 統一的クエリーインターフェース クラウドコンポーザビリティをサポートするPaaSシステム(1)
Mondriaan Memory Protection の調査
再帰CTE を使って遊ぼう 大阪#9 2012/04/14.
SQL パフォーマンス チューニング ~ パフォーマンス改善 最初の一歩 ~
CO-Client Opeartion 1.1 利用履歴データベースの設計 (スキーマ バージョン 対応)
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
第1回.リレーショナルデータベースを使ってみよう
L4-Linux のメモリ管理における問題点とその解決策
SQL データベース論 第11回.
Presentation transcript:

Seven Databases in Seven Weeks HBase ふつかめ

Hbase とは何か Google File Sytem (GFS) MapReduceBigTable Google の 内部システム (発表した論文より) Hadoop Distributed File Sytem (HDFS) MapReduceHBase Hadoop プロジェクト ( Google クローン) バッチ処理リアルタイム応答 復習

RowKeyColumnFamily1ColumnFamily2ColumnFamily3 1Column1Column2Column1Column2Column1 2Column2Column3Column2Column3 BigTable ( ソート済列志向データベース ) スキーマで定義する スキーマレス(自由に追加できる) 必須 ソート済 #FFF ある Column #000 #0F0 #00F #F00 timestamp 1 timestamp 2 timestamp 3 timestamp 4 timestamp 5 タイムスタンプでバージョニングされる 復習

RowKeyColumnFamily1ColumnFamily2ColumnFamily リージョン リージョン分割・自動シャーディング リージョン テーブルはリージョンで物理的に分割(シャーディング)される リージョンはクラスタ中のリージョンサーバが担当する リージョンは ColumnFamily 毎に作られる リージョンは ソート済の RowKey を適当なサイズで分割する 復習

HBase の特徴 自動シャーディング・自動フェールオーバー データの一貫性 (CAP:Consistency) Hadoop/HDFS 統合 テーブルサイズが大きくなった時、自動的に分割する 分割されたシャードは、ノード障害時に自動的にフェールオーバーする データの更新は反映された瞬間から読出可能 結果的に同じ値が読めるようになる(結果整合性)条件緩和を取らない Hadoop の HDFS 上 に展開できる Hadoop/MapReduce で API を挟まず HBase を入出力の対象にできる 復習

7 つのデータベース7つの世界 での構成 1日目: CRUD とテーブル管理 2日目:ビッグデータを扱う 3日目:クラウドに持っていく スタンドアロンで Hbase を動かす テーブルを作る データの出し入れをする Wikipedia ダンプを投入する スクリプト (Not Shell) での操作に慣れる Thrift を使って操作する Whirr を使って EC2 にデプロイする 今回は扱いません

Wikipedia の ダンプファイルを HBase で扱う

<mediawiki xmlns= xmlns:xsi= xsi:schemaLocation= version="0.8" xml:lang="ja"> Wikipedia MediaWiki 1.22wmf2 first-letter メディア 特別 アンパサンド T22:31:33Z Addbot ボット : 言語間リンク 31 件を [[d:| ウィキデータ ]] 上の [[d:q11213]] に転記 {{ 記号文字 |&amp;}} [[Image:Trebuchet MS ampersand.svg|right|thumb|100px|[[Trebuchet MS]] フォント ]] [[Category: ラテン語の語句 ]] 4duebxtzaadjddpy3036cey6451d992 wikitext text/x-wiki … サンプルデータ

<mediawiki xmlns= xmlns:xsi= xsi:schemaLocation= version="0.8" xml:lang="ja"> Wikipedia MediaWiki 1.22wmf2 first-letter メディア 特別 アンパサンド T22:31:33Z Addbot ボット : 言語間リンク 31 件を [[d:| ウィキデータ ]] 上の [[d:q11213]] に転記 {{ 記号文字 |&amp;}} [[Image:Trebuchet MS ampersand.svg|right|thumb|100px|[[Trebuchet MS]] フォント ]] [[Category: ラテン語の語句 ]] 4duebxtzaadjddpy3036cey6451d992 wikitext text/x-wiki … サンプルデータ Rowkey:titleidtextrevision アンパサンド 5 {{ 記号文字 … parentid: …

hbase(main):004:0> create 'wiki', 'id', 'text', 'revision' 0 row(s) in seconds hbase(main):005:0> disable 'wiki' 0 row(s) in seconds hbase(main):006:0> alter 'wiki', {NAME=>'text', COMPRESSION=>'GZ', BLOOMFILTER=>'ROW'} Updating all regions with the new schema... 1/1 regions updated. Done. 0 row(s) in seconds hbase(main):007:0> enable 'wiki' 0 row(s) in seconds Rowkey:titleidtextrevision アンパサンド 5 {{ 記号文字 … parentid: … スキーマ定義 ColumnFamily:Text の 圧縮・ BloomFilter 有効 スキーマ作成 BloomFilter ‘ROW’ : RowKey のみ 'ROWCOL' : RowKey/ColumnFamily リージョン中に指定した RowKey/ColumnFamily がないことを高速に検知する リージョン中の RowKey/ColmnFamily クエリ

include Java import org.apache.hadoop.hbase.client.HTable import org.apache.hadoop.hbase.client.Put import org.apache.hadoop.hbase.HBaseConfiguration import javax.xml.stream.XMLStreamConstants require "time" def jbytes(*args) args.map { |arg| arg.to_s.to_java_bytes } end factory = javax.xml.stream.XMLInputFactory.newInstance reader = factory.createXMLStreamReader(java.lang.System.in) table = HTable.new( HBaseConfiguration.new, "wiki" ) document = nil buffer = nil count = 0 while reader.has_next type = reader.next if type == XMLStreamConstants::START_ELEMENT tag = reader.local_name case tag when 'page' then document = {} when /title|id|parentid|timestamp|text/ then buffer = [] end elsif type == XMLStreamConstants::CHARACTERS text = reader.text buffer << text unless buffer.nil? elsif type == XMLStreamConstants::END_ELEMENT tag = reader.local_name case tag when /title|id|parentid|timestamp|text/ then document[tag] = buffer.join when 'revision' key = document['title'].to_java_bytes ts = (Time.parse document['timestamp']).to_i p = Put.new(key, ts) p.add( *jbytes("text", "", document['text']) ) p.add( *jbytes("id", "", document['id']) ) p.add( *jbytes("revision", "parendid", document['parentid']) ) table.put(p) count += 1 table.flushCommits() if count % 50 == 0 puts "#{count} records inserted (#{document['title']})" if count % 1000 == 0 end table.flushCommits() puts "#{count}" exit データ投入用コード opt]# cat jawiki-latest-pages-meta-current.xml | time hbase /bin/hbase org.jruby.Main hoge.rb user system 28:29.00elapsed 60%CPU (0avgtext+0avgdata maxresident)k 304inputs+4072outputs (0major+91296minor)pagefaults 0swaps 実行例

document = nil buffer = nil count = 0 while reader.has_next type = reader.next if type == XMLStreamConstants::START_ELEMENT tag = reader.local_name case tag when 'page' then document = {} when /title|id|parentid|timestamp|text/ then buffer = [] end elsif type == XMLStreamConstants::CHARACTERS text = reader.text buffer << text unless buffer.nil? elsif type == XMLStreamConstants::END_ELEMENT tag = reader.local_name case tag when /title|id|parentid|timestamp|text/ document[tag] = buffer.join when 'revision' key = document['title'].to_java_bytes ts = (Time.parse document['timestamp']).to_i p = Put.new(key, ts) p.add( *jbytes("text", "", document['text']) ) p.add( *jbytes("id", "", document['id']) ) p.add( *jbytes("revision", "parendid", document['parentid']) ) table.put(p) count += 1 table.flushCommits() if count % 50 == 0 if count % 1000 == 0 puts "#{count} records inserted (#{document['title']})“ end table.flushCommits() puts "#{count}" exit アンパサンド T22:31:33Z Addbot … 4duebxtzaadjddpy3036cey6451d992 wikitext text/x-wiki … 開始タグ 終了タグ タグ内要素 投入 データ投入用コード

実験 投入時 取出し時 Q: text 領域の GZ 圧縮により高速化するのか? A: 46min -> 26min (70% 高速化 ) Q: text 領域の GZ 圧縮によりデータ領域は節約されるのか? A: 8.1GB -> 2.6GB (32% のサイズに圧縮 ) Q: text 領域の GZ 圧縮により get は高速化するのか? A: 有意な差がない Q: 全体 scan と部分 scan での速度差は? A: 0.136[s] ( 開始 RowKey 指定,10 件 ) vs [s]( 全体,Column 値条件検索 ) Q: text 領域の GZ 圧縮により scan は高速化するのか? A: 条件による(次ページ)

GZ 圧縮と Text (大きな ColumnFamily )と scan hbase(main):001:0> scan 'wiki', {COLUMN=>['id','revision'], FILTER => "SingleColumnValueFilter('revision','parendid',=,'binary: ')"} hbase(main):001:0> scan 'wiki', {FILTER => "SingleColumnValueFilter('revision','parendid',=,'binary: ')"} hbase(main):001:0> scan 'wiki', {FILTER => "SingleColumnValueFilter('text','',=,'substring: ぱんだねこ ')"} titleidtextrevision リージョン