[ERROR] Exit code: 1 – javadoc: error – invalid flag: -Xdoclint:none と怒られるとき

私の場合、Mavenのバージョンが想定外のものになっていたことが要因でした。Xdoclint:noneをするのはおそらくJava1.8を想定していると思いますが、MavenのJavaが1.7になっていました。

$ mvn -v
Apache Maven 3.0.4
Maven home: /usr/share/maven
Java version: 1.7.0_40, vendor: Oracle Corporation
Java home: /usr/lib/jvm/jdk-7-oracle-armhf/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.18.7-v7+", arch: "arm", family: "unix"

↑こんなふうに1.7になっていました。対処法として、↓を挙げておきます。

LinuxでMavenのJavaとシステムのJavaのバージョンが異なる場合の対応策

LinuxでMavenのJavaとシステムのJavaのバージョンが異なる場合の対応策

$ sudo update-alternatives --config java

をしてJava1.8を選択して、さらにJAVA_HOMEを適切に設定したはず(↓)ですが、なぜかMavenのJavaとシステムのJavaのバージョンが異なる状態で、Mavenでビルドしようとするとエラーが出る状態でした。

$ echo $JAVA_HOME
/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt

$ mvn -v
Apache Maven 3.0.4
Maven home: /usr/share/maven
Java version: 1.7.0_40, vendor: Oracle Corporation
Java home: /usr/lib/jvm/jdk-7-oracle-armhf/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.18.7-v7+", arch: "arm", family: "unix"

$ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)

↑上記のようにmavenはJava 1.7、システムのJavaは1.8です。いったいどういうことなのでしょう。。。

$JAVA_HOMEは、/etc/environmentで設定済み↓でした。

$ cat /etc/environment 
JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt

いろいろと調べたところ、update-java-alternativesすればいいようです。

# インストールされているjava一覧を表示
$ update-java-alternatives -l
java-1.6.0-openjdk-armhf 1057 /usr/lib/jvm/java-1.6.0-openjdk-armhf
jdk-7-oracle-armhf 317 /usr/lib/jvm/jdk-7-oracle-armhf
jdk-8-oracle-arm-vfp-hflt 318 /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt

# ↑のjava 1.8を選択
$ sudo update-java-alternatives -s jdk-8-oracle-arm-vfp-hflt
update-alternatives: error: no alternatives for jhat
update-alternatives: error: no alternatives for jrunscript
update-alternatives: error: no alternatives for mozilla-javaplugin.so
update-alternatives: error: no alternatives for schemagen
update-alternatives: error: no alternatives for wsgen
update-alternatives: error: no alternatives for wsimport
update-alternatives: error: no alternatives for xjc

# mvnの確認
$ mvn -version
Apache Maven 3.0.4
Maven home: /usr/share/maven
Java version: 1.8.0, vendor: Oracle Corporation
Java home: /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.18.7-v7+", arch: "arm", family: "unix"

# javaの確認
$ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)

↑上記のように一致しました。MavenはJAVA_HOMEを無視してどこか別のところから読んでくるのでしょうか。。。全く意味不明ですがひとまず直ったのでよしとします。。。

追記@2015-04-26

↑の作業でmvnのバージョンが古いままのことがありました。どうやら環境変数が古いままだったようなので、一旦ログアウトして確認してみると正常になりました。


MCP (MultiCore Parser)を使ってみる、その2 (集計)

前回の記事 (MCP (MultiCore Parser)を使ってみる) で集計も試してみたいと書きました。その後集計のためのコードを書いていたのですが上手く行かず諦めてgithubのissueで聞いてみたところexampleをいただいたので試してみます (MCP作者のKanatokoさんには感謝!です)。

結論から書くと、MCPはawkやperlの倍程度、高速に処理出来ました!

# githubからcloneします
$ git clone https://github.com/Kanatoko/MCP
$ cd MCP

# ビルドします
$ ant

# 動かしてみます(参考→ https://github.com/Kanatoko/MCP/issues/1 )
$ seq 100 | java -cp output/mcp.jar net.jumperz.app.MCP.MCP net.jumperz.io.multicore.example.MSum
5050

というわけで出来ました!さてせっかくマルチコアで動くのでいろいろとやってみます。

まず、データサイズ大きめな、連番が含まれるファイルを作ります。

# 2つほど作ります
$ seq -f %.0f 10000000 > 10M.data

# データサイズは以下のようになっています
$ ls -sh1 *.data
 76M 10M.data

########
# 比較 #
########

# まずはawkとperlで速度を計測してみます
# awkやperl、または内部のコードより優れた方法があったら教えてください。
# 3回実行して、最後の一回の値を採用します、ファイルのキャッシュ対策です(*キャッシュする*という意味です)

# 10M.data
$ time cat 10M.data | awk '{s+=$1}END{printf "%.0f\n", s}'
50000005000000

real	0m3.500s
user	0m3.412s
sys	0m0.756s
$ time cat 10M.data | perl -e '$sum = 0; while (<>) { $sum += $_; } print $sum'
50000005000000
real	0m2.438s
user	0m2.384s
sys	0m0.516s

さてここまでで、既存の手法で行いました。次はMCPを使ってみます。マシンは、

– CPU: Opteron3280 (8コア)
– Ubuntu 12.04.5 LTS
– Linux Kernel: 3.8.0-44-generic
– java version “1.7.0_75” OpenJDK Runtime Environment (IcedTea 2.5.4) (7u75-2.5.4-1~precise1) OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)
です。

# まずは10M.dataをデフォルトの設定で行います
# realとuserの比を見ると、3~4コア程度使っているようですね
$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP net.jumperz.io.multicore.example.MSum
50000005000000

real	0m5.343s
user	0m17.848s
sys	0m0.924s

# 並列度を、1コアから8コアまでやってみます
$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP --thread-count 1 net.jumperz.io.multicore.example.MSum
50000005000000

real	0m2.486s
user	0m2.616s
sys	0m0.588s

$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP --thread-count 2 net.jumperz.io.multicore.example.MSum
50000005000000

real	0m1.777s
user	0m2.984s
sys	0m0.660s

$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP --thread-count 3 net.jumperz.io.multicore.example.MSum
50000005000000

real	0m3.170s
user	0m7.412s
sys	0m0.652s

$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP --thread-count 4 net.jumperz.io.multicore.example.MSum
50000005000000

real	0m5.471s
user	0m17.828s
sys	0m0.908s

$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP --thread-count 5 net.jumperz.io.multicore.example.MSum
50000005000000

real	0m5.366s
user	0m19.192s
sys	0m1.152s

$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP --thread-count 6 net.jumperz.io.multicore.example.MSum
50000005000000

real	0m6.041s
user	0m23.832s
sys	0m1.436s

$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP --thread-count 7 net.jumperz.io.multicore.example.MSum
50000005000000

real	0m7.049s
user	0m29.436s
sys	0m1.660s

$ time cat 10M.data | java -cp output/mcp.jar net.jumperz.app.MCP.MCP --thread-count 8 net.jumperz.io.multicore.example.MSum
50000005000000

real	0m9.359s
user	0m42.464s
sys	0m2.496s

↑の結果としては2コアが最速でawkやperlを上回りました。

まとめると次のようになります。

表: 1,2,3…の連番が格納されている10MBのファイルの処理性能
ソフトウェア 処理時間 (sec)
awk 3.50
Perl 2.43
MCP (1 core) 2.48
MCP (2 cores) 1.77
MCP (3 cores) 3.17
MCP (4 cores) 5.47
MCP (5 cores) 5.36
MCP (6 cores) 6.04
MCP (7 cores) 7.04
MCP (8 cores) 9.35

ついでに100MB($ seq -f %.0f 100000000 > 100M.data)のときも試してみました。

表: 1,2,3…の連番が格納されている100MBのファイルの処理性能
ソフトウェア 処理時間 (sec)
awk 34.45
Perl 24.76
MCP (1 core) 22.11
MCP (2 cores) 17.38
MCP (4 cores) 52.10
MCP (8 cores) 105.60

↑では、MCP@2coresのとき最速です!

総評として、

– MCP@2coresはperlやawkより早い
– MCPは並列度2を超えると速度低下する傾向あり

といったところでしょうか。

MCP (MultiCore Parser)を使ってみる

http://www.scutum.jp/information/waf_tech_blog/2013/02/waf-blog-019.html
https://github.com/Kanatoko/MCP


↑の、Javaを用いて手軽にマルチコアを生かしたデータ処理を可能にするためのフレームワーク MCP (Multi Core Parser)というものを見つけたので使ってみました。

何かのデータ、特にログなどをHadoopで処理する前にそもそもマルチコアで処理したいなと思いました。意外と一つのファイルをマルチコアで処理するのは難しく、うまく出来ませんでした。シングルコアでの処理なら簡単なんですが、8コアマシンで1コアだけ使って待っているってアホらしいですね。一方でHadoopを持ち出すのも大仰ですし。。。

まずは使い方です。私はJavaに疎いのではじめから書きます。

# まず例として、以下の様なファイルを作ります。
# parseというメソッドに、テキストの一行一行が入るようです。
$ vi UpperCase.java
$ cat UpperCase.java 
public class UpperCase
implements net.jumperz.io.multicore.MParser
{
	//--------------------------------------------------------------------------------
	public String parse( String s )
	{
		return s.toUpperCase();
	}
	//--------------------------------------------------------------------------------
}

# mcp.jar をダウンロードします
$ wget http://www.jumperz.net/tools/mcp.jar

# コンパイルします
$ javac -cp mcp.jar UpperCase.java

# 使ってみます
$ echo -e 'foo\nbar\nbaz' | java -cp mcp.jar net.jumperz.app.MCP.MCP UpperCase
FOO
BAR
BAZ

というわけで無事に動かせました。次は集計などをやってみたいと思います。