SlideShare a Scribd company logo
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
2019年5月18日
鯵坂 明, 浅沼 孝信
Java11への
マイグレーションガイド
~Apache Hadoopの事例~
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
自己紹介
鯵坂 明 (@ajis_ka)
Apache Hadoop PMC
2018/9 中途入社
• Hadoop導入支援
• テクニカルサポート
• Hadoopバージョンアッ
プ + 新機能導入検証
• HadoopのJava11対応
2
浅沼 孝信 (@hayanige)
Apache Hadoopコミッタ
2012/4 新卒入社
• Hadoop運用・開発
• NiFi導入・運用
• Hadoopバージョンアッ
プ + 新機能導入検証
• HadoopのJava11対応
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
とは
3
OSSの分散処理基盤
• Hadoop Distributed FileSystem
(HDFS)
• 分散処理のスケジューリング、クラスタ
のリソース管理 (YARN: Yet Another
Resource Negotiator)
• ほとんどがJavaで実装されている
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
HadoopとJava 11
4
Hadoopは現時点でJava 11に未対応
• Java 11対応のJIRA: HADOOP-15338
• 対応が終わると、Hadoopにまつわる重
大な問題を解決できると期待している
• 今回は、重大な問題を2つ紹介
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
これ、見覚えありませんか?
5
accessors-smart-1.2.jar animal-sniffer-annotations-1.17.jar aopalliance-1.0.jar asm-5.0.4.jar asm-commons-6.0.jar asm-tree-6.0.jar audience-annotations-0.5.0.jar avro-1.7.7.jar bcpkix-jdk15on-
1.60.jar bcprov-jdk15on-1.60.jar commons-beanutils-1.9.3.jar commons-cli-1.2.jar commons-codec-1.11.jar commons-collections-3.2.2.jar commons-compress-1.18.jar commons-configuration2-
2.1.1.jar commons-csv-1.0.jar commons-daemon-1.0.13.jar commons-io-2.5.jar commons-lang-2.6.jar commons-lang3-3.7.jar commons-logging-1.1.3.jar commons-math3-3.1.1.jar commons-net-
3.6.jar commons-text-1.4.jar curator-client-2.13.0.jar curator-framework-2.13.0.jar curator-recipes-2.13.0.jar dnsjava-2.1.7.jar ehcache-3.3.1.jar error_prone_annotations-2.2.0.jar fst-2.50.jar
geronimo-jcache_1.0_spec-1.0-alpha-1.jar grpc-context-1.15.1.jar grpc-core-1.15.1.jar grpc-netty-1.15.1.jar grpc-protobuf-1.15.1.jar grpc-protobuf-lite-1.15.1.jar grpc-stub-1.15.1.jar gson-2.2.4.jar
guava-11.0.2.jar guava-20.0.jar guice-4.0.jar guice-servlet-4.0.jar hadoop-annotations-3.3.0-SNAPSHOT.jar hadoop-auth-3.3.0-SNAPSHOT.jar hadoop-client-api-3.3.0-SNAPSHOT.jar hadoop-client-
minicluster-3.3.0-SNAPSHOT.jar hadoop-client-runtime-3.3.0-SNAPSHOT.jar hadoop-common-3.3.0-SNAPSHOT.jar hadoop-common-3.3.0-SNAPSHOT-sources.jar hadoop-common-3.3.0-SNAPSHOT-
tests.jar hadoop-common-3.3.0-SNAPSHOT-test-sources.jar hadoop-kms-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-app-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-app-3.3.0-SNAPSHOT-
sources.jar hadoop-mapreduce-client-app-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-common-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-common-3.3.0-SNAPSHOT-sources.jar
hadoop-mapreduce-client-common-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-core-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-core-3.3.0-SNAPSHOT-sources.jar hadoop-
mapreduce-client-core-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-hs-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-hs-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-client-hs-
3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-hs-plugins-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-hs-plugins-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-client-hs-plugins-
3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-jobclient-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-jobclient-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-client-jobclient-3.3.0-
SNAPSHOT-tests.jar hadoop-mapreduce-client-jobclient-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-nativetask-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-nativetask-3.3.0-
SNAPSHOT-sources.jar hadoop-mapreduce-client-nativetask-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-shuffle-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-shuffle-3.3.0-
SNAPSHOT-sources.jar hadoop-mapreduce-client-shuffle-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-uploader-3.3.0-SNAPSHOT.jar hadoop-mapreduce-examples-3.3.0-SNAPSHOT.jar
hadoop-mapreduce-examples-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-examples-3.3.0-SNAPSHOT-test-sources.jar hadoop-nfs-3.3.0-SNAPSHOT.jar hadoop-registry-3.3.0-SNAPSHOT.jar
hadoop-yarn-api-3.3.0-SNAPSHOT.jar hadoop-yarn-api-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-api-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-applications-distributedshell-3.3.0-SNAPSHOT.jar
hadoop-yarn-applications-distributedshell-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-applications-distributedshell-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-applications-unmanaged-am-launcher-
3.3.0-SNAPSHOT.jar hadoop-yarn-applications-unmanaged-am-launcher-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-applications-unmanaged-am-launcher-3.3.0-SNAPSHOT-test-sources.jar hadoop-
yarn-client-3.3.0-SNAPSHOT.jar hadoop-yarn-client-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-client-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-common-3.3.0-SNAPSHOT.jar hadoop-yarn-
common-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-common-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-csi-3.3.0-SNAPSHOT.jar hadoop-yarn-registry-3.3.0-SNAPSHOT.jar hadoop-yarn-server-
applicationhistoryservice-3.3.0-SNAPSHOT.jar hadoop-yarn-server-applicationhistoryservice-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-applicationhistoryservice-3.3.0-SNAPSHOT-test-sources.jar
hadoop-yarn-server-common-3.3.0-SNAPSHOT.jar hadoop-yarn-server-common-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-common-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server-
nodemanager-3.3.0-SNAPSHOT.jar hadoop-yarn-server-nodemanager-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-nodemanager-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server-
resourcemanager-3.3.0-SNAPSHOT.jar hadoop-yarn-server-resourcemanager-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-resourcemanager-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server-
router-3.3.0-SNAPSHOT.jar hadoop-yarn-server-sharedcachemanager-3.3.0-SNAPSHOT.jar hadoop-yarn-server-tests-3.3.0-SNAPSHOT.jar hadoop-yarn-server-tests-3.3.0-SNAPSHOT-sources.jar
hadoop-yarn-server-tests-3.3.0-SNAPSHOT-tests.jar hadoop-yarn-server-tests-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server-timeline-pluginstorage-3.3.0-SNAPSHOT.jar hadoop-yarn-server-
timelineservice-3.3.0-SNAPSHOT.jar hadoop-yarn-server-timelineservice-hbase-client-3.3.0-SNAPSHOT.jar hadoop-yarn-server-timelineservice-hbase-common-3.3.0-SNAPSHOT.jar hadoop-yarn-server-
timelineservice-hbase-coprocessor-3.3.0-SNAPSHOT.jar hadoop-yarn-server-timelineservice-hbase-tests-3.3.0-SNAPSHOT.jar hadoop-yarn-server-web-proxy-3.3.0-SNAPSHOT.jar hadoop-yarn-server-
web-proxy-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-web-proxy-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-services-api-3.3.0-SNAPSHOT.jar hadoop-yarn-services-api-3.3.0-SNAPSHOT-
sources.jar hadoop-yarn-services-api-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-services-core-3.3.0-SNAPSHOT.jar hadoop-yarn-services-core-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-services-
core-3.3.0-SNAPSHOT-test-sources.jar hbase-annotations-1.4.8.jar hbase-client-1.4.8.jar hbase-common-1.4.8.jar hbase-protocol-1.4.8.jar HikariCP-java7-2.4.12.jar hsqldb-2.3.4.jar htrace-core-
3.1.0-incubating.jar htrace-core4-4.1.0-incubating.jar httpclient-4.5.6.jar httpcore-4.4.10.jar jackson-annotations-2.9.8.jar jackson-core-2.9.8.jar jackson-core-asl-1.9.13.jar jackson-databind-2.9.8.jar
jackson-jaxrs-1.9.13.jar jackson-jaxrs-base-2.9.8.jar jackson-jaxrs-json-provider-2.9.8.jar jackson-mapper-asl-1.9.13.jar jackson-module-jaxb-annotations-2.9.8.jar jackson-xc-1.9.13.jar java-util-
1.9.0.jar javax.activation-api-1.2.0.jar javax.annotation-api-1.3.2.jar javax.inject-1.jar javax.servlet-api-3.1.0.jar javax.websocket-api-1.0.jar javax-websocket-client-impl-9.3.24.v20180605.jar javax-
websocket-server-impl-9.3.24.v20180605.jar jaxb-api-2.2.11.jar jaxb-impl-2.2.3-1.jar jcip-annotations-1.0-1.jar jcodings-1.0.13.jar jersey-client-1.19.jar jersey-core-1.19.jar jersey-guice-1.19.jar
jersey-json-1.19.jar jersey-server-1.19.jar jersey-servlet-1.19.jar jettison-1.1.jar jetty-annotations-9.3.24.v20180605.jar jetty-http-9.3.24.v20180605.jar jetty-io-9.3.24.v20180605.jar jetty-jndi-
9.3.24.v20180605.jar jetty-plus-9.3.24.v20180605.jar jetty-security-9.3.24.v20180605.jar jetty-server-9.3.24.v20180605.jar jetty-servlet-9.3.24.v20180605.jar jetty-util-9.3.24.v20180605.jar jetty-
webapp-9.3.24.v20180605.jar jetty-xml-9.3.24.v20180605.jar jline-3.9.0.jar joni-2.1.2.jar jsch-0.1.54.jar json-io-2.5.1.jar json-smart-2.3.jar jsp-api-2.1.jar jsr305-3.0.0.jar jsr311-api-1.1.1.jar jul-to-
slf4j-1.7.25.jar kerb-admin-1.0.1.jar kerb-client-1.0.1.jar kerb-common-1.0.1.jar kerb-core-1.0.1.jar kerb-crypto-1.0.1.jar kerb-identity-1.0.1.jar kerb-server-1.0.1.jar kerb-simplekdc-1.0.1.jar kerb-
util-1.0.1.jar kerby-asn1-1.0.1.jar kerby-config-1.0.1.jar kerby-pkix-1.0.1.jar kerby-util-1.0.1.jar kerby-xdr-1.0.1.jar log4j-1.2.17.jar metrics-core-2.2.0.jar metrics-core-3.2.4.jar mssql-jdbc-
6.2.1.jre7.jar netty-3.10.6.Final.jar netty-all-4.1.27.Final.jar netty-buffer-4.1.27.Final.jar netty-codec-4.1.27.Final.jar netty-codec-http2-4.1.27.Final.jar netty-codec-http-4.1.27.Final.jar netty-codec-
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")
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Jigsaw導入に期待
7
Hadoopコミュニティでshaded jarを用意
• 2. の問題を部分的に解決
ただしメンテナンスが困難
• どのライブラリをshadeすべきか
• shade漏れがないか
"Jigsaw" を活用することで根本解決したい
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
問題2: GCの長期化
8
HDFSのマスタ(NameNode)
• 名前空間とブロックの位置情報を全て
ヒープに保持
• 大規模クラスタではヒープが数100GBに
• STW(Stop-The-World)が長期化
• ヤフーのある環境では分単位の停止
• STWのたびにフェールオーバー
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
新しいGCアルゴリズムに期待
9
バージョンを上げると利用できるGCが増える
• ZGC (Java 11)
• Shenandoah GC (Java 12, RHEL同梱の
OpenJDK 8にもbackport)
いずれもSTWを最小限に抑えることを意図し
て開発されている
• ヤフーでも検証予定
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
バージョンを上げると
いいことずくめ
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
なのに、なぜ Hadoopは
Java 11対応
できていないのか?
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Hadoopの(メンテナにとって良くない)特徴
12
コードベースが巨大すぎる
全体的にレガシーなコード
• 10年以上の歴史
• 非互換にことごとくハマる
後方互換性の維持
• Java 11とJava 8の両方で動くようにする
• とんでもなく大変
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ソースコードの規模
13
*.java ファイルの行数
• JUnit5: 9.8万行
• Apache Tomcat: 14万行
• Spring: 68万行
• Apache Hadoop: 158万行
• JDK 11: 368万行
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
レガシーコード実例
14
• こんなコードがいたるところにある
• これはJava 11でもそのまま動くので、まだ
まし
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Hadoopが影響を受けた問題
15
• '_' 1文字の命名の禁止 (JEP 213)
• sun.misc.Cleaner が移動 (JEP 260)
• Doclet (JEP 221)
• HTML5 JavaDoc (JEP 224)
• Java EEモジュールの削除 (JEP 320)
• などなど
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
'_' 1文字の命名が禁止に
16
Milling Project Coins (JEP 213)で禁止
• Unnamed lambda parameterとして
利用するため (JEP 302)
• HadoopのWeb UIの一部で利用してい
るHamletという独自フレームワークに
'_' が大量に含まれていた
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
互換性を意識しながら修正
17
'_' を '__' に変換するだけだと、互換性が崩れる
'__' に変換したpackageを新規作成
古いpackageをJava 9以上でコンパイルさせない
• Maven compiler plugin で設定
• リリースはJava 8で実施されるため、リリースに
影響しない
パッチのサイズは1MBに... (HADOOP-11875)
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 18
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Hadoopとsun.misc.Cleaner
19
HadoopにおけるCleanerの利用目的
• munmap(2)の実装
• Linux前提なら、JNIから叩けばよい
(mlockを使う場合はそうしている)
• WindowsだとJNI経由で叩けないので
Cleanerを利用
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の対応を参考にした
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
黒魔術
21
最後の手段であることに注意
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の機能を無効化
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Doclet
23
• 無効化したことで全てのクラス/メソッドで
Javadocが生成されるようになった
• 今まで隠れていたHTMLのフォーマット違反の
大量のJavadocが明るみに・・・
• みんなで頑張って修正(HADOOP-15785,
HDFS-13939)
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
HTMLフォーマット違反の修正
24
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
HTMLフォーマット違反の修正
25
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
JDK11のJavadoc
26
• Java11からJavadocのデフォルト設定が
HTML5に変わった(Java10まではHTML4が
デフォルト)
• そのままJavadocビルドするとまた大量のエ
ラーが発生
• JavadocのオプションでHTML4でビルドする
ように指定(HADOOP-15902)
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)
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
EEモジュールがJDKから削除
28
基本的にはMavenのdependencyに追加するだけ
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ライブラリの
バージョンアップ
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ライブラリのバージョンアップ
30
いくつかのライブラリではJDK11をサポートしてい
るバージョンにアップグレードする必要がある
• Log4J
• JUnit
• Mockito
• Jersey
などなど
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
Log4J
31
Log4J1(1系)
• 2015年8月 EOL
• 当然Java11はサポート対象外(でも結構動く)
Log4J2(2系)
• Java8もJava11もサポート
• 1系と比べてパフォーマンスが大幅に改善
• 1系からマイグレーションする方法にいくつかの選択肢がある
• 1系の設定ファイルと非互換(ユーザーインパクト大)
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千行!
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
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)
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
JUnit
35
JUnit4
• サポートはJava8まで
• 11はサポート対象外(でも結構動く)
JUnit5
• Java8もJava11もサポート
• JUnit4からのマイグレーション手順は整理されている
※それでもHadoopには大量のユニットテストがあるので大変
• junit-vintage-engineを使うとJunit4との共存が可能
徐々にJUnit5へのマイグレーションを進めることができる!
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も削除
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)
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で失敗するテストがある
• やばい。
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
JDK11対応に向けて
39
残りの作業
• 依存ライブラリのアップグレードをがんばる
• JDK11で通らないテストがまだたくさんあるので1つ
ずつ潰していく(HADOOP-16264)
• 今年中には対応できるかも
Thanks to all the contributors!
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/

More Related Content

PDF
マイクロサービス 4つの分割アプローチ
PPTX
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
PDF
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
PPTX
Dockerからcontainerdへの移行
PDF
Infrastructure as Code (IaC) 談義 2022
PDF
20200930 AWS Black Belt Online Seminar Amazon Kinesis Video Streams
PDF
AWS Black Belt Techシリーズ Amazon Kinesis
PDF
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
マイクロサービス 4つの分割アプローチ
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Dockerからcontainerdへの移行
Infrastructure as Code (IaC) 談義 2022
20200930 AWS Black Belt Online Seminar Amazon Kinesis Video Streams
AWS Black Belt Techシリーズ Amazon Kinesis
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)

What's hot (20)

PDF
AWSのログ管理ベストプラクティス
PDF
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
20191001 AWS Black Belt Online Seminar AWS Lake Formation
PDF
AWS Black Belt Online Seminar AWS Direct Connect
PPT
Cassandraのしくみ データの読み書き編
PDF
そんなトランザクションマネージャで大丈夫か?
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
BuildKitの概要と最近の機能
PDF
20190522 AWS Black Belt Online Seminar AWS Step Functions
PDF
20200219 AWS Black Belt Online Seminar オンプレミスとAWS間の冗長化接続
PDF
20200331 AWS Black Belt Online Seminar AWS Elemental MediaConvert
PPTX
イベント・ソーシングを知る
PDF
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PDF
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
PDF
SolrとElasticsearchを比べてみよう
PPTX
週末趣味のAWS Transit Gatewayでの経路制御
PDF
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
PDF
20190514 AWS Black Belt Online Seminar Amazon API Gateway
AWSのログ管理ベストプラクティス
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
20191001 AWS Black Belt Online Seminar AWS Lake Formation
AWS Black Belt Online Seminar AWS Direct Connect
Cassandraのしくみ データの読み書き編
そんなトランザクションマネージャで大丈夫か?
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
BuildKitの概要と最近の機能
20190522 AWS Black Belt Online Seminar AWS Step Functions
20200219 AWS Black Belt Online Seminar オンプレミスとAWS間の冗長化接続
20200331 AWS Black Belt Online Seminar AWS Elemental MediaConvert
イベント・ソーシングを知る
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
SolrとElasticsearchを比べてみよう
週末趣味のAWS Transit Gatewayでの経路制御
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
20190514 AWS Black Belt Online Seminar Amazon API Gateway
Ad

Similar to Java11へのマイグレーションガイド ~Apache Hadoopの事例~ (20)

PDF
Hadoop-3.2.0の新機能の紹介とJava9+対応のコミュニティ動向
PDF
Apache Big Data Miami 2017 - Hadoop Source Code Reading #23 #hadoopreading
PDF
Apache Hadoopの現在と未来
PDF
サーバー設定のお話
PPT
Hadoop ~Yahoo! JAPANの活用について~
PDF
最新版Hadoopクラスタを運用して得られたもの
PPT
Cake Matsuri Nanapi
PPTX
HAWQをCDHで動かしてみた
PPTX
データ活用を効率化するHadoop WebUIと権限管理改善事例
PDF
Antenna 20180306 AzureのIaaSで構築する、シンプルなWebサーバ環境
PDF
Apache Ambari Overview -- Hadoop for Everyone
PDF
Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)
PDF
Railsの運用について
PDF
20150803 baas meetup
PDF
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
PDF
[Oracle big data jam session #1] Apache Spark ことはじめ
PDF
試して覚えるPacemaker入門 『リソース設定編』
PPTX
Hadoop -ResourceManager HAの仕組み-
PDF
Apache Kylinについて #hcj2016
PDF
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Hadoop-3.2.0の新機能の紹介とJava9+対応のコミュニティ動向
Apache Big Data Miami 2017 - Hadoop Source Code Reading #23 #hadoopreading
Apache Hadoopの現在と未来
サーバー設定のお話
Hadoop ~Yahoo! JAPANの活用について~
最新版Hadoopクラスタを運用して得られたもの
Cake Matsuri Nanapi
HAWQをCDHで動かしてみた
データ活用を効率化するHadoop WebUIと権限管理改善事例
Antenna 20180306 AzureのIaaSで構築する、シンプルなWebサーバ環境
Apache Ambari Overview -- Hadoop for Everyone
Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)
Railsの運用について
20150803 baas meetup
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
[Oracle big data jam session #1] Apache Spark ことはじめ
試して覚えるPacemaker入門 『リソース設定編』
Hadoop -ResourceManager HAの仕組み-
Apache Kylinについて #hcj2016
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Ad

More from Yahoo!デベロッパーネットワーク (20)

PDF
ゼロから始める転移学習
PDF
継続的なモデルモニタリングを実現するKubernetes Operator
PDF
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
PDF
オンプレML基盤on Kubernetes パネルディスカッション
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
PDF
Persistent-memory-native Database High-availability Feature
PDF
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
PDF
eコマースと実店舗の相互利益を目指したデザイン #yjtc
PDF
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
PDF
ビッグデータから人々のムードを捉える #yjtc
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
PDF
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
PDF
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
PDF
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PDF
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PDF
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
PDF
「新しいおうち探し」のためのAIアシスト検索 #yjtc
PDF
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ゼロから始める転移学習
継続的なモデルモニタリングを実現するKubernetes Operator
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Persistent-memory-native Database High-availability Feature
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
eコマースと実店舗の相互利益を目指したデザイン #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
ビッグデータから人々のムードを捉える #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc

Java11へのマイグレーションガイド ~Apache Hadoopの事例~

  • 1. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 2019年5月18日 鯵坂 明, 浅沼 孝信 Java11への マイグレーションガイド ~Apache Hadoopの事例~
  • 2. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 自己紹介 鯵坂 明 (@ajis_ka) Apache Hadoop PMC 2018/9 中途入社 • Hadoop導入支援 • テクニカルサポート • Hadoopバージョンアッ プ + 新機能導入検証 • HadoopのJava11対応 2 浅沼 孝信 (@hayanige) Apache Hadoopコミッタ 2012/4 新卒入社 • Hadoop運用・開発 • NiFi導入・運用 • Hadoopバージョンアッ プ + 新機能導入検証 • HadoopのJava11対応
  • 3. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. とは 3 OSSの分散処理基盤 • Hadoop Distributed FileSystem (HDFS) • 分散処理のスケジューリング、クラスタ のリソース管理 (YARN: Yet Another Resource Negotiator) • ほとんどがJavaで実装されている
  • 4. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. HadoopとJava 11 4 Hadoopは現時点でJava 11に未対応 • Java 11対応のJIRA: HADOOP-15338 • 対応が終わると、Hadoopにまつわる重 大な問題を解決できると期待している • 今回は、重大な問題を2つ紹介
  • 5. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. これ、見覚えありませんか? 5 accessors-smart-1.2.jar animal-sniffer-annotations-1.17.jar aopalliance-1.0.jar asm-5.0.4.jar asm-commons-6.0.jar asm-tree-6.0.jar audience-annotations-0.5.0.jar avro-1.7.7.jar bcpkix-jdk15on- 1.60.jar bcprov-jdk15on-1.60.jar commons-beanutils-1.9.3.jar commons-cli-1.2.jar commons-codec-1.11.jar commons-collections-3.2.2.jar commons-compress-1.18.jar commons-configuration2- 2.1.1.jar commons-csv-1.0.jar commons-daemon-1.0.13.jar commons-io-2.5.jar commons-lang-2.6.jar commons-lang3-3.7.jar commons-logging-1.1.3.jar commons-math3-3.1.1.jar commons-net- 3.6.jar commons-text-1.4.jar curator-client-2.13.0.jar curator-framework-2.13.0.jar curator-recipes-2.13.0.jar dnsjava-2.1.7.jar ehcache-3.3.1.jar error_prone_annotations-2.2.0.jar fst-2.50.jar geronimo-jcache_1.0_spec-1.0-alpha-1.jar grpc-context-1.15.1.jar grpc-core-1.15.1.jar grpc-netty-1.15.1.jar grpc-protobuf-1.15.1.jar grpc-protobuf-lite-1.15.1.jar grpc-stub-1.15.1.jar gson-2.2.4.jar guava-11.0.2.jar guava-20.0.jar guice-4.0.jar guice-servlet-4.0.jar hadoop-annotations-3.3.0-SNAPSHOT.jar hadoop-auth-3.3.0-SNAPSHOT.jar hadoop-client-api-3.3.0-SNAPSHOT.jar hadoop-client- minicluster-3.3.0-SNAPSHOT.jar hadoop-client-runtime-3.3.0-SNAPSHOT.jar hadoop-common-3.3.0-SNAPSHOT.jar hadoop-common-3.3.0-SNAPSHOT-sources.jar hadoop-common-3.3.0-SNAPSHOT- tests.jar hadoop-common-3.3.0-SNAPSHOT-test-sources.jar hadoop-kms-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-app-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-app-3.3.0-SNAPSHOT- sources.jar hadoop-mapreduce-client-app-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-common-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-common-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-client-common-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-core-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-core-3.3.0-SNAPSHOT-sources.jar hadoop- mapreduce-client-core-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-hs-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-hs-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-client-hs- 3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-hs-plugins-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-hs-plugins-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-client-hs-plugins- 3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-jobclient-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-jobclient-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-client-jobclient-3.3.0- SNAPSHOT-tests.jar hadoop-mapreduce-client-jobclient-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-nativetask-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-nativetask-3.3.0- SNAPSHOT-sources.jar hadoop-mapreduce-client-nativetask-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-shuffle-3.3.0-SNAPSHOT.jar hadoop-mapreduce-client-shuffle-3.3.0- SNAPSHOT-sources.jar hadoop-mapreduce-client-shuffle-3.3.0-SNAPSHOT-test-sources.jar hadoop-mapreduce-client-uploader-3.3.0-SNAPSHOT.jar hadoop-mapreduce-examples-3.3.0-SNAPSHOT.jar hadoop-mapreduce-examples-3.3.0-SNAPSHOT-sources.jar hadoop-mapreduce-examples-3.3.0-SNAPSHOT-test-sources.jar hadoop-nfs-3.3.0-SNAPSHOT.jar hadoop-registry-3.3.0-SNAPSHOT.jar hadoop-yarn-api-3.3.0-SNAPSHOT.jar hadoop-yarn-api-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-api-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-applications-distributedshell-3.3.0-SNAPSHOT.jar hadoop-yarn-applications-distributedshell-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-applications-distributedshell-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-applications-unmanaged-am-launcher- 3.3.0-SNAPSHOT.jar hadoop-yarn-applications-unmanaged-am-launcher-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-applications-unmanaged-am-launcher-3.3.0-SNAPSHOT-test-sources.jar hadoop- yarn-client-3.3.0-SNAPSHOT.jar hadoop-yarn-client-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-client-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-common-3.3.0-SNAPSHOT.jar hadoop-yarn- common-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-common-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-csi-3.3.0-SNAPSHOT.jar hadoop-yarn-registry-3.3.0-SNAPSHOT.jar hadoop-yarn-server- applicationhistoryservice-3.3.0-SNAPSHOT.jar hadoop-yarn-server-applicationhistoryservice-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-applicationhistoryservice-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server-common-3.3.0-SNAPSHOT.jar hadoop-yarn-server-common-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-common-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server- nodemanager-3.3.0-SNAPSHOT.jar hadoop-yarn-server-nodemanager-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-nodemanager-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server- resourcemanager-3.3.0-SNAPSHOT.jar hadoop-yarn-server-resourcemanager-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-resourcemanager-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server- router-3.3.0-SNAPSHOT.jar hadoop-yarn-server-sharedcachemanager-3.3.0-SNAPSHOT.jar hadoop-yarn-server-tests-3.3.0-SNAPSHOT.jar hadoop-yarn-server-tests-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-tests-3.3.0-SNAPSHOT-tests.jar hadoop-yarn-server-tests-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-server-timeline-pluginstorage-3.3.0-SNAPSHOT.jar hadoop-yarn-server- timelineservice-3.3.0-SNAPSHOT.jar hadoop-yarn-server-timelineservice-hbase-client-3.3.0-SNAPSHOT.jar hadoop-yarn-server-timelineservice-hbase-common-3.3.0-SNAPSHOT.jar hadoop-yarn-server- timelineservice-hbase-coprocessor-3.3.0-SNAPSHOT.jar hadoop-yarn-server-timelineservice-hbase-tests-3.3.0-SNAPSHOT.jar hadoop-yarn-server-web-proxy-3.3.0-SNAPSHOT.jar hadoop-yarn-server- web-proxy-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-server-web-proxy-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-services-api-3.3.0-SNAPSHOT.jar hadoop-yarn-services-api-3.3.0-SNAPSHOT- sources.jar hadoop-yarn-services-api-3.3.0-SNAPSHOT-test-sources.jar hadoop-yarn-services-core-3.3.0-SNAPSHOT.jar hadoop-yarn-services-core-3.3.0-SNAPSHOT-sources.jar hadoop-yarn-services- core-3.3.0-SNAPSHOT-test-sources.jar hbase-annotations-1.4.8.jar hbase-client-1.4.8.jar hbase-common-1.4.8.jar hbase-protocol-1.4.8.jar HikariCP-java7-2.4.12.jar hsqldb-2.3.4.jar htrace-core- 3.1.0-incubating.jar htrace-core4-4.1.0-incubating.jar httpclient-4.5.6.jar httpcore-4.4.10.jar jackson-annotations-2.9.8.jar jackson-core-2.9.8.jar jackson-core-asl-1.9.13.jar jackson-databind-2.9.8.jar jackson-jaxrs-1.9.13.jar jackson-jaxrs-base-2.9.8.jar jackson-jaxrs-json-provider-2.9.8.jar jackson-mapper-asl-1.9.13.jar jackson-module-jaxb-annotations-2.9.8.jar jackson-xc-1.9.13.jar java-util- 1.9.0.jar javax.activation-api-1.2.0.jar javax.annotation-api-1.3.2.jar javax.inject-1.jar javax.servlet-api-3.1.0.jar javax.websocket-api-1.0.jar javax-websocket-client-impl-9.3.24.v20180605.jar javax- websocket-server-impl-9.3.24.v20180605.jar jaxb-api-2.2.11.jar jaxb-impl-2.2.3-1.jar jcip-annotations-1.0-1.jar jcodings-1.0.13.jar jersey-client-1.19.jar jersey-core-1.19.jar jersey-guice-1.19.jar jersey-json-1.19.jar jersey-server-1.19.jar jersey-servlet-1.19.jar jettison-1.1.jar jetty-annotations-9.3.24.v20180605.jar jetty-http-9.3.24.v20180605.jar jetty-io-9.3.24.v20180605.jar jetty-jndi- 9.3.24.v20180605.jar jetty-plus-9.3.24.v20180605.jar jetty-security-9.3.24.v20180605.jar jetty-server-9.3.24.v20180605.jar jetty-servlet-9.3.24.v20180605.jar jetty-util-9.3.24.v20180605.jar jetty- webapp-9.3.24.v20180605.jar jetty-xml-9.3.24.v20180605.jar jline-3.9.0.jar joni-2.1.2.jar jsch-0.1.54.jar json-io-2.5.1.jar json-smart-2.3.jar jsp-api-2.1.jar jsr305-3.0.0.jar jsr311-api-1.1.1.jar jul-to- slf4j-1.7.25.jar kerb-admin-1.0.1.jar kerb-client-1.0.1.jar kerb-common-1.0.1.jar kerb-core-1.0.1.jar kerb-crypto-1.0.1.jar kerb-identity-1.0.1.jar kerb-server-1.0.1.jar kerb-simplekdc-1.0.1.jar kerb- util-1.0.1.jar kerby-asn1-1.0.1.jar kerby-config-1.0.1.jar kerby-pkix-1.0.1.jar kerby-util-1.0.1.jar kerby-xdr-1.0.1.jar log4j-1.2.17.jar metrics-core-2.2.0.jar metrics-core-3.2.4.jar mssql-jdbc- 6.2.1.jre7.jar netty-3.10.6.Final.jar netty-all-4.1.27.Final.jar netty-buffer-4.1.27.Final.jar netty-codec-4.1.27.Final.jar netty-codec-http2-4.1.27.Final.jar netty-codec-http-4.1.27.Final.jar netty-codec-
  • 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の両方で動くようにする • とんでもなく大変
  • 13. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ソースコードの規模 13 *.java ファイルの行数 • JUnit5: 9.8万行 • Apache Tomcat: 14万行 • Spring: 68万行 • Apache Hadoop: 158万行 • JDK 11: 368万行
  • 14. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. レガシーコード実例 14 • こんなコードがいたるところにある • これはJava 11でもそのまま動くので、まだ まし
  • 15. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. Hadoopが影響を受けた問題 15 • '_' 1文字の命名の禁止 (JEP 213) • sun.misc.Cleaner が移動 (JEP 260) • Doclet (JEP 221) • HTML5 JavaDoc (JEP 224) • Java EEモジュールの削除 (JEP 320) • などなど
  • 16. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. '_' 1文字の命名が禁止に 16 Milling Project Coins (JEP 213)で禁止 • Unnamed lambda parameterとして 利用するため (JEP 302) • HadoopのWeb UIの一部で利用してい るHamletという独自フレームワークに '_' が大量に含まれていた
  • 17. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 互換性を意識しながら修正 17 '_' を '__' に変換するだけだと、互換性が崩れる '__' に変換したpackageを新規作成 古いpackageをJava 9以上でコンパイルさせない • Maven compiler plugin で設定 • リリースはJava 8で実施されるため、リリースに 影響しない パッチのサイズは1MBに... (HADOOP-11875)
  • 18. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 18
  • 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

  • #7: 2. 多数のlibraryが相互依存している状態なので、バージョンのデッドロックみたいなことがよく起こる。Hadoopを利用している、言い換えると、Hadoopに依存しているライブラリは世の中に多数あるが、それらのライブラリの開発者も、このjar hellと呼ばれる状況に困っています。 3. Hadoopはmulti packageのプロダクトなので、別のpackageから呼び出される内部APIはpublicにしてあげないといけないが、"Public is too public"。Hadoopだと、developer向けのannotationをつけてこのpublicは変更されるかもしれない、という警告をしてあげているけど、publicだと使えてしまうので、ユーザがうっかり使ってしまうかもしれない。
  • #10: C4 GCもあるけど高い...
  • #15: 引数および戻り値がListではなく配列 拡張for文ですらない もちろんLambdaではない Null checkを書きたくない