White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

#ingress UPV 10000行くための行動方法

UPVは、今(2014年12月)時点ではもう少し増えてるかと思いますが、少し前はA16のエージェントでも2000程度でした。私は5000強です。恐らく日本の人でUPV10000ってのもそうそういないと思うので、10000目指したいと思います。

 とか書いてましたが、3ヶ月でUPV10000行きました。東京も多いですが、地方にも結構顔を出しています。

f:id:showyou:20150322205442p:plain

前回からですと、

  1. 名古屋周辺。というか名古屋から東京までの東海道線沿線
  2. 上野公園
  3. 広尾
  4. 中野・杉並
  5. 栃木
  6. 仙台
  7. 盛岡

あたりに顔を出しました。既に東急バス沿線は大体ハック済みです。

コツですが、

  1. Portal密集区間はmissionを頼りにする
  2. 移動は路線バス+徒歩メイン
  3. 旅行を楽しむ

あたりでしょうか。Portalが増えたのはいいのですが、多すぎてどこから攻めればいいかわからない場合があります。その場合はmissonで15min(分)未満のものを選んで行けば自然と近場にあるPortalをまとめて取れるわけです。あとingressを目的に実施すると途中で虚しくなるので、旅行のついでにハックするくらいの方が気楽でいいと思います。

横須賀・猿島に行ってきた

2月はいろいろありましたが、とりあえず生きてます。

たまたま軽く休みができたので、今日でingressのキャンペーン終了だとか言う横須賀まで行ってきました。

ちょうど行った時間が14:00時だったので、無人島の猿島を散策できる、ぎりぎり最終の便に乗ることができました。

これが猿島に行く船。出発地点の三笠公園では激しい闘いが広げられてました。

f:id:showyou:20150228145612j:plain

ぼやけてますが猿島

f:id:showyou:20150228150246j:plain

船上から横須賀南東方向

f:id:showyou:20150228150555j:plain

猿島の船着場

f:id:showyou:20150228150852j:plain

降りたところ

f:id:showyou:20150228151049j:plain

島の中の施設

f:id:showyou:20150228153927j:plain

ミッションクリアの様子(一番左2つのメダル)

f:id:showyou:20150301022037p:plain

キャンペーン最終日だし何としてもPortalを取りに行くエージェントいるかと思いましたが、明日も恐らく船があるからか、あんま攻撃激しくなかったですね。

何とか一箇所だけは占拠しました。

島の南部は特に問題無いですが、北端あたりだと電波がかなりつかみにくいですね。

f:id:showyou:20150301023221j:plain

んで、キャンペーン応募が今日までだったのですが・・帰って寝てたら日付が変わってたというオチ。残念。

2chの専用ブラウザ以外データ取得禁止の話について

全然関係ないですがtwitterでも似たような残念な話がありました。

 

もともとTwitterAPIを公開していたのですが、初期の頃はそれが恐ろしく不安定だったため、Webのページをスクレイピングしていました。Twitter社はスクレイピングを認めてはいなかったと思いますが、便利なのでスクレイピングを使ったクライアントはシェアを伸ばしていきました(Tweenのことです)

 

その後、streamingができたりAPIでもきちんとデータが取れるようになってきたのと、開発者の間でも一部"API使わない奴は外道"的な話が出てくるようになりました。さらにTwitterのWebページのレイアウトが頻繁に変わりスクレイピングも難しくなってきたため、APIに切り替えるようになっていきました。

 

んで数年後何が起きたか。

Twitter社は公式クライアント以外を締め出すべく、1APIキーあたりの利用者数に制限を設けました。律儀にAPI使ってたクライアント憤死です。


「Janetter」PC版などユーザー数が上限に Twitterの他社利用制限、国産アプリに影響 - ITmedia ニュース

 

何が言いたいかというと、真面目に企業のポリシー守っても企業側から切られるとか平気であるんで、その辺はリスク考慮しつつテキトーに使っていくしか無いんじゃないですかね?

Hadoop on docker 後編

前回は既存のコードからHadoopのコンテナを動かすところまで書きましたが、今回はそれに手を加えて複数ノードで動くようにしました。

少し試行錯誤してたので、ソースだけ置いて要点だけ書いて行きます。

showyou/hadoop-docker at multinode · GitHub

まずDockerのパッケージを作るのは、Dockerfileになります。なのでいつも共通の設定とか初期設定はここに書いて行きます。bootstrap.shは毎回起動する度に呼ばれるファイルになっています(ただしbootstrap.shは今回指定して読んでいるだけで、dockerの決まりでは無いと思います)。また今回はNameNode/ResourceManager側とDataNode/NodeManager側でディレクトリを分けました。

作っていった手順ですが、まずsequenceiq/hadoop-dockerイメージを複数立ち上げて、そこで環境をいじって複数ノードで立ち上がるようにしました。次にdockerのソースに戻って同じように動くように変えて行きました。今回はgithubで公開するためこんな回りくどいことをしています。しかし手元の環境で使う場合は、動作した環境に対しdocker commitコマンドを実行することでdockerイメージが作成できます。dockerイメージは差分管理されるのでVMのスナップショットよりも容量が少なくて済むようです。

 

細かい変更点としてはここ(https://github.com/showyou/hadoop-docker/compare/multinode)を見てもらえればわかります。

core-site.xml, yarn-site.xml, hdfs-site.xmlにNameNode / ResourceManagerを指す設定を付け加えています。擬似分散では自動的にlocalhostを見ればよいですが、完全分散では明示する必要があります。またstart-dfs.sh / start-yarn.shはNameNodeマシンから(恐らく)slavesファイルを通して呼ばれるので、DataNode側から呼ばないようにしています。先ほどのxmlファイルをDataNode等が立ち上がる前にばら撒く必要もあります。

DataNodeは複数立てられます。詳しくはgithubリポジトリのReadmeに拙い英語で手順を書いているので読んで貰えればと思います。わからなければ日本語で書きます。

 

以上、車輪の再開発を泥臭くやっていきました。ここで言いたいのは、Hadoopのインストール作業は(パラメータチューニングは別途あるものの)この程度で出来るものであり、とても難しいソフトウェアとか神聖視とか構えないで欲しいということです。YARNの挙動管理は大変かもしれませんが・・

 

今年嬉しかったこととして、これまでデータ分析や大量のデータに興味がなかった方たちが取り組み始めたということがあります。今後彼らを引き上げていく役目になれれば嬉しいと考えています。

 

あと日本はまだその兆しが無いですが、少しずつHadoop/Sparkシステム(俗に言うデータレイクシステム)単体だけでなく、Hadoopの構成管理の方にまで注目が移ってきてきています。前回の最後に上げたPivotal HD for Pivotal Cloud Foundryなどもそうですが、他にもHortonworks + Openstackとか(HortonworkもCloudFoundryの一員ですね)もあります。また私が紹介することなのか、って感じもしますが、巨人も少しずつ動きつつあります(

IBM Big SQL Benchmark vs. Cloudera Impala and Hortonworks Hive/Tez | Sheffield View , オマケでPivotal HAWQ vs Cloudera Impala も置いときます)。

 

 

Hadoop on docker 前編

後半書きました( Hadoop on docker 後編 - White scenery @showyou, hatena )

書き忘れていましたが、この記事

Spark, SQL on Hadoop etc. Advent Calendar 2014 - Qiita の23日目になります。

 

はじめはPivotal社の商用SQL on HadoopであるHAWQの話でもしようかと思いましたが、先日掲載したスライドに大体書いているので読んで頂ければと思います。
今回はHadoop on Dockerについてでも話します。

最近はHadoopを動かすのにdockerを使う動きが出ています。

dockerで組み上げるメリットとしては、
1. VMに比べると速度が速い(と考えられる)
2. 各社配布しているVMと違いDockerfile辺りを見れば何やってるか理解できる
3. imageを管理すれば独自カスタマイズしたノードを容易に複製できる
等のメリットがあります。

実際日本ではあまり話が出てこないですが、sequenceiq(*1)(*2)とかferry(*3)とかプロジェクトが出てきています。
(*1)http://blog.sequenceiq.com/blog/2014/04/04/hadoop-docker-introduction/
(*2)http://blog.sequenceiq.com/blog/2014/12/02/hadoop-2-6-0-docker/
(*3)http://ferry.opencore.io/en/latest/

もちろんベアメタルにガチガチで作るのに比べると速度は多少低下します。随時Hadoop基盤を置いて共有ストレージとして使ってる環境には向かないと考えています。ただし一時的に大規模な計算ノードが必要になった場合には威力を発揮するでしょう。

 

ここでは最近出たHadoop 2.6のイメージをビルドする話をしていきます。

まずdockerコンテナのソースを入手して、ビルドします。
ここでgitdirはgitのソースを置くリポジトリとします。別に任意の名前で構いません。

gitdir$ git clone https://github.com/sequenceiq/hadoop-docker.git
gitdir$ cd hadoop-docker
gitdir/hadoop-docker$ docker build -t showyou/hadoop-docker:2.6.0 .

$ docker build -t showyou/hadoop-docker:2.6.0 .
Uploading context 214 kB
Uploading context
Step 0 : FROM sequenceiq/pam:centos-6.5
Pulling repository sequenceiq/pam
7b5528f018cf: Download complete
89b52f216c6c: Download complete
0dd5f7a357f5: Download complete
ae2537991743: Download complete
b38f87063c35: Download complete
36bf8ea12ad2: Download complete
c605a0ffb1d4: Download complete
0bd9464ce7fd: Download complete
---> 7b5528f018cf
Step 1 : MAINTAINER SequenceIQ
---> Using cache
---> 461f4086bb21
Step 2 : USER root
---> Running in fd63870d472f
---> e8c116080601
Step 3 : RUN yum install -y curl which tar sudo openssh-server openssh-clients rsync
---> Running in aab6affb5030
Loaded plugins: fastestmirror, keys, protect-packages, protectbase
Determining fastest mirrors
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
0 packages excluded due to repository protections
Setting up Install Process
Package 2:tar-1.23-11.el6.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package curl.x86_64 0:7.19.7-37.el6_4 will be updated
(以下省略)

勝手にrpmとか落としてインストールしてくれます。中で何やってるかはDockerfileを見て貰えればわかるかと。

また、次のコマンドでhadoop コンテナを立ち上げます。

docker run -i -t showyou/hadoop-docker:2.6.0 /etc/bootstrap.sh -bash
/hadoop-docker$ docker run -i -t showyou/hadoop-docker:2.6.0 /etc/bootstrap.sh -bash

Starting sshd: [ OK ]
Starting namenodes on [2e6612174160]
2e6612174160: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-2e6612174160.out
localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-2e6612174160.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-root-secondarynamenode-2e6612174160.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn--resourcemanager-2e6612174160.out
localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-2e6612174160.out
bash-4.1#

更にHadoopのサンプルjarファイルを実行して動かしてみます。

bash-4.1# cd $HADOOP_PREFIX
bash-4.1# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
14/12/20 18:26:04 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
14/12/20 18:26:04 WARN mapreduce.JobSubmitter: No job jar file set. User classes may not be found. See Job or Job#setJar(String).
14/12/20 18:26:04 INFO input.FileInputFormat: Total input paths to process : 31
14/12/20 18:26:05 INFO mapreduce.JobSubmitter: number of splits:31
14/12/20 18:26:05 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1419117382790_0001
14/12/20 18:26:05 INFO mapred.YARNRunner: Job jar is not present. Not adding any jar to the list of resources.
14/12/20 18:26:05 INFO impl.YarnClientImpl: Submitted application application_1419117382790_0001
14/12/20 18:26:06 INFO mapreduce.Job: The url to track the job: http://2e6612174160:8088/proxy/application_1419117382790_0001/
14/12/20 18:26:06 INFO mapreduce.Job: Running job: job_1419117382790_0001
14/12/20 18:26:11 INFO mapreduce.Job: Job job_1419117382790_0001 running in uber mode : false
14/12/20 18:26:11 INFO mapreduce.Job: map 0% reduce 0%
14/12/20 18:26:18 INFO mapreduce.Job: map 10% reduce 0%
...

bash-4.1# bin/hdfs dfs -cat output/*
6 dfs.audit.logger
4 dfs.class
3 dfs.server.namenode.
2 dfs.period
2 dfs.audit.log.maxfilesize
2 dfs.audit.log.maxbackupindex
1 dfsmetrics.log
1 dfsadmin
1 dfs.servers
1 dfs.replication
1 dfs.file

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 4 100
Number of Maps = 4
Samples per Map = 100
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Starting Job
14/12/20 18:30:43 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
14/12/20 18:30:43 INFO input.FileInputFormat: Total input paths to process : 4
(中略)
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=472
File Output Format Counters
Bytes Written=97
Job Finished in 16.146 seconds
Estimated value of Pi is 3.17000000000000000000

ctrl+Dとかでbashを抜けるとcontainerも自動的に止まります。戻る場合はdocker ps -aしてdocker start <ID>でも実行してください。

containerを消したくなったら、

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e6612174160 showyou/hadoop-docker:2.6.0 /etc/bootstrap.sh -b 47 minutes ago Exited (0) 18 seconds ago compassionate_bohr
...
$ docker rm 2e6612174160

で消えます。

 

次にferryを使ってみます。
なんか2014/12/23時点のferryはdockerの1.2.0以降が必要で、Ubuntu 14.04だとアウトなのでdocker社の最新入れます。https://docs.docker.com/installation/ubuntulinux/の「Docker-maintained Package Installation」に書かれてるものを実行してください。

ferryはpythonのパッケージ管理システムpipをインストールしておく必要があります。
sudo apt-get install python-pip(Ubuntu)なりsudo yum install python-pip(CentOS)なり実行しておいてください。Ubuntu14.04のpipはバグがあった気もするので、その場合はeasy_install経由で入れてみてください。
まずferryを入れます。

$ sudo pip install -U ferry
$ sudo ferry install
$ sudo ferry server

いろいろdocker イメージを落としてくるので容量を食うので注意して下さい。


インストールし終えたら、セットアップ用のyamlを作ります。

backend:
- storage:
personality: "hadoop"
instances: 2
layers:
- "hive"connectors:
- personality: "hadoop-client"

これで
$ ferry start hadoop
とやるとhadoopクラスタが起動するはずです。"はず"って書いてるのは手元の環境では"com error, trying again..."とか出ている為です。

 

今回は他のところにあるdockerイメージをビルドして使うのにとどまりました。
後半は初めに使ったsequenceiq/hadoop-dockerをいじって、2nodeにインストールすることを考えます。
ここでは
1. Namenode / Resourcemanager
2. Datanode / Nodemanager
くらいに分けます。
この構成で2のイメージを複数箇所でボンボン立てれば、性能はともかく大量のHadoopノードを作ることができます。NamenodeHA化しろよって感じですが、それは省くんで誰かやってください。

 

また、この辺りを作るのもダルい、Hadoopを社内サービス化として管理できないか? ・・といった話に対しては、Pivotal Cloud Foundry + Pivotal HD on PCFをお使いください(宣伝)。

Cloud Foundry Foundationが設立されました

40社あまりが創立に参加しCloud Foundry Foundationを立ち上げ…Linuxからも積極賛助へ - TechCrunch

Cloud Foundryっていう、乱暴に言ってしまうとHerokuみたいなのを自社環境に立てられるツールがあります。元々vmware->Pivotal社で作っていて、それをOSSにしてIBM(Bluemix), HP, SAP, NTT(Cloudn),楽天(RPaaS), docker等が参画していました。それが今回のFoundation立ち上げにより、

  1. Linux Foundationから支援
  2. 東芝富士通、Hortonworks等の参入

が表明されました。

2ですが、日本でもかなりインパクトが大きいでしょう。憶測ベースになりますが、東芝富士通はご存知大手電機メーカーですが、彼らもPaaSを中心にして新しい開発体制を築いていくのでしょう。HortonworksはHadoopのオープン部分を作っている最も重要な会社の一つで(http://d.hatena.ne.jp/hamano3/20131218)、YahooのHadoop開発部隊が独立して作った会社です*1

来年のPaaSは今年よりも大幅に盛り上がって行きそうです。