1月18日、「ビッグデータ管理入門」の前半を、NIIで聞いてきた
その内容をメモメモ
まずは、講義内容をメモメモ。
<HR>
内容:データ管理手法
NoSQL
RDB(Postgre Hstore)
ドキュメント指向(MongoDB)
列指向(Cassandra)
第一回~第4回
・ビッグデータの概念とデータ管理手法
・RDB
・ドキュメント指向
・列指向
第5回~第8回
・ゲノム解析(病気判定、リスク、weka)
ビッグデータの概念と管理手法
ビッグデータとは
データ管理の要件
ビッグデータとは
定義1:大容量データ:電気代だけでも大変!
定義2:3つのV
→何かわからないデータから、何かを導く出す
ビッグデータの課題
収集、
●取捨選択、
●保管、
●検索、
共有、
転送
解析
可視化
→●が今回の範囲
データ管理に対する用件
試行錯誤のサポートが必要
スペシャリストのモデル化+スペシャリストが見落としているところ
CAP定理
・分散システムに関する定理
・以下の3つは同時には成り立たない
Consistency 一貫性
Availability 可用性
Patition-Tolerance 分断体制
APが満たされる→一貫性X
CPが満たされる→アベイラビリティX
CAが満たされる→分断されるとX
リレーショナルデータベース
メリット:モデルが直感的
デメリット:柔軟性、スケーラビリティ
RDBは、一貫性を重視
ビッグデータは製品依存(Oracleはできるとか)
スパース:無駄なカラムを作ってしまう
NoSQLによるデータ管理
Not Only SQL
特徴 柔軟なスキーマ
スケーラビリティを確保しやすい
データの結合がないものが多い
種類
・ドキュメント MongoDB,CouchDB
・KVS(key Value Store) Dynamo
・列指向 Cassandra HBase
・グラフ指向 Neo 4J
ドキュメント指向
ドキュメントという単位でデータを管理
→各ドキュメントが独立
パフォーマンスはやや劣る
KVS
単純なので早い memcached KyotoCabinet
列指向
Google Big Tableに基づいた管理手法
Cassandra HBase
カラムファミリー、ロー、カラム(キーと値)
ディスクの使用効率がよい。検索不得手
グラフ指向
MongoDBのほうが設計しやすい
Cassandraはキーの名前、列の設計が難しい
Cassandra CQL
MongoDB Javascript
取捨選択、保管、検索は3つをすべてNoSQLでやる必要はない
<<2時間目>> RDBにおおけるビッグデータの扱い方
・データ管理に対する用件
ビッグデータ解析
スケーラビリティ
試行錯誤のサポートが重要
RDBにおけるスケールアップ レプリケーション
→単一障害店をもつ、
Writeの負荷→ノードのスケールアップ(サーバー増強):コストの問題
Google F1 分散データベースの仕組み
OoODE クエリの並列発行
柔軟なデータ構造
スキーマに基づくテーブルにデータ格納
可変なデータの扱い方
リレーションモデルの工夫
EAV Entity-Attribute Value
利点 RDBの一般的な機能
欠点 汎用的なクエリを書きにくい
階層構造を扱いにくい
→隣接リストモデル、入れ子集合モデル
PostgreSQL hStore,Json
Oracle/MySQL パフォーマンスのため
hstore key-valueのペア集合を格納
Json JSON形式のデータを格納
拡張機能の有効化 CREATE EXTENTION hstore必要
■hstore
テーブルの作成
CREATE TABLE logs(
id SERIAL PRIMARY KEY,
datetime TIMESTAMP,
attribute hstore
);
データの挿入
INSERT INTO logs
(datetime,attributes)
VALUES
(NOW(),
'target => "index.html",
referer => "http://google.com",
parameter=> "x=1"');
データの検索
SELECT * FROM logs WHERE attributes?'target';
(資料にないが、課題にあったもの)
SELECT COUNT(*) as kensu from logs where attributes->'target' = 'index.html';
■JSON
テーブル作成
CREATE TABLE logs2 (
id SERIAL PRIMARY KEY,
datetime TIMESTAMP,
attributes json
);
データ挿入
INSERT INTO
logs2 (datetime,attributes)
VALUES
(NOW(),
'{"tagret":"index.html",
"referer":"http://google.com",
"paramater":{"x":1}}');
データの検索
SELECT * from logs2 WHERE attributes->>'target'='inex.html';
(資料にないが、課題にあったもの)
SELECT COUNT(*) as kensu from logs2 where attributes->>'target' = 'index.html' AND attributes->'parameter'->>'x'='1'";
■操作
・JDBCドライバで操作できる
・HStoreはHashMapとして扱える
→古いJDBCドライバはPgobjectになる
・JSONはPGobjectとして扱える
→JSONは外部ライブラリ(本講義ではJackson)を利用
■演習のやりたか
(1)eclipseを立ち上げる
(2)window→Open パースペクティブ
(3)other→gitを選択
(4)gitのパースペクティブで、git cloneを選ぶ
(5)出てきたダイアログでURIに指定のURLを入れる
(6)コマンドプロンプトで、落としてきたフォルダにいく(CD)
(7)mvn eclipse:eclipse
(8)インポートする
general→existing project into workspace
(7)で作ったところ指定
<<3時間目>> Mongo
ドキュメント指向データベース
ドキュメント単位でデータ格納
フォーマットが決まっている:XML,JSON,YAML・・・
MongoDB
・オープンソース
・C++
・ゲームなどで
JSON形式の格納
内部的にはBSON(バイナリーJSON)
スキーマレス
Mongo
高速度
インデックスを使ったデータの参照が可能
高可用性
自動的なフェイルオーバー
レプリケーション
自動的なスケーリング
自動シャーディング
→シャードキーをどう決めるかが重要
シャードキー決め方
レンジベース
ハッシュ関数で
→スプリッター、バランサー
データのモデリング
JOINできない
→ドキュメント埋め込み、ドキュメント参照
コマンドラインからの使用
mongo
show dbs;
use mydb;
show collections;
テーブルに相当するのが、コレクション
db.testData.find();
testDataコレクションの中身を表示
Javaからの制御例
Mongo mongo = new Mongo(host poro);
DB db monogo= mongo.getDB(dbname);
DBCollection collection = db.getCollection("accessLog");
BasicDBObject doc = new BasicDBObject("target", "index.html");
System.out.println(collection.count(doc));