Yahoo! JAPANでのHadoop利用について

11,715 views

Published on

Published in: Technology
  • Be the first to comment

Yahoo! JAPANでのHadoop利用について

  1. 1. Yahoo! JAPAN での Hadoop 利用について ヤフー株式会社 R&D 統括本部 吉田一星、古宮陽明 2010 年 8 月 4 日
  2. 2. 自己紹介 <ul><li>吉田一星 (よしだ いっせい) </li></ul><ul><li>R&D 統括本部プラットフォーム開発本部検索開発部開発3 </li></ul><ul><li>R&D 統括本部フロントエンド開発本部アプリケーション開発部開発4(兼) </li></ul><ul><li>R&D 統括本部プラットフォーム開発本部要素技術開発部開発3(兼) </li></ul><ul><li>2008 年にヤフー株式会社に入社 </li></ul><ul><li>検索サービス構築プラットフォーム( ABYSS )で Hadoop 部分を担当するエンジニア </li></ul><ul><li>画像処理、地図検索、地域プラットフォームでも Hadoop に関わる開発を経験 </li></ul><ul><li>TechBlog で Hadoop に関する記事を執筆 </li></ul>
  3. 3. 自己紹介 <ul><li>古宮 陽明 ( こみや ようめい ) </li></ul><ul><li>R&D 統括本部 プラットフォーム開発本部セントラル開発 2 部 開発 3 </li></ul><ul><li>2004 年 ヤフー株式会社入社 </li></ul><ul><ul><li>主に、ビジネス向けサービスのバックエンドシステムの開発を担当。 </li></ul></ul><ul><li>2010 年現在、全社規模の Hadoop プラットフォームの構築を担当。 </li></ul>
  4. 4. 流れ <ul><li>Yahoo! JAPAN の事例 </li></ul><ul><li>Hadoop 開発の流れ </li></ul><ul><li>Hadoop with Security </li></ul><ul><li>Oozie </li></ul><ul><li>Hadoop と Oozie の統合利用 </li></ul><ul><li>Yahoo! JAPAN Hadoop クラスタ </li></ul>
  5. 5. Yahoo! JAPAN での事例
  6. 6. 検索ログプラットフォーム <ul><li>社内の検索サービスのログ解析全般 </li></ul><ul><ul><li>Hive を独自に拡張して使用している </li></ul></ul><ul><li>様々な Yahoo! JAPAN のサービスにデータを提供 </li></ul>
  7. 7. Yahoo! 検索 <ul><li>関連検索ワード </li></ul><ul><li>キーワード入力補助 </li></ul><ul><li>ショートカットの表示制御 </li></ul><ul><li>検索ログプラットフォームのデータが元になっている </li></ul>
  8. 8. Yahoo! 検索ランキング <ul><li>検索ランキング、急上昇ワードランキングなど </li></ul><ul><li>都道府県別、性年代別のランキング( Yahoo! ラボ) </li></ul><ul><li>検索ログプラットフォームが提供したデータをさらに加工している </li></ul>
  9. 9. レコメンデーションプラットフォーム <ul><li>レコメンデーションサービスの計算処理に利用 </li></ul><ul><ul><li>ビヘイビアデータのクラスタリング計算 </li></ul></ul><ul><ul><li>クラスタとコンテンツデータのマッチング計算 </li></ul></ul><ul><li>Yahoo!BB ポータルサイトなど </li></ul><ul><li>オークション、ショッピングなど、順次他のサービスにも導入予定 </li></ul>
  10. 10. モバイル検索 <ul><li>検索データを溜め込むストレージ </li></ul><ul><li>検索ランキング計算 </li></ul><ul><li>アンカーテキスト抽出 </li></ul><ul><li>ログ解析、クリックログの検索ランキング反映 </li></ul>
  11. 11. 地図検索 <ul><li>地図検索インデックス生成 </li></ul><ul><li>クリックログ集計・検索ランキング反映 </li></ul><ul><li>店舗やビルの一意性処理 </li></ul><ul><li>ログ解析 </li></ul>
  12. 12. 開いているお店検索 <ul><li>クロールデータから定休日や営業時間を抽出 </li></ul><ul><ul><li>クロール / 営業時間、定休日抽出 / 検索インデックス作成 </li></ul></ul><ul><li>Yahoo! ラボや iPhone 版 Safari の地図検索で公開 </li></ul>
  13. 13. その他の事例 <ul><li>広告プラットフォーム </li></ul><ul><li>Yahoo! JAPAN 研究所 </li></ul><ul><li>検索サービス構築プラットフォーム( ABYSS ) </li></ul><ul><li>地域 API プラットフォーム (YOLP) </li></ul><ul><li>etc… </li></ul>
  14. 14. Hadoop 開発の流れ
  15. 15. Hadoop 開発の流れ <ul><li>Yahoo! JAPAN で、どのように Hadoop 開発を行っているか? </li></ul><ul><li>サービスによって開発の方法は若干違うが、 ABYSS の例を紹介 </li></ul>
  16. 16. ABYSS とは? <ul><li>社内の検索サービスをホスティングするプラットフォーム </li></ul><ul><li>主に検索データのストレージとして Hadoop を利用 </li></ul><ul><li>検索データの解析処理などに MapReduce を使用 </li></ul>
  17. 17. Hadoop Client <ul><li>Hadoop を Client と Server に分けて、運用を行っている </li></ul><ul><li>他のサーバにある Hadoop クラスタのファイルの読み書きや、 Job の実行を簡単に行える </li></ul>$ hadoop fs –put localfile hdfs://nn.example.com:9000/hadoop/hadoopfile $ hadoop fs –get hdfs://nn.example.com/user/hadoop/file localfile
  18. 18. Hadoop Client <ul><li>core-site.xml や mapred-site.xml に外部の Hadoop Server を指定し、 Hadoop Client としてパッケージ化 </li></ul><property> <name>fs.default.name</name> <value> hdfs://nn.example.com:9000 </value> </property> - core-site.xml <property> <name>mapred.job.tracker</name> <value> nn.example.com:9000 </value> </property> - mapred-site.xml
  19. 19. Hadoop Server <ul><li>開発用クラスタと、検証用クラスタ、本番用クラスタがある </li></ul><ul><li>本番用クラスタは、 DRBD で Namenode を冗長化 </li></ul><ul><li>別サーバから Hadoop Client で Job の実行や、ファイルの転送を行っている </li></ul>Hadoop Client Hadoop Client Hadoop Client 開発用クラスタ 検証用クラスタ 本番用クラスタ
  20. 20. ファイルの転送 <ul><li>基本的には、 Hadoop Client で転送 </li></ul><ul><li>HTTP 経由で転送する場合もあり </li></ul><ul><li>Datanode の HTTP Server から転送 </li></ul><ul><li>デフォルトでは GET しかできないが、パッチをあてて PUT/POST/DELETE もできるようにしている </li></ul><ul><li>Thrift や FUSE 経由で転送しているサービスもある </li></ul>
  21. 21. Hadoop の開発 <ul><li>Eclipse で開発 </li></ul><ul><li>Mockito+JUnit や MRUnit で単体テスト </li></ul><ul><li>ただし、 DistributedCache などがテストできない </li></ul>
  22. 22. Eclipse Plugin <ul><li>Eclipse Plugin を使えば、 Hadoop Client が入った状態になる </li></ul><ul><li>直接、開発用クラスタに Job を投げて実行 </li></ul><ul><li>VMWare 上に Hadoop クラスタを立ち上げる場合もあり </li></ul><ul><li>Yahoo! Inc. や米 Cloudera で、セットアップがほとんど必要ない VMWare のイメージファイルが公開されている </li></ul>
  23. 23. セキュリティ <ul><li>Hadoop Server のアカウントを持っていなくても、 Hadoop Client で、どこからでも Job を実行したり、ファイルの読み書きができる </li></ul><ul><li>権限管理の仕組みはあるが、セキュリティの観点ではほとんど意味をなさない </li></ul><ul><li>解決法 </li></ul><ul><ul><li>ネットワークを遮断して、ポートをアクセス制限 </li></ul></ul><ul><ul><li>誓約書 </li></ul></ul><ul><ul><li>Hadoop with Security を後ほど紹介 </li></ul></ul>
  24. 24. Hadoop の user/group <ul><li>なんとなく、シェルのログイン user/group が適用されているが・・・ </li></ul><ul><li>Hadoop Client 側で、” whoami ” 、” bash –c groups ” コマンドを実行して取得しているだけ </li></ul><ul><li>ちなみに Windows では取得できない </li></ul>  public final static String USER_NAME_COMMAND = &quot; whoami &quot;;   public static String[] getGROUPS_COMMAND() { return new String[]{&quot; bash &quot;, &quot; -c &quot;, &quot; groups &quot;}; } static String getUnixUserName() throws IOException { String[] result = executeShellCommand( new String[]{Shell.USER_NAME_COMMAND}); return result[0]; } UnixUserGroupInformation.java Shell.java
  25. 25. 任意の user/group を指定 <ul><li>Hadoop Client の core-site.xml で、 hadoop.job.ugi を指定する </li></ul><ul><li>MapReduce の Job ごとに動的に指定することも可能 </li></ul><property> <name> hadoop.job.ugi </name> <value> user,group </value> </property> JobConf conf = new JobConf(Test.class); conf.set(UnixUserGroupInformation.UGI_PROPERTY_NAME,” user,group ”); - core-site.xml - MapReduce
  26. 26. Hadoop with security <ul><li>いままでの Hadoop のセキュリティには問題がある </li></ul><ul><li>Yahoo! Distribution Of Hadoop With Security </li></ul><ul><li>ABYSS でも導入を計画中 </li></ul>
  27. 27. Hadoop with Security と Oozie
  28. 28. Introduction
  29. 29. Introduction <ul><li>ネットワーク および ホスト レベルのセキュリティは常に必要。 </li></ul><ul><li>現在の Apache Hadoop ( 0.20.2 まで)のセキュリティ( アプリケーション レベル) </li></ul><ul><ul><li>ユーザ、ノード(ホスト)についての認証機構が存在しない。 </li></ul></ul><ul><ul><li>HDFS のパーミッション機構は存在するが、認証を前提としないので限定的。ユーザのなりすましが可能。 </li></ul></ul><ul><ul><li>サービスレベルのアクセス制御は限定的( dfs.hosts 、 mapred.hosts )。設定によっては、ノードのなりすましが可能。 </li></ul></ul><ul><ul><li>MapReduce ジョブ発行についての権限制御が存在しない。 </li></ul></ul><ul><ul><li>通信経路、ストレージされたデータは暗号化されていない。 </li></ul></ul>
  30. 30. Hadoop with Security と Oozie とは
  31. 31. Hadoop with Security <ul><li>認証 、 認可 および 監査 ログといったセキュリティ機能が追加された Hadoop の Yahoo! ディストリビューション。 </li></ul><ul><li>これらのセキュリティ機能はオプション。 </li></ul><ul><li>2010 年 8 月現在、最新版( ベータ )は、 0.20.104.2 。 </li></ul><ul><li>Apache Hadoop の対応版はまだ存在しない。 </li></ul><ul><li>Yahoo! Inc. では、 2010 年 8 月にプロダクション導入予定。 </li></ul><ul><li>本セッションでは、 Yahoo! Developer Network 配布の Yahoo! Distribution of Hadoop 0.20.S Virtual Machine ( 0.20.104.0-SNAPSHOT )を対象に解説。 ※安定版が未リリースのため、今後、仕様が変更される可能性あり。 </li></ul>
  32. 32. Oozie Yahoo!'s workflow engine for Hadoop <ul><li>ビルマの 象使いの専門職 を oozie という。 </li></ul><ul><li>Yahoo! Inc. で開発された Hadoop の MapReduce ジョブを含めた複雑なアクションフローを実行管理するための ワークフローエンジン (Java Servlet + RDB) 。 </li></ul>
  33. 33. Oozie Yahoo!'s workflow engine for Hadoop <ul><li>Yahoo! Distribution of Hadoop with Security との統合利用が可能。 </li></ul><ul><li>オープンソースとして公開されており、今後は Apache Software Foundation に移管予定 。 2010 年 8 月現在、最新版は 2.0.2.1 で、バイナリ配布はされていない。 </li></ul><ul><li>Yahoo! Inc. では、 Ver. 1 がすでにプロダクションに導入済みで、 Ver. 2 が導入されつつある。 </li></ul><ul><li>本セッションでは、最新版の 2.0.2.1 を Yahoo! Distribution of Hadoop 0.20.S Virtual Machine (0.20.104.0) 向けにビルドしたものを対象に解説。 </li></ul>
  34. 34. 0: 現在の Hadoop
  35. 35. 強化 1: プロセスユーザの変更
  36. 36. 強化 2: 相互認証( Kerberos )の追加
  37. 37. 強化 3: Token 認証の追加
  38. 38. 強化 4: Hadoop と Oozie の統合
  39. 39. 詳細 1: アプリケーションのアップロード
  40. 40. 詳細 2: ジョブの発行
  41. 41. 詳細 3: ジョブの実行
  42. 42. Hadoop と Oozie の統合効果 <ul><li>クラスタ全体のセキュリティ統御 </li></ul><ul><ul><li>認証( Authentication ) : ユーザまたはノード(ホスト)が何ものであるか。 </li></ul></ul><ul><ul><li>認可( Authorization ) : ユーザまたはノードが何をすることができるか。 </li></ul></ul><ul><ul><li>監査( Auditing ) : ユーザまたはノードが何をしたか。 </li></ul></ul><ul><ul><li>※ ただし、データ通信経路の暗号化、ストレージされたデータの暗号化は未実装。 </li></ul></ul><ul><li>データコロケーションの実現 : 同一クラスタ内における重要度の異なるデータの混在。 </li></ul><ul><li>Oozie による ETL ( Extract/Transform/Load )の可視化と加速化。 </li></ul><ul><li>クラスタ全体の最適化。 </li></ul>
  43. 43. Yahoo! JAPAN Hadoop クラスタ <ul><li>Hadoop with Security と Oozie の活用も視野に入れ、全社規模クラスタの構築を計画中。 </li></ul><ul><li>現在のサービス専用クラスタの規模を超える共用クラスタで、複数の構築を検討中。 </li></ul><ul><li>2011 年 4 月、運用開始目標。 </li></ul>
  44. 44. Hadoop with Security の特長 Appendix A:
  45. 45. セキュリティの強化 <ul><li>認証( Authentication )フレームワーク </li></ul><ul><li>認可( Authorization )機能 </li></ul><ul><li>監査( Auditing )機能 </li></ul>
  46. 46. 認証( Authentication ) <ul><li>Kerberos 認証と連携可能( RPC SASL/Kerberos ) </li></ul><ul><ul><li>※ SASL 機構による実装なので、今後 Hadoop が Kerberos (via GSS API) 以外の認証方式に対応することは比較的容易。 </li></ul></ul><ul><ul><li>core-site.xml : Kerberos プリンシパル名をローカルの OS ユーザにマッピングするルール。 </li></ul></ul><ul><ul><li>hdfs-site.xml : HDFS 各プロセスの Kerberos プリンシパル設定。 </li></ul></ul><ul><ul><li>mapred-site.xml : MapReduce フレームワーク各プロセスの Kerberos プリンシパル設定。 </li></ul></ul><ul><li>ジョブ関連プロセスの相互認証は、 RPC SASL/DIGEST-MD5 </li></ul>
  47. 47. 認可( Authorization ) <ul><li>アプリケーションレベルの認可 </li></ul><ul><ul><li>hadoop-policy.xml : 各通信プロトコル(サービスレベル)アクセスコントロール。 </li></ul></ul><ul><ul><li>mapred-queue-acls.xml : デフォルトスケジューラへのジョブ発行権限コントロール。 </li></ul></ul>
  48. 48. 監査( Auditing ) <ul><li>従来は、 log4j のログレベルを変更して監査ログ( HDFS へのアクセス要求)を出力する必要があった。 </li></ul><ul><ul><li>log4j.logger.org.apache.hadoop.fs.FSNamesystem.audit=INFO </li></ul></ul><ul><li>Hadoop with Security では、システム監査をサポートする情報として、以下のようなログが出力される。※監査ログなので、ログローテートしない設定を。 </li></ul><ul><ul><li>HDFS </li></ul></ul><ul><ul><ul><li>hdfs-audit.log </li></ul></ul></ul><ul><ul><ul><li>hdfs-auth.log </li></ul></ul></ul><ul><ul><li>MapReduce </li></ul></ul><ul><ul><ul><li>madred-audit.log </li></ul></ul></ul><ul><ul><ul><li>mapred-auth.log </li></ul></ul></ul>
  49. 49. Oozie ワークフローアプリケーションと セキュリティ Appendix B:
  50. 50. ワークフローとは <ul><li>Oozie が扱うワークフローとは、逆戻りや繰り返しのない一連( DAG 、 Direct Acyclic Graph 、有向非巡回グラフ)のアクション実行計画のこと。 </li></ul><ul><li>XML で記述。 </li></ul>
  51. 51. サポートされるアクションノード <ul><li>MapReduce ( Java ベース) </li></ul><ul><li>MapReduce ストリーミング </li></ul><ul><li>MapReduce Pipes </li></ul><ul><li>Pig </li></ul><ul><li>HDFS (ファイルシステム操作) </li></ul><ul><li>通常の Java プログラム </li></ul><ul><li>サブワークフロー </li></ul><ul><li>カスタム Action Executor を作成することにより追加可能( Hive など) </li></ul>
  52. 52. ワークフローアプリケーションの構成 <ul><li>ワークフローアプリケーション(ディレクトリ)は以下のファイルで構成され、あらかじめ HDFS 上にアップロードしなければならない。 </li></ul><ul><ul><li>workflow.xml </li></ul></ul><ul><ul><li>lib/ : 依存 JAR や共有オブジェクト( *.so )を格納 </li></ul></ul><ul><ul><li>設定ファイル( config-default.xml など) </li></ul></ul><ul><ul><li>各スクリプト( Pig 、シェルスクリプトなど) </li></ul></ul><ul><li>ローカルのジョブ設定ファイル(たとえば、 map-reduce-job.properties )には、このアプリケーションパスを指定する。 </li></ul><ul><ul><li>oozie.wf.application.path=hdfs://localhost:8020/tmp/hadoop/workflows/map-reduce </li></ul></ul>
  53. 53. ジョブ管理機能 <ul><li>クライアントのコマンドラインから可能。 Oozie サーバは、 OOZIE_URL 環境変数あるいはコマンドラインの – oozie オプションで指定。 </li></ul>ジョブの実行 $ oozie job -config map-reduce-job.properties -run job: <job id> ジョブの情報表示 $ oozie job -info <job id> ジョブの強制終了 $ oozie job -kill <job id>
  54. 54. Oozie Web コンソール
  55. 55. Oozie とセキュリティ <ul><li>Oozie が提供するセキュリティ機能 </li></ul><ul><ul><li>認証( Authentication )プラグイン </li></ul></ul><ul><ul><li>認可( Authorization )機能 </li></ul></ul><ul><ul><li>監査( Auditing )機能 </li></ul></ul>
  56. 56. 認証( Authentication ) <ul><li>認証機能は、 Java Servlet Filter によりプラグイン可能 </li></ul><ul><ul><li>認証済ユーザについては、リクエストオブジェクトの oozie.user.name 属性にユーザ名を設定。 </li></ul></ul>
  57. 57. 認可( Authorization ) <ul><li>Oozie Authorization Model ( Oozie AuthorizationService が提供) </li></ul><ul><ul><li>ユーザは、すべてのジョブを参照可能。 </li></ul></ul><ul><ul><li>ユーザは、自分のジョブを変更可能。 </li></ul></ul><ul><ul><li>ユーザは、属するグループのジョブを変更可能。 </li></ul></ul><ul><ul><li>ユーザは、管理オペレーションを参照可能。 </li></ul></ul><ul><ul><li>管理ユーザは、すべてのジョブを変更可能。 </li></ul></ul><ul><ul><li>管理ユーザは、管理オペレーションを変更可能。 </li></ul></ul><ul><li>ユーザに対する グループ および Oozie 管理者 権限の付与については、カスタマイズ可能。 </li></ul><ul><li>ファイルベースの Oozie 管理ユーザ設定機能をビルトインする。 </li></ul>
  58. 58. 監査( Auditing ) <ul><li>Hadoop with Security 同様、監査ログが出力される。※監査ログなので、ログローテートしない設定を。 </li></ul><ul><ul><li>oozie-audit.log </li></ul></ul>
  59. 59. ジョブ実行とセキュリティ <ul><li>ユーザは、 Oozie サーバによって認証される。 </li></ul><ul><li>Oozie はユーザの Proxy User (代理人)として振る舞う。 </li></ul><ul><li>Oozie サーバは、自身の Kerberos チケットにより Hadoop クラスタ( HDFS 、 MapReduce )に認証され、( Hadoop の superuser 権限で)ユーザの代わりにジョブを発行する。 </li></ul>
  60. 60. セキュリティ設定 1: ジョブ定義 <ul><li>以降の設定は、 Yahoo! Distribution of Hadoop 0.20.S Virtual Machine (0.20.104.0) との連携を想定。 </li></ul><ul><li>ユーザは、ジョブ定義ファイルに以下のプロパティを追加(クラスタを認証) </li></ul><ul><ul><li>mapreduce.jobtracker.kerberos.principal : JobTracker の Kerberos プリンシパル ( 例 : mapred/localhost@LOCALDOMAIN ) </li></ul></ul><ul><ul><li>dfs.namenode.kerberos.principal : NameNode の Kerberos プリンシパル ( 例 : hdfs/localhost@LOCALDOMAIN ) </li></ul></ul>
  61. 61. セキュリティ設定 2: Oozie サーバ <ul><li>Oozie 管理者は、設定ファイル( oozie-site.xml )に以下の内容を設定。 </li></ul><property> <name> oozie.service.HadoopAccessorService.kerberos.enabled </name> <value> true </value> <description> Kerberos 認証の有効化 </description> </property> <property> <name> oozie.service.HadoopAccessorService.keytab.file </name> <value> ${user.home}/oozie.keytab </value> <description> Oozie サーバユーザの keytab ファイルの場所 </description> </property> <property> <name> oozie.service.HadoopAccessorService.kerberos.principal </name> <value> ${user.name}/localhost@LOCALDOMAIN </value> <description> Oozie サービスの Kerberos プリンシパル </description> </property>
  62. 62. セキュリティ設定 3: Hadoop クラスタ <ul><li>Hadoop クラスタ管理者は、設定ファイル( core-site.xml )に以下の内容を設定。 Oozie サーバの Proxy User としての振る舞いを制限する。 </li></ul><property> <name> hadoop.proxyuser. oozie .hosts </name> <value> 127.0.0.1 </value> <description> oozie 部分は、 Oozie サーバのプリンシパルのショートネーム アクセスを許可する Oozie サーバホストのリスト </description> </property> <property> <name> hadoop.proxyuser. oozie .groups </name> <value> oozies </value> <description> Oozie サーバの代理を許可するユーザが属するグループのリスト </description> </property>
  63. 63. Oozie Ver. 2 の新機能 <ul><li>Workflow Engine から Coordinator Engine へ </li></ul><ul><ul><li>crontab ライクなジョブのスケジュール実行。 </li></ul></ul><ul><ul><li>入力データトリガのジョブ実行 : 入力データが利用可能になった時点で、ジョブが実行される。 </li></ul></ul>
  64. 64. 参考リソース <ul><li>『クラウド セキュリティ & プライバシー』( Tim Mather 、 Subra Kumaraswamy 、 Shahed Latif 著、下道 高志 監訳、笹井 崇司 訳、オライリー・ジャパン、 2010 ) </li></ul><ul><li>Yahoo! Distribution of Hadoop with security </li></ul><ul><ul><li>http://yahoo.github.com/hadoop-common/ </li></ul></ul><ul><li>Yahoo! Oozie </li></ul><ul><ul><li>http://yahoo.github.com/oozie/ </li></ul></ul><ul><li>Owen O'Malley: Hadoop Security </li></ul><ul><ul><li>http://www.slideshare.net/ydn/1-hadoop-securityindetailshadoopsummit2010 </li></ul></ul><ul><ul><li>https://issues.apache.org/jira/browse/HADOOP-4487 </li></ul></ul><ul><li>Alejandro Abdelnur: Yahoo! Workflow Engine for Hadoop </li></ul><ul><ul><li>http://www.slideshare.net/ydn/5-oozie-hadoopsummit2010 </li></ul></ul>
  65. 65. ご清聴ありがとうございました。

×