wdd2012_sc-004
DESCRIPTION
Windows Developer Daysで使ったHadoop on Windows (Server|Azure)紹介資料です。「設計・実装・活用法」というタイトルとは裏腹にただの概要紹介になってしまったので、もう少しましなものを作りたいと思っています・・・TRANSCRIPT
SC-004
膨大なデータを 短時間で処理
多数のサーバーで 分散処理 高スケーラビリティ
Google の論文が 契機となって誕生!
Yahoo や Facebook で使われている
Hadoop (今日の主役)
ジョブスケジューラー
分散ファイルシステム
プログラミングモデル
管理機能
MapReduce
標準装備
HDFS
コマンドラインと シンプルな Web 画面
MPI / SOA / その他 任意のプログラムを
利用可能
標準装備
Windows のファイル共有や、サードパーティ製の
クラスターファイルシステム
グラフィカルな ヒートマップなど
管理・監視機能が充実 CLI / GUI / Web UI
プログラミングモデルが 規定されている
分散ファイルシステムを 自前で備えている
my %rpm; # 結果を格納するハッシュテーブル
while(<>) { next unless /^\d{4}/; my $time = substr($_,0,16); $rpm{$time}++; } my @sorted_keys = sort keys %rpm; foreach my $k (@sorted_keys) { print "$k $rpm{$k}\n"; }
2012-04-24 01:02:03 W3SVC1 192.168.0.1 GET /…
while(<>) { next unless /^\d{4}/; my $time = substr($_,0,16); $rpm{$time}++; }
2012-04-24 01:02:03 W3SVC1 192.168.0.1 GET/…
while(<>) { next unless /^\d{4}/; my $time = substr($_,0,16); $rpm{$time}++; }
my @sorted_keys = sort keys %rpm;
foreach my $k (@sorted_keys) { print "$k $rpm{$k}\n"; }
while(<>) { next unless /^\d{4}/; my $time = substr($_,0,16); $rpm{$time}++; }
2012-04-24 01:03:05 W3SVC1 192.168.0.1 GET/… 2012-04-24 01:04:06 W3SVC1 192.168.0.1 GET/…
入力データを分割して複数のプログラムに配る
foreach my $k (@sorted_keys) { print "$k $rpm{$k}\n"; }
それぞれのプログラムは与えられたデータを淡々と処理
他の仲間が何をやっているか 気にする必要はない
結果の断片をソートする
キーでソート済みであることが保証されているので、淡々と結果出力をすればよい
Map
Reduce
while(<>) { next unless /^\d{4}/; my $time = substr($_,0,16); $rpm{$time}++; }
while(<>) { next unless /^\d{4}/; my $time = substr($_,0,16); $rpm{$time}++; }
while(<>) { next unless /^\d{4}/; my $time = substr($_,0,16); $rpm{$time}++; }
Windows 環境向けの 新機能追加
Bash スクリプトの cmd 移植
Java プログラム内の UNIX 依存部分を調整
UNIX 環境に依存している部分を Windows 対応
JavaScript コンソール
Windows Azure ストレージへの対応
Hive ODBC ドライバ
bin/ hadoop- config.cmd hadoop.cmd hdfs.cmd mapred.cmd start-master.cmd start-slave.cmd stop-master.cmd stop-slave.cmd conf/ hadoop-env.cmd
Windows 用に移植されたスクリプト群 bash の呼び出し部分に
Windows 判定ロジックを追加
Pegasus ZooKeeper
主要な関連プロジェクト
HDFS に対して SQL 的な言語 (Hive QL) でクエリを発行できる。 MapReduce の複雑さを隠蔽し RDB ユーザーが直感的に
Hadoop を活用できるようになる。
こちらも HDFS に対する上位レイヤで、大規模なデータセットの探索を容易にする仕組み
“Pig Latin” というスクリプト言語で処理を記述すると、 Pig がそれを MapReduce ジョブに変換して実行してくれる。
Windows Server に Hadoop をインストールして クラスターを構築する方式
Windows Azure の 既存サブスクリプションに
Hadoop クラスターを デプロイする方式
Windows Server 版 (オンプレミス)
Windows Azure 版 その 1 - 「自前クラスター」
クラスターの詳細を意識せず MapReduce プログラムだけを
デプロイして利用する方式
Windows Azure 版 その 2 – “Elastic MapReduce”
通常の Windows Azure 管理ポータルとは別の専用サイト
“#コマンド” で、FS Shell の コマンドを呼び出せます。 “#lsr” は ”hadoop fs –lsr” に相当します。
“#fs.get” で HDFS 上のファイルを ローカルコンピューターへダウンロードできます
クエリの結果と、実行された Map-Reduce ジョブに関する情報が、ここに表示されます。
ここにHQLを入力します。
Hive に対する操作を Web ブラウザから行えます
options.orientation = 45; graph.bar(wordCounts, options);
graph.pie(wordCounts, options);
ネイティブ DLL (UNIX系の libhdfs に相当)
マネージド DLL (.NET 系の各種言語で利用可能)
Action<string> processDirectory = null; processDirectory = (looppath) => { using (HdfsFileInfoEntries entries = hdfsSystem.ListDirectory(looppath)) { foreach (HdfsFileInfoEntry entry in entries.Entries) { string kind = entry.Kind == HdfsFileInfoEntryKind.Directory ? “Directory” : “\tFile”; Console.WriteLine(string.Format(@”{0}:”"{1}”", Modified/Accessed:”"{2:G}, {3:G}”", Owner:”"{4}”"” , kind, entry.Name, entry.LastModified, entry.LastAccessed, entry.Owner)); if (entry.Kind == HdfsFileInfoEntryKind.Directory) { processDirectory(entry.Name); } } } };
C# でディレクトリの一覧を取得するコード例
Windows 環境のアプリケーションに対して Hadoop の分散ファイルシステムへのアクセスを提供
セカンダリネームノードで作成されるチェックポイントファイルを Windows Azure Storage へ転送して障害に備える機能です
プライマリ ネームノード
fsimage
セカンダリ ネームノード
edits
fsimage
fsimage.ckpt
Windows Azure BLOB
edits
マージ fsimage.ckpt fsimage.ckpt
転送 転送
Excel 用 Hive プラグイン
ポート設定
インストール
単に移植しただけではなく、JavaScript での MapReduce ジョブ作成や、 Windows Azure Storage との連携など様々な工夫がされています。