Saturday, June 27, 2015

Apache Sparkメモ#2

spark-shellからコマンドを叩いている段階から、プログラムを書く段階にすすみたい。プログラムをsparkに食わせるのをsubmitと呼んでいる。ここを読んだ。 https://spark.apache.org/docs/1.4.0/submitting-applications.html 
サンプルプログラムをsubmitするには以下のようにする。以下の例ではモンテカルロ法で円周率を計算している。

$ ./bin/spark-submit   --class org.apache.spark.examples.SparkPi   --master local[8] lib/spark-examples-1.4.0-hadoop2.6.0.jar 10
Pi is roughly 3.14154
同じことをpythonで実行する。

$ ./bin/spark-submit   --master local[*]   examples/src/main/python/pi.py   10 
Pi is roughly 3.141452
では自分で作ったファイルをコンパイルするにはどうするか。

ここのSimple Projectの例題をやってみよう。ファイルの中のaとかbの数を数えるってやつ。

http://spark.apache.org/docs/1.4.0/quick-start.html#self-contained-applications 
よくわからないのだが、上記のようにsbtを使って定義し、ビルドするらしい。sbtは以下からダウンロードした。
http://www.scala-sbt.org 
sparkのページの例題の以下のバージョンだが、私の手元のscalaはもっと古い番号なのだが、気にせず例題通りにやってみた。

scalaVersion := "2.10.4"
setはset packageで、手元にあるsbtファイルを実行してくれる。ファイルが2つある場合はどちらを取るのだろう。 とにかく、set packageを実行すると、なんやらmavenや圧縮のライブラリなど含めていろいろダウンロードが始まる。これってまともなことなのだろうか。依存関係は先に解決してくれればいいのに。すごく時間かかる。2度目からは時間かからないんだろうな。 これができていたファイル。

./target/scala-2.10/classes/SimpleApp.class
./target/scala-2.10/simple-project_2.10-1.0.jar
sbtファイルには name := "Simple Project" と書いていたのだが、できるjarファイルは小文字なんだなあ。しかも横棒が入っているし。油断も隙もない。。。
私Javaで開発やらないんで、どうもこういうJava周りの風習について行けないんだよなあ。mavenて何なのよ。

文句はともかくsubmitしてみよう。

$ ./bin/spark-submit   --class "SimpleApp"   --master local[4]   target/scala-2.10/simple-project_2.10-1.0.jar
Lines with a: 60, Lines with b: 29


spark 1.4.0からR対応が入った。例題が付いているけれど、dataframe.Rを読めばRの言葉で書いてあるので理解できる。本日一番親しみを感じるのがRという結論。実行結果は正しそうだ。

$ ./bin/spark-submit examples/src/main/r/dataframe.R
root
 |-- name: string (nullable = true)
 |-- age: double (nullable = true)
root
 |-- age: long (nullable = true)
 |-- name: string (nullable = true)
    name
1 Justin


おしまい。

Saturday, June 20, 2015

Apache Sparkメモ

Apache Sparkでローカルのファイルを読んで、必要なフィールドを抜き出すまでに引っかかったことをメモっておく。 つまりはawkやpythonならあっさりできること。 spark-shellを立ち上げると、ポート4040でjettyくんが立ち上がり、sparkの動作状況がわかるのでブラウザでみてみると良い。 Javaではファイル名に”:”が入っているのを許さないらしく、それがファイルにアクセスした時に判明する。 以下は人工的な例だが、dateを元にしてで作ったようなファイル名の場合に問題になるでしょう。

scala> val f = sc.textFile("tmp/w:1:2.csv")
その時の怒られようが以下のように相対パスがどうのこうのと意味不明なので、ちょっと覚えておこう。

scala> f.first
java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: w:1:2.csv

scala> val f = sc.textFile("tmp/w.csv")
てきとーなcsvファイルだが、カンマ区切りとして読み込むには以下のようにsplitする。pythonみたいにcsvモジュールはないってことだろうか。firstで、最初の一行を表示しているところ。

scala> f.map(line => line.split(",")).first
res2: Array[String] = Array(8, 1, 66.3)
最初のフィールドには興味がないという場合、0番目は飛ばして、1、2を タプルで保持する。

scala> f.map(line => line.split(",")).map(x => (x(1),x(2))).first
res3: (String, String) = (1,66.3)
そして、2番めのフィールドの値でフィルタする処理。

scala> f.map(line => line.split(",")).filter(x => x(2).toDouble > 67.0).map(x => (x(1),x(2))).first
res6: (String, String) = (2,67.1)
map, reduceをやろうとしている時にcsvに値の欠損があって、そこで処理が失敗するんですね。一旦csvを直して出直しました。 ペアの場合は左がキーで、valueを集計するには、単に_+_と言えば良い。scalaのアンダースコアは謎だけれど、この場合、二項演算子だということを言ってるらしい。キーが同じものを集計して出力してるところ。最初の3つを表示している。

scala> f.map(line => line.split(",")).map(x=>(x(2),1)).reduceByKey(_+_).take(3)
res5: Array[(String, Int)] = Array((65.7,1), (65.5,2), (66.1,3))
集計した値でソート。”_._2”と言っている後半の”_2”は、配列の2番目の要素の意味。scalaではなぜか

scala> (1,2,3)._2
res10: Int = 2
のように._2のように要素を指定する。ようするに[2]のこと。これって 1始まりの配列なのね。 最初の”_”は任意のものにマッチするアンダースコア。

scala> f.map(line => line.split(",")).map(x=>(x(2),1)).reduceByKey(_+_).sortBy(_._2).take(3)
res6: Array[(String, Int)] = Array((65.7,1), (66.9,1), (67.1,1))
これだと面白くないので、逆順にする。 reverseするにはsortByの第二引数でfalseというだけ。これはscalaではなく、RDDの仕様。

scala> f.map(line => line.split(",")).map(x=>(x(2),1)).reduceByKey(_+_).sortBy(_._2, false).take(3)
res7: Array[(String, Int)] = Array((63.9,17), (64.5,14), (64.2,13))
おしまい。 今回はカンマ区切りだったのでline.split(“,”)としたが、空白で切る場合はsplit(“\\s+”)とする。これはJavaの規則だそうだ。

Saturday, June 06, 2015

iTunesでのNHK語学CDのダウンロード

結論からいうと、
iTunes Storeではオーディオブック、着信音、通知音は再ダウンロードできない
ということだそうです。つまり買ったデバイスでしか聞けないということです。

それと、NHKの語学の教材のCDはオーディオブックです。

この顛末は以下の通りです。
iCloudの機能でファミリー共有ということができます。iTunesで買ったものがファミリー設定した家族と共有できるのです。この機能を使って、中学生の子供にNHKの基礎英語のCDを買って、子供のiPodで聴けるようにしようとおもいました。ところが買ったパソコンのiTunesの中でこのCDの内容を見つけるのが一苦労、さらにiPodからは全く見えない、という症状になりました。

結局、ここからhttp://www.apple.com/jp/support/itunes/contact/  電話で相談して、冒頭のことを教えてもらった次第です。再ダウンロードできないので、ちゃんとバックアップしてくださいとのことだそうです。それだと根本の問題の解決まで先が長いので、買ったコンテンツの分は返金してもらい、改めて子供のiPodから購入することにしました。

NHKの語学番組は一週間遅れですがストリーミング配信しているので、そもそもCDを買う理由はそれほどないんですけどね。

Sunday, May 31, 2015

iOS卒業

iPod touchを使っていたのですが、上の子に与えることにして、私はiOSから卒業しました。もう大体分かったということで。

下の子はZ会の通信添削をやっているのでiPad miniを使ってます。

Running Spark on EC2

Apache Sparkを動かそうと思って、Running Spark on EC2に書いてあることをやってみている。

pythonのスクリプトでSparkのクラスタがインストールできる優れものだが、私は今までAWSでEC2にsshでログインしたことがあるだけだったので、新しく設定すべきことがあった。これメモしておかないと絶対忘れる。

東京リージョンのpemのファイルは手元にあるので、それを使う。これ以外にアクセスキーが必要。AWSコンソールの右上の認証情報からIAMマネージメントコンソールには入って、アクセスキーを作った。これを環境変数AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY
に入れておく。

キーペアは、自分がAWSで設定したキーペアの名前。

スクリプトを動かすと、
You are not authorized to perform this operation.
といっておこられる。

AWSコンソールで、IAM > ユーザから、ポリシーのアタッチで、自分にAdministratorAccessをつけた。

これでスクリプトが起動。クラスタが立ち上がった。デフォルトで起動したところm1.largeが2ノード立ち上がった。

クラスタのマシンに入るには、同じスクリプトを使うのだが、キーペア、pemファイル、リージョン、クラスタ名などを設定する必要があった。



Tuesday, May 05, 2015

人口ピラミッド


子供の日なので、人口ピラミッドを書いてみました。男女が右左になっているのを書くのは面倒だったのでダブってますが、大差ないのでまあいいでしょう。

元ネタは総務省統計局のページから「年齢各歳別人口」をエクセルでダウンロードしました。

順調に子供の数は減ってるんですね。現在、0歳児の一学年の人数は100万ちょっとです。
あと10年くらいすると、100万を割るんじゃないかな。一学年100万を維持したとして、50年後には50歳以下5000万人になるわけですから、なんというか、日本も空いている国になるんですね。(現在は50歳以下は7000万人)

いずれにしてもピラミッドって言わないよね、この形は。

身の回りを見渡しても、職場の平均年齢が45だとすると、あと5年もすれば平均50になるわけで、かなり危ういですよ、これは。10年たったらその部署はなくなってますね。

Sunday, May 03, 2015

Macbookを捨てた話

戸棚の中に、3台のAppleのノートパソコンがあって、そろそろ捨てようかと思っていました。それぞれ2001年、2005年、2008年に買ったものです。

横浜市のルールでは、パソコンの廃却はパソコンのメーカーを通じて行うことになっており、一般のゴミ廃却では扱っていません。横浜市のゴミのページを見ると、Appleなどのメーカーのリサイクルのページのリンクが貼ってあります。Appleでは「PCリサイクルマーク」のシールがあれば無料、でなければ3000円で処理してくれるという。ところがシールが見つからないんですな、これが。一番最近買ったMacMiniのシールは大切に裏面に貼りました。しかし現在ゴミとなっているこの3台のシールはどれも無い。しかし、よく見ると、アップルストアに持って来れば、処理してくれるようなことが書いてあるじゃないですか。
Apple Storeでのリサイクルについてお近くのApple Storeでは、Mac(2003年10月以降に販売されたモデル)やiPadのリサイクル処理を無料で受け付けています。古いMacのバッテリーもリサイクル処理いたします。
で、渋谷のアップルストアに電話したところ、その通り、持ってきてくださいというので、3台を背負って渋谷に行ってきました。ところが、よく見れば書いてあるように2001年のものは引き取ってもらえず、廃品業者にでも持って行ってくださいとのことでした。2003年10月って、多分「パソコンリサイクル法」が出来た時ね。

ともかく一番古い1台をふたたび背負って帰ってきたのでした。

店ではApple Watchや新しいMacbookが見られて良かったかな。

Saturday, May 02, 2015

プリンタと電話

まる8年、SHARPの「見楽る」という電話、FAX、プリンタの複合機を使っていたのですが、印刷用紙が入って行かなかったり、だんだん不具合が出てきたので新調しました。複合機だと選択肢が少ないので、プリンタと電話はバラで買いました。プリンタはHPのENVY 4504、電話は子機が2つとFAXがついたPanasonicのやつです。プリンタは安かったね。5000円ちょっと。良かったのはWifiがついていることで、ネットワークにつなぐだけで、コンピュータやiOSから見えるようになってしまいました。

Tuesday, March 24, 2015

gpgメモ

前に使っていたメーラのプラグインがどこかに行ってしまった。MacOSXでもLinuxでもgpgコマンドで行けるのだが、すぐに使い方を忘れるのでメモ。

  •  準備 

     --gen-key              generate a new key pair

 作ったキーは公開サーバに入れた。MIT PGP Key Server

     --import               import/merge keys

gpg --import friend.ascで受け取った公開鍵を自分のところに登録。

 -k, --list-keys            list keys
で確認。
  • 暗号化

 -e, --encrypt              encrypt data
 -a, --armor                create ascii armored output

gpg -e -a textfile.txtでtextfile.ascができるのでそれを送信。

  • 解読

 -d, --decrypt              decrypt data (default)
gpg -d textfile.ascでもらったファイルを解読。

Saturday, March 14, 2015

RAID11

家にRAIDを組んだのはこの時。3年ちょっと前です。特に問題はなかったのですがこのRAID1を二重化しました。前のディスクは2TB、今回は5TBです。3年たつと容量は2倍になるんですかね。二重化といっても両方ともMacにつなげただけで、タイムマシンが交互に使ってくれるというわけです。箱はラトックのものの色違い。