KEMBAR78
20170303 java9 hadoop | PDF
© 2017 NTT DATA Corporation
2017年3月3日
NTTデータ OSSプロフェッショナルサービス
鯵坂 明
Apache HadoopとJava 9とJigsaw
© 2017 NTT DATA Corporation 2
鯵坂 明 (Akira Ajisaka)
 Apache Hadoopなど分散処理に関連するOSSを利用したPoC
や、商用導入における技術支援
 商用導入後のサポートサービス
 Apache Hadoop Committer/PMC member
 JIRAへのバグレポート
 修正、レビュー、マージ
 リリース作業の手伝い
 脆弱性の修正・開示
 などなど
自己紹介
https://github.com/apache/hadoop/graphs/contributors
© 2017 NTT DATA Corporation 3
 2017/7/27 リリース予定
 現在 b158 が入手可能
 Jigsawなど、多数の新機能
 非互換な変更も多い
 一方、Java 8はもうすぐEoL
 Oracleのサポート期限: 2017/9 (延長の可能性
あり、Extended Supportなら2025/3)
 RHELのサポート期限: 2020/10
 アップグレードの準備が必要
Java 9
© 2017 NTT DATA Corporation 4
Apache HadoopのJava 9への対応状況
mvn install -DskipTests を実行
そもそもコンパイルが通らない!
© 2017 NTT DATA Corporation 5
 原因は大きく分けて5つ
 sun.misc.Cleanerが移動した (JEP 260)
 _ 1文字の命名が禁止 (JEP 213)
 バージョンのつけ方が変わった (JEP 223)
 JavadocのHTML5対応 (JEP 224)
 Jigsawの影響
 HADOOP-11123で対応中 (Umbrella JIRA)
どうしてコンパイルが通らないのか
© 2017 NTT DATA Corporation 6
NoClassDefFoundError
© 2017 NTT DATA Corporation 7
 sun.misc.Cleanerの遍歴
 9b99: java.lang.ref.Cleaner
 9b105: jdk.internal.ref.Cleaner
 9b150: sun.misc.Unsafe::invokeCleaner
(イマココ)
 Hadoopでの使われ方
 munmap(2)の実装
 mlockと違い、WindowsだとJNIで叩けない
のでCleanerに頼る
JEP 260: Encapsulate most internal APIs
© 2017 NTT DATA Corporation 8
 パッケージを変えると、Java9で動作する
 ただし、Java8で動作しなくなる
 両方で動かすため、リフレクションを活用
 sun.misc.Unsafe#invokeCleanerを呼ぶ
 例外が出たら、sun.misc.Cleanerを使う
 Apache Luceneのコードが参考になった
 https://issues.apache.org/jira/browse/LUCENE-6989
 HADOOP-12760にパッチ投稿中
Java 8対応をおろそかにしてはいけない
© 2017 NTT DATA Corporation 9
HamletSpec.java
Java 9では禁止に
© 2017 NTT DATA Corporation 10
 _ 1文字の命名が禁止された
 Hamletという独自フレームワークに _ が頻出
 Hamlからインスパイアされた
 YARN WebUIで利用
JEP 213: Milling Project Coin
<html>
<body>
<table id="applications">
<thead>
<tr>
<td>ApplicationId</td>
<td>ApplicationState</td>
</tr>
</thead>
<tbody>
© 2017 NTT DATA Corporation 11
 _ を __ にするだけでは駄目
 YARN applicationが影響を受ける
 例: Apache Slider (Incubating)
 以下の手順で修正
 _ を __ にした新しいHamletを作成
 古いHamletをdeprecatedにする
 既存のコードを __ に置き換える
 (1回以上のリリースを経て)古いHamletを消す
 HADOOP-11875 にパッチ投稿中
互換性を意識して修正すべし
© 2017 NTT DATA Corporation 12
mvn javadoc:javadoc を実行
バージョンが
認識されない
© 2017 NTT DATA Corporation 13
 1.8 -> 9
 正規表現でマッチングしている場合に注意
 Maven Javadoc Pluginに影響
 2.10.4以降へアップグレードすべし
JEP 223: New Version-String Scheme
© 2017 NTT DATA Corporation 14
Java 9ではエラー
package.html
© 2017 NTT DATA Corporation 15
 HTML5対応のため、既存のHTMLファイルに
対するvalidationが厳しくなった
 <table>タグにはsummary or captionが必須
 <pre>タグの中にある < は &lt; に書き直し
 などなど
 HADOOP-14057 にパッチ投稿中
JEP 224: HTML5 Javadoc
© 2017 NTT DATA Corporation 16
mvn install -DskipTests を実行
見慣れないエラー
© 2017 NTT DATA Corporation 17
 ところで、これは何でしょう?
Java One 2015 keynoteの引用
© 2017 NTT DATA Corporation 18
 答: Hadoopのclasspath
 classpathが長いと何がいけないのか
 依存するライブラリが多く、Hadoop上で動
作するアプリやミドルに悪影響 (jar hell)
 Jigsaw: moduleという概念を導入
 module単位で依存関係を記述
 import時にバージョンが指定可能
 jar hellの解消
 互換性に大きな影響
Jigsaw
© 2017 NTT DATA Corporation 19
エラーの解説
 private fieldにアクセスするパターン
 通常はアクセスできない
 Field.setAccessible(true)でアクセス可能に
 ただし、Java 9では設定されたmodule以外からはアク
セス不可
 コンパイルオプションをつけることで回避可能
 "--add-opens java.base/java.util=ALL-UNNAMED"
© 2017 NTT DATA Corporation 20
 現時点で、適用は難しい
 Java8とJava9の両方に対応するため
 jar hellは解消されないのか?
 別の方法を使う -> Classpath Isolation
Apache HadoopへのJigsawの適用
© 2017 NTT DATA Corporation 21
 hadoop-client module
 クライアント用のjar (以前から存在)
 Jetty, Jersey, ZooKeeperなど依存ライブ
ラリが付属
 (New!) hadoop-client-api module
 hadoop-clientからtransitive dependency
を除去
 org.apache.hadoop.* のみ
Classpath Isolation (HADOOP-11656)
© 2017 NTT DATA Corporation 22
 (New!) hadoop-client-runtime module
 hadoop-client-api に存在しない 3rd
party dependencyを追加
 ただし、org.apache.hadoop.shaded.
配下に再配置
 Maven Shade Pluginを利用
 他にもいろいろあるが省略
Classpath Isolation (HADOOP-11656)
© 2017 NTT DATA Corporation 23
 手元のリポジトリに導入
Classpath Isolationを試す (1/2)
3.0.0-alpha2から
利用可能
compileではなく
runtime client-apiだけでOK
© 2017 NTT DATA Corporation 24
 同一ライブラリ、異なるバージョンが同居
Classpath Isolationを試す (2/2)
© 2017 NTT DATA Corporation 25
 Apache Hadoopは Java 9 に未対応
 パッチ・レビュー大歓迎
 jar hell問題は徐々に解消されていく
 Classpath Isolationを試してみよう
 フィードバックをお待ちしております
まとめ
© 2017 NTT DATA Corporation本資料中に記載されている会社名、商品名、ロゴは、各社の商標または登録商標です。

20170303 java9 hadoop

  • 1.
    © 2017 NTTDATA Corporation 2017年3月3日 NTTデータ OSSプロフェッショナルサービス 鯵坂 明 Apache HadoopとJava 9とJigsaw
  • 2.
    © 2017 NTTDATA Corporation 2 鯵坂 明 (Akira Ajisaka)  Apache Hadoopなど分散処理に関連するOSSを利用したPoC や、商用導入における技術支援  商用導入後のサポートサービス  Apache Hadoop Committer/PMC member  JIRAへのバグレポート  修正、レビュー、マージ  リリース作業の手伝い  脆弱性の修正・開示  などなど 自己紹介 https://github.com/apache/hadoop/graphs/contributors
  • 3.
    © 2017 NTTDATA Corporation 3  2017/7/27 リリース予定  現在 b158 が入手可能  Jigsawなど、多数の新機能  非互換な変更も多い  一方、Java 8はもうすぐEoL  Oracleのサポート期限: 2017/9 (延長の可能性 あり、Extended Supportなら2025/3)  RHELのサポート期限: 2020/10  アップグレードの準備が必要 Java 9
  • 4.
    © 2017 NTTDATA Corporation 4 Apache HadoopのJava 9への対応状況 mvn install -DskipTests を実行 そもそもコンパイルが通らない!
  • 5.
    © 2017 NTTDATA Corporation 5  原因は大きく分けて5つ  sun.misc.Cleanerが移動した (JEP 260)  _ 1文字の命名が禁止 (JEP 213)  バージョンのつけ方が変わった (JEP 223)  JavadocのHTML5対応 (JEP 224)  Jigsawの影響  HADOOP-11123で対応中 (Umbrella JIRA) どうしてコンパイルが通らないのか
  • 6.
    © 2017 NTTDATA Corporation 6 NoClassDefFoundError
  • 7.
    © 2017 NTTDATA Corporation 7  sun.misc.Cleanerの遍歴  9b99: java.lang.ref.Cleaner  9b105: jdk.internal.ref.Cleaner  9b150: sun.misc.Unsafe::invokeCleaner (イマココ)  Hadoopでの使われ方  munmap(2)の実装  mlockと違い、WindowsだとJNIで叩けない のでCleanerに頼る JEP 260: Encapsulate most internal APIs
  • 8.
    © 2017 NTTDATA Corporation 8  パッケージを変えると、Java9で動作する  ただし、Java8で動作しなくなる  両方で動かすため、リフレクションを活用  sun.misc.Unsafe#invokeCleanerを呼ぶ  例外が出たら、sun.misc.Cleanerを使う  Apache Luceneのコードが参考になった  https://issues.apache.org/jira/browse/LUCENE-6989  HADOOP-12760にパッチ投稿中 Java 8対応をおろそかにしてはいけない
  • 9.
    © 2017 NTTDATA Corporation 9 HamletSpec.java Java 9では禁止に
  • 10.
    © 2017 NTTDATA Corporation 10  _ 1文字の命名が禁止された  Hamletという独自フレームワークに _ が頻出  Hamlからインスパイアされた  YARN WebUIで利用 JEP 213: Milling Project Coin <html> <body> <table id="applications"> <thead> <tr> <td>ApplicationId</td> <td>ApplicationState</td> </tr> </thead> <tbody>
  • 11.
    © 2017 NTTDATA Corporation 11  _ を __ にするだけでは駄目  YARN applicationが影響を受ける  例: Apache Slider (Incubating)  以下の手順で修正  _ を __ にした新しいHamletを作成  古いHamletをdeprecatedにする  既存のコードを __ に置き換える  (1回以上のリリースを経て)古いHamletを消す  HADOOP-11875 にパッチ投稿中 互換性を意識して修正すべし
  • 12.
    © 2017 NTTDATA Corporation 12 mvn javadoc:javadoc を実行 バージョンが 認識されない
  • 13.
    © 2017 NTTDATA Corporation 13  1.8 -> 9  正規表現でマッチングしている場合に注意  Maven Javadoc Pluginに影響  2.10.4以降へアップグレードすべし JEP 223: New Version-String Scheme
  • 14.
    © 2017 NTTDATA Corporation 14 Java 9ではエラー package.html
  • 15.
    © 2017 NTTDATA Corporation 15  HTML5対応のため、既存のHTMLファイルに 対するvalidationが厳しくなった  <table>タグにはsummary or captionが必須  <pre>タグの中にある < は &lt; に書き直し  などなど  HADOOP-14057 にパッチ投稿中 JEP 224: HTML5 Javadoc
  • 16.
    © 2017 NTTDATA Corporation 16 mvn install -DskipTests を実行 見慣れないエラー
  • 17.
    © 2017 NTTDATA Corporation 17  ところで、これは何でしょう? Java One 2015 keynoteの引用
  • 18.
    © 2017 NTTDATA Corporation 18  答: Hadoopのclasspath  classpathが長いと何がいけないのか  依存するライブラリが多く、Hadoop上で動 作するアプリやミドルに悪影響 (jar hell)  Jigsaw: moduleという概念を導入  module単位で依存関係を記述  import時にバージョンが指定可能  jar hellの解消  互換性に大きな影響 Jigsaw
  • 19.
    © 2017 NTTDATA Corporation 19 エラーの解説  private fieldにアクセスするパターン  通常はアクセスできない  Field.setAccessible(true)でアクセス可能に  ただし、Java 9では設定されたmodule以外からはアク セス不可  コンパイルオプションをつけることで回避可能  "--add-opens java.base/java.util=ALL-UNNAMED"
  • 20.
    © 2017 NTTDATA Corporation 20  現時点で、適用は難しい  Java8とJava9の両方に対応するため  jar hellは解消されないのか?  別の方法を使う -> Classpath Isolation Apache HadoopへのJigsawの適用
  • 21.
    © 2017 NTTDATA Corporation 21  hadoop-client module  クライアント用のjar (以前から存在)  Jetty, Jersey, ZooKeeperなど依存ライブ ラリが付属  (New!) hadoop-client-api module  hadoop-clientからtransitive dependency を除去  org.apache.hadoop.* のみ Classpath Isolation (HADOOP-11656)
  • 22.
    © 2017 NTTDATA Corporation 22  (New!) hadoop-client-runtime module  hadoop-client-api に存在しない 3rd party dependencyを追加  ただし、org.apache.hadoop.shaded. 配下に再配置  Maven Shade Pluginを利用  他にもいろいろあるが省略 Classpath Isolation (HADOOP-11656)
  • 23.
    © 2017 NTTDATA Corporation 23  手元のリポジトリに導入 Classpath Isolationを試す (1/2) 3.0.0-alpha2から 利用可能 compileではなく runtime client-apiだけでOK
  • 24.
    © 2017 NTTDATA Corporation 24  同一ライブラリ、異なるバージョンが同居 Classpath Isolationを試す (2/2)
  • 25.
    © 2017 NTTDATA Corporation 25  Apache Hadoopは Java 9 に未対応  パッチ・レビュー大歓迎  jar hell問題は徐々に解消されていく  Classpath Isolationを試してみよう  フィードバックをお待ちしております まとめ
  • 26.
    © 2017 NTTDATA Corporation本資料中に記載されている会社名、商品名、ロゴは、各社の商標または登録商標です。