JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API DragonNaoto Gohko
JOSUG2014 OpenStack 4th birthday party in Japan
the way of OpenStack API Dragon.
we provide OpenStack API on "GMO Apps Cloud" known to be capable of providing efficient social Games.
2022/3/24に開催した「オンプレML基盤 on Kubernetes」の資料です。機械学習モデルの開発者が、よりモデルの開発にのみ集中できるようにすることを目指して開発している「LakeTahoe(レイクタホ)」について紹介します。
https://ml-kubernetes.connpass.com/event/239859/
6. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
問題1: classpathが長すぎる
6
Java One 2015のKeynoteで紹介された
classpathが長すぎる、多数のユーザがいるこ
とに起因する問題
1. ライブラリが1個紛失してもわからない
2. Conflictが発生したときの修正が困難
3. 内部APIが安全に変更できるかわからない
("Public is TOO public")
7. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Jigsaw導入に期待
7
Hadoopコミュニティでshaded jarを用意
• 2. の問題を部分的に解決
ただしメンテナンスが困難
• どのライブラリをshadeすべきか
• shade漏れがないか
"Jigsaw" を活用することで根本解決したい
8. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
問題2: GCの長期化
8
HDFSのマスタ(NameNode)
• 名前空間とブロックの位置情報を全て
ヒープに保持
• 大規模クラスタではヒープが数100GBに
• STW(Stop-The-World)が長期化
• ヤフーのある環境では分単位の停止
• STWのたびにフェールオーバー
9. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
新しいGCアルゴリズムに期待
9
バージョンを上げると利用できるGCが増える
• ZGC (Java 11)
• Shenandoah GC (Java 12, RHEL同梱の
OpenJDK 8にもbackport)
いずれもSTWを最小限に抑えることを意図し
て開発されている
• ヤフーでも検証予定
10. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
バージョンを上げると
いいことずくめ
11. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
なのに、なぜ Hadoopは
Java 11対応
できていないのか?
12. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Hadoopの(メンテナにとって良くない)特徴
12
コードベースが巨大すぎる
全体的にレガシーなコード
• 10年以上の歴史
• 非互換にことごとくハマる
後方互換性の維持
• Java 11とJava 8の両方で動くようにする
• とんでもなく大変
19. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Hadoopとsun.misc.Cleaner
19
HadoopにおけるCleanerの利用目的
• munmap(2)の実装
• Linux前提なら、JNIから叩けばよい
(mlockを使う場合はそうしている)
• WindowsだとJNI経由で叩けないので
Cleanerを利用
20. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
パッケージが移動したときに互換性を保つには?
20
Java 8でも動作させる必要があるため、直接
importせずにreflectionを使う (HADOOP-
12760)
• sun.misc.Unsafe#invokeCleaner (移動
先のパッケージ) を呼び出す
• Exceptionが出たらJava 8なので、
sun.misc.Cleanerを呼び出す
• Apache Luceneの対応を参考にした
21. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
黒魔術
21
最後の手段であることに注意
22. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Doclet
22
Javadocの出力を整形してくれるツール
• HadoopではDocletの機能を利用してJavadocの生成
を特定のアノテーションが付与されたクラス/メソッド
のみに制限していた
• Java 10からパッケージが変わった・・・
com.sun.tools.doclets -> jdk.javadoc.doclet
• HadoopではJava10以降はDocletの機能を無効化
23. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Doclet
23
• 無効化したことで全てのクラス/メソッドで
Javadocが生成されるようになった
• 今まで隠れていたHTMLのフォーマット違反の
大量のJavadocが明るみに・・・
• みんなで頑張って修正(HADOOP-15785,
HDFS-13939)
24. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
HTMLフォーマット違反の修正
24
25. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
HTMLフォーマット違反の修正
25
26. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
JDK11のJavadoc
26
• Java11からJavadocのデフォルト設定が
HTML5に変わった(Java10まではHTML4が
デフォルト)
• そのままJavadocビルドするとまた大量のエ
ラーが発生
• JavadocのオプションでHTML4でビルドする
ように指定(HADOOP-15902)
27. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
EEモジュールがJDKから削除
27
Java EEモジュール
• JDK9でdeprecatedになった
• JDK11で削除された(JEP320)
• Hadoopで使用していたライブラリを明示的に追加した
• javax.activation-api(HADOOP-15775)
• javax.annotation-api(HADOOP-15895)
28. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
EEモジュールがJDKから削除
28
基本的にはMavenのdependencyに追加するだけ
29. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ライブラリの
バージョンアップ
30. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ライブラリのバージョンアップ
30
いくつかのライブラリではJDK11をサポートしてい
るバージョンにアップグレードする必要がある
• Log4J
• JUnit
• Mockito
• Jersey
などなど
31. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Log4J
31
Log4J1(1系)
• 2015年8月 EOL
• 当然Java11はサポート対象外(でも結構動く)
Log4J2(2系)
• Java8もJava11もサポート
• 1系と比べてパフォーマンスが大幅に改善
• 1系からマイグレーションする方法にいくつかの選択肢がある
• 1系の設定ファイルと非互換(ユーザーインパクト大)
32. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
SLF4Jを使ったマイグレーション
32
Log4J1 → Log4J1 with SLF4J
• 実装(Log4J)とインターフェース(SLF4J)を分離
• 1系と2系で非互換なAPIをSLF4Jで吸収
• Jarと設定ファイルを差し替えれば簡単に2系への切り
替えができる
• Hadoopでは最近ついに対応完了
追加削除で約1万6千行!
33. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
SLF4Jを使ったマイグレーション
33
Hadoop
logging code
SLF4J API
slf4j-api.jar
Bridge
slf4j-
log4j12.jar
Log4J1
log4j.jar
Bridge
log4j-slf4j-
impl.jar
Log4J2
log4j-api.jar
log4j-core.jar
Hadoop
logging code
Log4J1
log4j.jar
34. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
SLF4Jを使ったマイグレーション
34
Log4J2 with SLF4J
• SLF4Jを使っても設定ファイルは実装部分に依存する
(1系なら1系の、2系なら2系の設定ファイルが必要)
• HadoopのMavenビルド時のオプション(-Plog4j2)
でLog4J2の設定ファイルが生成される方針にする予定
(HADOOP-16206)
35. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
JUnit
35
JUnit4
• サポートはJava8まで
• 11はサポート対象外(でも結構動く)
JUnit5
• Java8もJava11もサポート
• JUnit4からのマイグレーション手順は整理されている
※それでもHadoopには大量のユニットテストがあるので大変
• junit-vintage-engineを使うとJunit4との共存が可能
徐々にJUnit5へのマイグレーションを進めることができる!
36. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
JUnit4からJUnit5への移行
36
移行前
• JUnit4のテストのみ存在
移行期(Hadoopはここ)
• vintageを使ってJUnit4とJUnit5が共存
• 新しいテストは全てJUnit5で書く(メーリスで合意を得る)
• 既存のJUnit4のテストは徐々にJUnit5に直す
移行完了時
• JUnit4へのdependencyを削除
• junit-vintage-engineのdependencyも削除
37. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Mockito
37
JUnitと組み合わせて使うモックライブラリ
• Java11対応で2系へのアップグレードが必要
• (非公式ながら)移行ガイドが整ってる
https://asolntsev.github.io/en/2016/10/11/
mockito-2.1
• アップグレード完了済み!(HADOOP-14178)
38. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Jersey
38
RESTfulなWebサービス開発のためのフレームワーク
Update jersey from 1.19 to 2.x (HADOOP-15984)
• 1系と2系でだいぶ互換性が崩れている
• 移行ガイドが結構微妙
• Jersey1系 x JDK11で失敗するテストがある
• やばい。
39. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
JDK11対応に向けて
39
残りの作業
• 依存ライブラリのアップグレードをがんばる
• JDK11で通らないテストがまだたくさんあるので1つ
ずつ潰していく(HADOOP-16264)
• 今年中には対応できるかも
Thanks to all the contributors!
40. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
最後に
40
Yahoo! JAPANでは多種多様なビッグデータを保
有・利活用するために、Hadoop, Spark, Kafka,
NiFi, PrestoなどJVM上で動作する多数のミドル
ウェアを取り扱っています。
一緒にJVMのチューニングや、Javaの最新機能を取
り込んでいくためにエンジニアを募集中です!
https://about.yahoo.co.jp/hr/
Editor's Notes
2. 多数のlibraryが相互依存している状態なので、バージョンのデッドロックみたいなことがよく起こる。Hadoopを利用している、言い換えると、Hadoopに依存しているライブラリは世の中に多数あるが、それらのライブラリの開発者も、このjar hellと呼ばれる状況に困っています。
3. Hadoopはmulti packageのプロダクトなので、別のpackageから呼び出される内部APIはpublicにしてあげないといけないが、"Public is too public"。Hadoopだと、developer向けのannotationをつけてこのpublicは変更されるかもしれない、という警告をしてあげているけど、publicだと使えてしまうので、ユーザがうっかり使ってしまうかもしれない。