はてな流大規模データ処理.

Slides:



Advertisements
Similar presentations
ファイルキャッシュを考慮したディスク監視のオフロード
Advertisements

セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
オペレーティングシステム 第10回 仮想記憶管理(1)
■パス検索 各種ファイルを操作するには、まずパス名をiノードに変換しなければならない。 以下にパス名をiノードに変換する関数の説明を行う。
Webアプリケーション開発の 基本的なポイント
LZ圧縮回路の設計とハード・ソフト 最適分割の検討 電子情報デザイン学科 高性能計算研究室 4回生 中山 和也 2009/2/27.
SAP システムにおける SQL Server 運用ノウハウ
知識情報演習Ⅲ(後半第1回) 辻 慶太(水)
全体ミーティング (4/25) 村田雅之.
分散コンピューティング環境上の Webリンク収集システムの実装
SQL J2EE I 第3回 /
AllReduce アルゴリズムによる QR 分解の精度について
検索エンジンに関して The Anatomy of a Large-Scale Hypertextual Web Search Engine
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
3-2.データを取り出す 2004年 5月20日(木) 01T6074X 茂木啓悟.
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
ファイルシステムキャッシュを 考慮したIDSオフロード
LogStructuredFileSystem Servey
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
パフォーマンスチューニング on Rails
IIR輪講復習 #5 Index compression
アルゴリズム入門.
マイクロソフト Access での SQL 演習 第1回 SQL問い合わせ(クエリ)
メモリ管理 4.3, 4.4 章 さだ.
サスペンドした仮想マシンの オフラインアップデート
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
実際にたたいてAPI APIの初歩からプログラムまで使用方法のAtoZ.
MPIによる行列積計算 情報論理工学研究室 渡邉伊織 情報論理工学研究室 渡邉伊織です。
IIR輪講復習 #4 Index construction
型付きアセンブリ言語を用いた安全なカーネル拡張
SQL パフォーマンス チューニング ~ カバーリングインデックス/クエリヒントの利用~
IIR輪講復習 #1 Boolean retrieval
3-10. MySQLシステムの管理  2004年6月10日  大北高広                01T6010F.
定兼邦彦 今井浩 東京大学理学系研究科 情報科学専攻
VM専用仮想メモリとの連携による VMマイグレーションの高速化
IaaS型クラウドにおける インスタンス構成の動的最適化手法
人工知能特論 9.パーセプトロン 北陸先端科学技術大学院大学 鶴岡 慶雅.
実行時情報に基づく OSカーネルのコンフィグ最小化
仮想メモリを用いた VMマイグレーションの高速化
IIR輪講復習 #17 Hierarchical clustering
IIR輪講復習 #3 Dictionaries and tolerant retrieval (前半)
仮想計算機を用いたサーバ統合に おける高速なリブートリカバリ
情報検索(6) メディア検索の仕組み 教員 岩村 雅一
3-6.インデックスについて 3-7.関数と併用されることの 多いMySQLコマンド
オペレーティングシステムJ/K (仮想記憶管理)
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
Internet広域分散協調サーチロボット の研究開発
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
半構造化テキストに対する 文字列照合アルゴリズム
変換されても変換されない頑固ベクトル どうしたら頑固になれるか 頑固なベクトルは何に使える?
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
プログラミング 4 整列アルゴリズム.
複数ホストにまたがって動作する仮想マシンの障害対策
VMMのソフトウェア若化を考慮した クラスタ性能の比較
情報コミュニケーション入門b 第11回 Web入門(2)
VMが利用可能なCPU数の変化に対応した 並列アプリケーション実行の最適化
Peer-to-Peerシステムにおける動的な木構造の生成による検索の高速化
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
Data Clustering: A Review
B03 量子論理回路の 最適化に関する研究 西野哲朗,垂井淳,太田和夫,國廣昇 電気通信大学 情報通信工学科.
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
再帰CTE を使って遊ぼう 大阪#9 2012/04/14.
アルゴリズムとデータ構造1 2009年6月15日
クラスタリングを用いた ベイズ学習モデルを動的に更新する ソフトウェア障害検知手法
CO-Client Opeartion 1.1 利用履歴データベースの設計 (スキーマ バージョン 対応)
テキストデータベース.
アルゴリズムとデータ構造 2010年6月17日
L4-Linux のメモリ管理における問題点とその解決策
SQL J2EE I (データベース論) 第3回 /
ベイジアンネットワークと クラスタリング手法を用いたWeb障害検知システムの開発
Presentation transcript:

はてな流大規模データ処理

アジェンダ 大規模なデータ OS のキャッシュ MySQLの運用 大規模データアプリケーションの開発

大規模なデータ

大規模データ はてなブックマーク mysql> select count(*) from relword; +----------+ | 51780147 | 1 row in set (0.00 sec)

はてなブックマークのデータ規模 レコ―ド数 データサイズ 1,073万エントリー 3,134万ブックマーク 4,743万タグ エントリー 2.5GB ブックマーク 4GB タグ 3.4GB HTML 100GB超

大規模データへのクエリ mysql> select url from entry use index(hoge) where eid = 9615899; ... 200秒待っても結果が返って来ない

大規模データの難しい所 メモリ内で計算できない

メモリとディスクの速度差 メモリはディスクの100倍以上高速 メモリ 7 .5 GB/sec ディスク 58MB/sec % sudo /sbin/hdparm -tT /dev/sda /dev/sda: Timing cached reads: 15012 MB in 1.99 seconds = 7525.03 MB/sec Timing buffered disk reads: 176 MB in 3.02 seconds = 58.37 MB/sec

スケーリングの要所 CPU 負荷のスケーリングは簡単 I/O 負荷のスケーリングは難しい 同じ構成のサーバーを増やす、LB で分散 Web, APサ―バ, クローラー I/O 負荷のスケーリングは難しい 大規模データ データベース

大規模データを扱うコツ いかにしてメモリで済ませるか データ量の増加に強いアルゴリズム、データ構造 圧縮、情報検索技術 局所性を活かした分散 例: 線形探索 → 二分探索 O (n) → O (log n) 圧縮、情報検索技術

大規模データを前に知っておくべき事 OS のキャッシュ層 分散を考慮した RDBMS の運用 アルゴリズムとデータ構造

OS のキャッシュ

メモリとディスク メモリとディスクの速度は 150倍 メモリを使ってディスクアクセスを減らす

OS のキャッシュ Linux のページキャッシュの特性

Linux (x86) のページング機構 仮想メモリ機構の基盤 論理的なリニアアドレスを物理的な物理アドレスへ変換 0xbffff444 (MMU) 物理アドレス 0x00002123

Linux (x86) のページ フラットメモリモデル ページ = 仮想メモリの最小単位 4kb の構造体 ページキャッシュ = カーネルバッファに残った page構造体

Linux のページキャッシュとディスク ディスクの内容をメモリに読み込む 作成したページは破棄せずに残す = ページキャッシュ ページが作成される 作成したページは破棄せずに残す = ページキャッシュ 例外を除きすべての I/O に透過的に作用する ディスクのキャッシュを担う箇所 ... VFS

VFS vfs ext2 ext3 ext4 xfs tmpfs デバイスドライバ

VFSの役割 (1) ファイルシステム実装の抽象化 (2) パフォーマンス ページキャッシュ

VFS データ構造関係図 superblock inode (1) inode番号 inode inode dentry file * inode dentry file 1 1 1 1 1 1 address_space 1 (2) offset * page page page

Linux はページ単位でディスクをキャッシュ ファイルの一部をキャッシュできる address_space → page(s) は Radix Tree 検索コストはファイルの大きさにほとんど依存しない

キャッシュの単位 ページ = 仮想メモリの最小単位 ページキャッシュ ≠ ファイルキャッシュ ページキャッシュ = カーネルバッファに残った page構造体

メモリが空いていればキャッシュ 制限なし sar –r で確認 % sar -r 1 10000 Linux 2.6.11-co-0.6.4 (colinux) 05/28/07 19:50:32 kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad 19:50:33 5800 1005888 99.43 28244 694088 262132 4 0.00 0 19:50:34 5800 1005888 99.43 28244 694088 262132 4 0.00 0 19:50:35 5800 1005888 99.43 28244 694088 262132 4 0.00 0 19:50:36 5800 1005888 99.43 28244 694088 262132 4 0.00 0

メモリを増やすことで I/O 負荷軽減 メモリ 4GB メモリ 8GB 14:10:01 CPU %user %nice %system %iowait %idle 14:20:01 all 8.58 0.00 5.84 16.58 69.00 14:30:01 all 7.41 0.00 5.14 17.81 69.63 14:40:01 all 7.74 0.00 4.97 18.56 68.73 14:50:01 all 7.02 0.00 5.01 16.24 71.72 メモリ 8GB 14:10:01 CPU %user %nice %system %iowait %idle 14:10:01 all 18.16 0.00 11.56 0.80 69.49 14:20:01 all 12.48 0.00 9.47 0.88 77.17 14:30:01 all 14.20 0.00 10.17 0.91 74.72 14:40:01 all 13.25 0.00 9.74 0.75 76.25

透過的に作用する OS起動直後に数GBのファイルを read した結果 18:20:01 kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad 18:30:01 3566992 157272 4.22 11224 50136 2048276 0 0.00 0 18:40:01 3546264 178000 4.78 12752 66548 2048276 0 0.00 0 18:50:01 112628 3611636 96.98 4312 3499144 2048232 44 0.00 44

キャッシュを前提にした I/O 軽減策 データ規模 < 物理メモリなら全てキャッシュできる 経済的コストとのバランスを考慮 現状のコモディティ: 8GB ~ 16GB

キャッシュ仕切れない規模になったら 複数サーバーにスケールさせる ただし単純に増やさない 自前でインデックスを作る CPU 負荷分散では単純に増やす I/O分散では局所性を考慮する 自前でインデックスを作る

単純に台数を増やす場合 キャッシュできない割合は相変わらずそのまま すぐに再度ボトルネックに コピー

局所性を考慮した分散 アクセスパターンを考慮した分散 キャッシュできない箇所がなくなる メモリはディスクの 150倍 アクセスパターンB アクセスパターンA

具体的には RDBMS のテーブル単位での分割 検索のインデクスを辞書の途中で分割する 用途ごとにシステムを「島」に分ける パーティショニング 検索のインデクスを辞書の途中で分割する A ~ E まではサーバ A F ~ I まではサーバB ... 用途ごとにシステムを「島」に分ける

リクエストパターンで「島」に分割 proxy proxy 画像API etc. bot / feed 通常のリクエスト AP DB

ページキャッシュを考慮した運用 OS 起動後すぐにサーバを投入しない 性能評価はキャッシュが最適化された時に 分散は局所性を考慮して データ規模に合わせて搭載メモリを調整する メモリ増設で対応しきれないなら分散

分散を考慮した MySQLの運用

MySQL 運用のポイント OS のキャッシュを活かす インデックスを適切に設定する スケーリングを前提とした設計

OS のキャッシュを活かす 全データサイズに気を配る データ量 < 物理メモリ を維持 メモリが足りない場合は増設 etc.

インデックス重要 インデックス = 索引 B木 O(n) → O(log n)

インデックスの効果 例 : 4,000万件のタグデーブルからの検索 インデックスなし = 線形探索 → O(n) → 最大 4,000 万回の探索 インデックスあり = B木で二分探索 → O(log n) → log24000万 = 最大 25.25 回

インデックスの効果の例 mysql> select url from entry where eid = 9615899; +------------------------------------------------------------------------------+ | url | | http://builder.japan.zdnet.com/member/u87200/blog/2008/08/10/entry_27012867/ | 1 row in set (0.00 sec) mysql> select url from entry use index(hoge) where eid = 9615899; ... 200秒待っても結果が返って来ない

インデックスの作用 where、order by、group by の条件 プライマリキー、UNIQUE 制約 明示的に追加したインデックス 罠 複数のカラムに同時にインデックスを効かせたい場合は複合インデックス select * from entry where url like 'http://d.hatena.nejp/%' order by timestamp

インデックスが効くかどうかの確認 explain mysql> explain select url from entry where eid = 9615899; +-------+------+---------------+------+---------+-------+------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | | entry | ref | eid | eid | 4 | const | 1 | Using where | 1 row in set (0.04 sec) mysql> explain select url from entry use index(cname) where eid = 9615899; +-------+------+---------------+------+---------+------+---------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | | entry | ALL | NULL | NULL | NULL | NULL | 9620451 | Using where | 1 row in set (0.01 sec)

より詳しくは

MySQL の分散 マスタ・スレーブ 参照系はスレーブへ、更新はマスタへ ORマッパで制御する アプリケーション サーバー アプリケーション ロードバランサ DBスレーブ DBスレーブ DBスレーブ DBマスタ

マスタ・スレーブの特徴 参照系クエリはスケール マスタはスケールしない サーバーを増やすだけで良い ただし、台数を稼ぐことよりもメモリにフィットさせることが重要 マスタはスケールしない 更新系クエリが増えると厳しい ただし、Web アプリは多くの場合 90%以上が参照クエリ マスタ負荷はテーブル分割で凌ぐのが現状のセオリー

MySQL のスケールアウト戦略 データがメモリに載るサイズ? YES → メモリに載せる NO メモリ増設 メモリ増設が不可能ならパーティショニング

パーティショニング (テーブル分割) テーブルA とテーブルB を別のサーバーに置いて分散する方法

パーティショニング テーブル単位での分割 特定のアルゴリズムでの分割 例1. 頭文字 a-d が A、頭文字 e-h が B ... 例2. ハッシュ関数 A B A B

パーティショニングはなぜ効果的か 局所性

パーティショニングを前提にした設計 JOIN を使わない RDBMS 屋には叱られるがしょうがない

INNER JOIN している SQL entry has many bookmarks mysql> select url from entry INNER JOIN bookmark on entry.eid = bookmark.eid -> where bookmark.uid = 169848 limit 5; +-------------------------------------------------------------------+ | url | | http://blog.bulknews.net/mt/archives/001537.html | | http://www.wrightthisway.com/Articles/000154.html | | http://internet.watch.impress.co.jp/cda/news/2005/02/10/6438.html | | http://headlines.yahoo.co.jp/hl?a=20050210-00000136-kyodo-bus_all | | http://headlines.yahoo.co.jp/hl?a=20050210-00000015-maip-soci |

JOIN を排除 where ... in ... を利用 mysql> select eid from bookmark where uid = 169848 limit 5; +-----+ | eid | | 0 | | 4 | | 5 | | 6 | | 7 | 5 rows in set (0.01 sec) mysql> select url from entry where eid in (0, 4, 5, 6, 7); +-------------------------------------------------------------------+ | url | | http://blog.bulknews.net/mt/archives/001537.html | | http://www.wrightthisway.com/Articles/000154.html | | http://internet.watch.impress.co.jp/cda/news/2005/02/10/6438.html | | http://headlines.yahoo.co.jp/hl?a=20050210-00000136-kyodo-bus_all | 4 rows in set (0.12 sec)

DBIx::MoCo $entry->bookmarks(0, 5) JOIN は使わない where ... in ... を使ってプライマリキーで結合

運用が複雑になるとその分経済的コストがかかる。 パーティショニングのトレードオフ 良い点 負荷が下がる 局所性が増してキャッシュ効果が高くなる 悪い点 運用が複雑になる、故障確率が上がる 運用が複雑になるとその分経済的コストがかかる。 メモリは今時 2GB で 5,000円。 パーティショニングはあくまで切り札。

大規模データ アプリケーションの開発

Q. 敢えて大量データにアクセスしたい 全文検索 はてなのキーワードリンク 類似文書探索 データマイニング ...

A. RDBMS では限界 バッチ処理でデータを抽出 別途インデックスサーバを作りRPCでクエリする

用途特化型のインデクシング データを定期的に dump 構造化データを保持したサーバーをC++で開発、RPC でアクセス 検索用の転置インデックス キーワードリンク用の TRIE ... 構造化データを保持したサーバーをC++で開発、RPC でアクセス Thrift

はてなキーワードによるリンク ある文書が20万強のキーワードのうち何を含むか 昔 ... 巨大な正規表現 現在 ... TRIE で Common Prefix Search Aho-Corasick Double Array TRIE

はてなブックマークのテキスト分類器 Complement Naive Bayes 文書に含まれる単語の出現確率を保持するサーバー

全文検索エンジン 大量のデータから検索したい 「いい感じ」の文書を上位に 高速に検索したい

RDBMS の限界 特定のカラムで並び替えることしか出来ない 横断的な検索には向いてない

RDBMS → 情報検索 RDB のデータをバッチで取得 転置インデクスを作って検索アルゴズムを使う

テキスト走査と転置インデックス

テキスト走査 O(N) grep Pros Cons 実装が容易 正規表現 大量のドキュメントに向かない 「複数のドキュメントから、一番欲しいドキュメントを検索する」(ranked retrieval) に向かない

転置インデックス Pros 大規模データを高速に検索 Ranked retrieval Cons 設計/実装が大変

転置インデックス 索引語 (term) => docIDs (postings list)

転置インデックスのソート 辞書はアルファベット順 文書はID (整数) 順 辞書から単語を探しやすいように 圧縮や探索など様々なアルゴリズムで有利 差分を取ってδ符合で圧縮

転置インデックスに対する検索 辞書から検索 ヒットした単語の postings list を取得 ソート済み → 二分探索可 → O(log n) ヒットした単語の postings list を取得 docID が検索結果 スコアリング → Cosine Similarity

ベクトル空間モデル ベクトル空間モデル 情報検索技術の基盤 クエリやドキュメントをベクトル化して無限次元のベクトル空間に展開 ベクトル空間内で 「近い」 ベクトルを探す → 類似文書 情報検索技術の基盤 クエリに基づいたドキュメントのスコアリング ドキュメント分類 ドキュメントクラスタリング

ドキュメントのベクトル化 ドキュメントをベクトルとして表現 辞書の単語を成分とする無限次元ベクトル d1

ベクトル空間モデルのイメージ t3 d2 d3 d1 θ φ t1 d5 t2 d4

Cosine similarity 二つのベクトルの類似度 = 2ベクトルが作る cosΘ を求める式に等しい ∵ 相関係数 = cosΘ

Cosine similarity 2ベクトルの内積が最も大きいもの = 最も相関度が高い

例 3つの小説の 3 語の tf ベクトル長で正規化 SaS・PaP = 0.999 SaS・WH = 0.888 "Sense and Sensibility" "Pride and Prejudice" "Wuthering Heights" ベクトル長で正規化 SaS・PaP = 0.999 SaS・WH = 0.888 ∴ SaSに近いのはWHよりPaP

ベクトル空間モデルの内積計算コスト M次元の内積計算を N ドキュメント数 計算コストを下げる手法が必要 M ... 辞書の単語数。万単位

Cosine Similarity のアルゴリズム 現実的な計算時間で計算するには 行列がスパースであることを利用 転置インデックスを利用する top K が取得できれば良い 様々な手法で足切り

圧縮全文索引 転置インデックスの弱点 部分文字列検索 分かち書き方式は検索漏れ N-gram 方式は計算量が増加 Suffix Arrays ただし SA は空間コストが高い → Compressed Suffix Arrays (PFI's Sedue)

大規模なバッチ処理 一台で処理仕切れない 例: httpd のログ 複数サーバーで並列分散処理 → MapReduce Hadoop

理論と実践 理論と実践の両側から "やりたいこと"→ "計算機の問題" の道筋をどう発見するかが鍵 JOIN を使わない etc ... バッドノウハウ 教科書には載っていない ベクトル計算 etc ... 古典的な理論 多くの問題は古典的な理論に帰着する "やりたいこと"→ "計算機の問題" の道筋をどう発見するかが鍵 「キーワードでリンクしたい」 → TRIE で Common Prefix Search

まとめ GB単位のデータ処理 TB、PB はまた違った世界 メモリ重要 分散を意識した運用 アルゴリズムとデータ構造

参考文献 Daniel P. Bovet、Marco Cesati "詳解Linuxカーネル 第3版" オライリー・ジャパン 2007 Jeremy D. Zawodny, Derek J. Balling "実践ハイパフォーマンスMySQL" オライリー・ジャパン, 2004 Christopher D. Manning、Prabhakar Raghavan、 Hinrich Schutz "Introduction to Information Retrieval" Cambridge University Press, 2008 "たつをの ChangeLog" IIR カテゴリ http://chalow.net/clsearch.cgi?cat=IIR