Home > 日記 > 日記2012後期 Archive

日記2012後期 Archive

Hadoop関連のきゃわいいマスコット達

Hadoopアドベントカレンダー2012の15日目の記事を書かせていただきます。
HiveServerの事を書こうと思ったのですが、ゆるふわエントリに変更してHadoop関連のロゴについて書きたいと思います。

Hadoopのロゴはまぁお察しの通りキモイきゃわわな象さんなわけですが、ちょっとグッズを作ろうと思った事もありHadoop関連の正式ロゴとボツ案のロゴなどを集めましたので紹介します。

Hadoop

elephant_rgb.jpg

これが基本形で、以下のように各コンポーネント毎にサイト用のロゴがあります。
http://svn.apache.org/repos/asf/hadoop/logos/
https://issues.apache.org/jira/browse/HADOOP-7480

hadoop.png

smallCore+elephant_cmyk.gifcommon-logo.jpghdfs-logo.jpgmapreduce-logo.jpg

HadoopのPowered By

powered by用のものです。こちらはApacheの羽有りのものでちょっといろいろと制約があります。(詳しい事はわからないけど)
https://issues.apache.org/jira/browse/HADOOP-7020

pbh-64-logos.png

Hadoop Security

1枚目のやつはHairongさんの娘が描いたそうです。
https://issues.apache.org/jira/browse/HADOOP-6721

hadoop-helmet.jpghadoop-security-logo.jpg

JobTracker

JobTrackerにもロゴがあります。・・なんで?
https://issues.apache.org/jira/browse/MAPREDUCE-484

jobtracker.png

Hive

次はみんな大好きHiveのロゴです。Hiveのキモさ可愛さは一際目立っております。
https://issues.apache.org/jira/browse/HIVE-422
https://issues.apache.org/jira/browse/MAPREDUCE-484

hive.png

こちらはAIファイルがあります。

Pig

分かりづらいエラーメッセージに定評のあるPIGです。
https://issues.apache.org/jira/browse/PIG-155

080224_logo_pig_01_rgb.jpg

「This pig looks a bit too lazy!!! I want something hardcore!!!」(ゆるキャラすぎんだろ。もっと硬派なやつをキボンヌ)
「No it is not lazy, just relaxed, since it was so super fast done with all the map reduce development and calculation. Much faster than the elephant itself.」

とかいうやりとりが。いや、ゆるキャラでもねーだろとか思うんですが、海外のセンスはわからん。

そしてなぜかCLOSEされた後にこっそりと添付されてた。↓

pig.png

きゃわわ!!

まぁ最終的にコレなんですがね(^^;

pig_medium.png

ないわー(゜Д゜;)

ちなみに、こちらはラスタ画像しかないのでVectorイメージが必要ですってTicketがあります。
https://issues.apache.org/jira/browse/PIG-2323

Mahout

Mahout使えば簡単にできるよねとか言った人出てきなさい。先生怒らないけど椅子ぶつけます。
https://issues.apache.org/jira/browse/MAHOUT-57
https://issues.apache.org/jira/browse/MAHOUT-335

最初のロゴは以下のようです。

Mahout-logo-164x200.png

今はこっちですね。良いですね!!

mahout-logo-200.png

mahoutはSVGファイルがあります。

ZooKeeper

スケッチがあったので載せておきます。
https://issues.apache.org/jira/browse/ZOOKEEPER-69

zookeeper-sketch.jpg

これが、こうなりました。

zk_logo_use.pngzk_logo_use2.png

衣服のせいでもうウホッの人にしか見えない。

Chukwa

すいません。チケットみつけられませんでした。ロゴだけ載せておきます。

chukwa_logo_small.jpg

HBase

暴れん坊将軍と定評があるHBase。
この前のカンファレンスのOKWaveのHBase発表、かなり手なずけてましたよね・・。すごい。
https://issues.apache.org/jira/browse/HBASE-4312
https://issues.apache.org/jira/browse/HBASE-5115
https://issues.apache.org/jira/browse/HBASE-4920

01.jpg

hbase.jpg

マスコットはこちら。すっごいいっぱいあります。まだ決まってないのかな?

apache_logo_Proof_8.jpgapache_hbase_ orca_logo_Proof 3.jpgplus_orca.png

HBase_Orca _Logo.jpg

オルカ推しです(他にも沢山あるのですが、貼るのがめんどくさくなってきました・・)。

なぜかタコもありました。こちらは参考資料なのかな?

krake2l14x.jpgkrake-copy.jpgKrake-online-b.jpg

Hama

知ってる人、あまり居なそう。「a Bulk Synchronous Parallel computing framework on top of Hadoop」れっきとしたHadoop関連プロジェクトです。Hadoopの公式サイトからRelated Projectsのメニューにもきちんと書いてあります。
https://issues.apache.org/jira/browse/HAMA-8
https://issues.apache.org/jira/browse/HAMA-43

最初のドラフトです。レベル高い!!!

hama_draft_1.jpg

色が付いて現在のロゴになっています。クォリティ高い!!

hama_paint_logo.png

ちなみに、これはなんぞ?

hama_1.JPG

Giraph

Giraph。この前初めて聞いたって呟いたらつけ麺おじさんにDisられそうになっt
https://issues.apache.org/jira/browse/GIRAPH-4

これが今のロゴなのかな?

transparent-giraph-icon.png

こんなのもありました。

3rd Giraph Logo.pngGiraph Logo v3 copy.jpg

Hadoop-Ruby

どこ発祥なのかわかりません・・。Clouderaのページで見つけました。
http://blog.cloudera.com/blog/2011/01/map-reduce-with-ruby-using-apache-hadoop/

hadoop-ruby.png

その他

http://gigaom.com/cloud/my-hadoop-is-bigger-than-yours/

img-myhadoop-bigger4.jpg

「ワシの象さんは貴様のより大きいぞ!」 

シモネタじゃねーかっ!

 

Huahin

fig_logo_huahin_small.png

Impala

http://blog.father.gedow.net/2012/11/27/cloudera-impala-presentation/

ImpalaQL.png

嘘です。ごめんなさい。

HadoopとHiveに関してはベクターデータがあるのですが、他は見つかりませんでした。

AvroとCassandraは今回調べてません。BigtopもJIRAを検索してみましたが関連チケットはありませんでした。

あれ・・そーいえば ヒィーヒィーと汗かいている象がありませんね・・。あれってどこにあるのでしょう。。

ClouderaManagerに間違ったホストを登録した場合の対処法

ClouderaManagerで2つのバージョン(CDH3, CDH4)のクラスタを認識させようと作業していたのですが、FREE版ではマルチクラスタの管理はサポートしていないようです。

というわけで、ClouderaManagerを別々にインストールして、1クラスタ=1ClouderaManagerという感じにしようと思ったのですが、最初のManagerに認識させたホストを消せなくてちょっと四苦八苦してました。図にすると以下のような感じです。

最初の状態。

この状態から以下のようにしようとしてた。

でも、FREE版はマルチクラスタをサポートしていないっぽい。ので、以下のようにしようとして、Manager1からCDH4用に追加したHostB群を削除しようとした。

 

ClouderaManagerに登録したホストを削除する時は、以下の画面で削除したいホストにチェックを入れて「削除」をすれば良いのですが、すぐに復活してきます。以下の画面は赤枠のtamsvr5[1-5]vmが最初に入れたホスト(CDH3)、緑枠のtamsvr6[1-5]vmは違うCDHのバージョンを入れて別クラスタとして認識させようとしたホスト(CDH4)です。

消しても消しても復活してくるのは、各ホストで動いているClouderaManagerのAgentがHeartBeatを送っているからです。これを止めないと、別のホストでClouderaManagerを入れてtamsvr6[1-5]vmのホストを追加しても、ホストインスペクタが失敗します。
実際、tamsvr61vmにClouderaManagerを入れてtamsvr6[1-5]vmを追加しましたが、失敗しました。

なので以下の手順を行う必要があります。

1. 各ホストで動いているAgentを止める。

ssh root@tamsvr61vm /etc/rc.d/init.d/cloudera-scm-agent stop
ssh root@tamsvr62vm /etc/rc.d/init.d/cloudera-scm-agent stop
ssh root@tamsvr63vm /etc/rc.d/init.d/cloudera-scm-agent stop
ssh root@tamsvr64vm /etc/rc.d/init.d/cloudera-scm-agent stop
ssh root@tamsvr65vm /etc/rc.d/init.d/cloudera-scm-agent stop

2. ClouderaManager(上記の画面)から削除する。

これでひとまず消えます。ただし、再度Agentを動かすと復活してきます。

3. 新しいClouderaManagerからホストを追加する。

これで成功します。

きちんと別々に認識されました。

 

 

こんな事やってる人、誰も居ないと思いますが・・(´・ω・`)

 

RealtimeViewerを作ったらREADMEを書くのがとても捗る件について

READMEを書くときはMarkdown形式で書くと思うのですが、四六時中その記法で書いているわけでは無いので、なかなか覚えられないわけです。Rubyの場合はRDoc形式で書くのが普通なのかな?まぁWikiにしろ何にしろ似たような記法増えすぎだと思うのです。

わたしのようなゆとりには、プレビューしながら確認できるととても幸せになれます。とは言っても、ブラウザ上で入力なんてしたくないし、自分のお気に入りのエディタを使いたいわけです。

こちらの記事にあるツールを使っていたのですが、どうも自分の環境ではファイルを保存しなおすと、高確率でreadでこけるようで・・。

というわけで(上記ツールを参考にして)自分で作ってみました。

 

 

Continue reading

Apacheのサンプルログを生成し続けるスクリプトをRubyGemsに登録してみた

こちらの記事で書いた、Apacheのログを生成し続けるスクリプトをRubyGemsに登録してみました。

なので、今後は

gem install apache-loggen

とインストールするだけで、

apache-loggen

というコマンドが使えるようになります。使い方は今までと同じです。(以下のような感じです) 

apache-loggen [--rate=0] [--limit=0] [--rotate=0] [--progress] [--json] [outfile]
  --rate     毎秒何レコード生成するかの指定。0以下は制限無し。
  --limit    最大何件出力するか。0以下は延々と出力し続ける。
  --rotate   ローテーションの間隔。単位は秒指定。0以下はローテーションしない。
  --progress STDERRに経過情報を出力する
  --json     apacheのログ形式ではなくJSON形式で出力する

  outfile    指定するとファイルに出力します。省略するとSTDOUTに出力します。

毎秒10件をaccess.logに出力。60秒毎にローテーション。経過をSTDERRに表示。

apache-loggen --rate=10 --rotate=60 --progress access.log

また、この機構を使って独自のログ形式を出力できるようにしました。 以下のように使います。

require 'apache-loggen/base'
LogGenerator.generate(conf=nil, gen_obj=nil, &block)

confはnilを渡すとARGVの内容をパースします。プログラムで直接指定する場合は、Hashを渡す事でデフォルトの設定を上書きする事ができます。実際にログを出力する処理は、gen_objにLogGenerator::Baseを継承しgenerate(context, config)メソッドを定義したクラスのインスタンスを渡すか、ブロックを与えます。両方指定した場合は、gen_objが先に実行され、blockが評価されます。(blockではgen_objで出力したrecordを受け取る事ができます)

いくつかサンプルを置いておきます。

独自のログ形式を出力したい場合。

require 'apache-loggen/base'
class MyGen < LogGenerator::Base
  def generate(context, config)
    return "#{Time.now.to_s} #{context.inspect}\n"
  end
end
LogGenerator.generate(nil, MyGen.new)

もしくは

require 'apache-loggen/base'
LogGenerator.generate do | context, config, record |
  "#{Time.now.to_s} #{context.inspect}\n"
end

上記の2つは同じ処理です。

Apacheログに新しく情報を追加したい場合。

require 'apache-loggen/base'
class MyGen < LogGenerator::Apache
  # オリジナル実装はhashをJSONか1行の文字列にしているが
  # 今回はそれに情報を追加する
  def format(record, config)
    record["process_time"] = grand(1000000) + 1000
    if config[:json] then
      return record.to_json + "\n"
    else
      return %[#{record['host']} - #{record['user']} [#{Time.now.strftime('%d/%b/%Y:%H:%M:%S %z')}] "#{record['method']} #{record['path']} HTTP/1.1" #{record['code']} #{record['size']} "#{record['referer']}" "#{record['agent']}" #{record['process_time']}\n]
    end
  end
end
LogGenerator.generate(nil, MyGen.new)

LogGenerator::ApacheはLogGenerator::Baseを継承しており、generateの中でformatを呼び出しています。このformatの実装が、1行分のレコードをhashとしてうけとりJSONか1行の文字列に変換するという処理をしているので、これをOverrideするとApacheログの生成ロジックを使いつつ書式を変更する事ができます。

いくつかのサンプルはREADMEにも書いてあります。

(∩´∀`)∩

 

JavaのImageIOで読み込めないJPEGファイルがある

画像分類の学習モデルを作るツールをJavaで作っていたのですが、あるJPEGファイルをImageIOで読もうとすると以下のエラーが出ました。

Exception in thread "main" java.awt.color.CMMException: Invalid image format
    at sun.awt.color.CMM.checkStatus(CMM.java:131)
    at sun.awt.color.ICC_Transform.(ICC_Transform.java:89)
    at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:516)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(JPEGImageReader.java:1169)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1137)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:948)
    at javax.imageio.ImageIO.read(ImageIO.java:1422)
    at javax.imageio.ImageIO.read(ImageIO.java:1282)
    at Test.main(Test.java:31

JAIだと読み込めるというので、処理速度が落ちるけどそっちを使うようにしてみた。

BufferedImage img = null;
try {
    img = ImageIO.read(file);
} catch (java.awt.color.CMMException e) {
    img = JAI.create("fileload", file.getAbsolutePath()).getAsBufferedImage();
} catch (IOException e) {
    // ちゃんと処理しようね!
}

正しい使い方としては、JAIをきちんとセットアップしてImageIO経由で使えるようにし、ImageReaderを列挙して順番に試すというのが正統な方法なのかなと。今回は手抜き処理。

JAIだけでも良いんだけど、速度が・・。

参考サイト

 

Apacheのサンプルログを生成し続けるスクリプト

最新の記事はこちらです。

Fluentdのテストをする過程で欲しかったので、Apacheのログを生成し続けるスクリプトを書きました。

と言っても生成部分はTreasureDataのスクリプトを丸ぱくりで流量制限をするオプションを追加して延々と出力するようにしただけです。

frsyuki++。

手元でサクッとproductionで確認できる人はうらやましす。

使い方は以下のような感じです。詳細はREADMEを見てください。

ruby sample_apache_gen.rb [--rate=0] [--limit=0] [--rotate=0] [--progress] [--json] [outfile]
  --rate     毎秒何レコード生成するかの指定。0以下は制限無し。
  --limit    最大何件出力するか。0以下は延々と出力し続ける。
  --rotate   ローテーションの間隔。単位は秒指定。0以下はローテーションしない。
  --progress STDERRに経過情報を出力する
  --json     apacheのログ形式ではなくJSON形式で出力する

  outfile    指定するとファイルに出力します。省略するとSTDOUTに出力します。

ローテーションについては以下のルールでローテーションします。

  hoge.log --> hoge.[yyyy-MM-dd_HHmmss].log

例えば、こんな感じで使います。
毎秒10件をaccess.logに出力。60秒毎にローテーション。経過をSTDERRに表示。

ruby sample_apache_gen.rb --rate=10 --rotate=60 --progress access.log

普通はクラス化して、出力内容を決める部分をBlockで渡すようにして再利用性を高めると思うのですが、ごにょごにょ(´・ω・`)

ソースはここに置いておきます。
https://github.com/tamtam180/apache_log_gen 

これでWeb屋じゃなくてもそれっぽいログが出来るのでFluentdで遊べますね(∩´∀`)∩

FluentdをWindowsで動かそうとして挫折しなかった記録。その1

WindowsでFluentdを動かそうとして調べていった記録のメモです。
きちんとまとめていないので起こった順に書いています。

同じような事を試みて挫折した人が居たので、この意思を勝手に引き継いで3秒以上頑張ってみました。

概要としては、fluentdのRuby実装Python実装(fluenpy)、fluent-agent-liteのPerl実装F#実装を確認した事と、Windowsでのファイル処理の排他制御について分かったことをまとめています。Windowsのファイルについては別の記事でまとめる事にして、この記事では簡単に触れる程度にします。

Continue reading

Mecabのdefファイル調整メモ

Mecab/IPA辞書を使って記号を食わせると、記号(&とか)がサ変接続と認識されます。

$ echo "P&!G" |  mecab
P    名詞,固有名詞,組織,*,*,*,*
&!   名詞,サ変接続,*,*,*,*,*
G    名詞,固有名詞,組織,*,*,*,*
EOS

なんでこうなるかと言うと、char.defとunk.defの設定でそうなっているからです。
(ところで、unknownの略のunkってなんて読むんと良いんでしょうね。うんこ?(´・ω・`))

char.defでは以下のように記述されています。 SYMBOLのINVOKEが1になっているので、常にunknown wordとして扱われます。そしてGROUPが1なので、同じ種別でまとめられます。

SYMBOL         1 1 0
# ASCII
0x0021..0x002F SYMBOL
0x0030..0x0039 NUMERIC
0x003A..0x0040 SYMBOL
0x0041..0x005A ALPHA
0x005B..0x0060 SYMBOL
0x0061..0x007A ALPHA
0x007B..0x007E SYMBOL

unk.defでは以下のように記述されています。

SYMBOL,1283,1283,17585,名詞,サ変接続,*,*,*,*,*

このunk.defを以下のように書き換えます。

SYMBOL,1283,1283,17585,記号,一般,*,*,*,*,*

これで以下の出力に変わります。 

$ echo 'P&!G' | mecab
P   名詞,固有名詞,組織,*,*,*,*
&!  記号,一般,*,*,*,*,*
G   名詞,固有名詞,組織,*,*,*,*
EOS

一応、記号一般になりましたが。が、どうせなら半角ASCII文字は全部繋げてほしいなーとか思ったり、固有名詞・組織?えぇーとか思ったり、思わなかったりするわけです。というわけで、もうちょっといじくってみます。

char.defを以下のようにします。ASCIIという区分を作って細かく分類していた部分をならしてしまいます。 文字コード0x0021 - 0x007Eの連続文字は問答無用でひとくくりにしてASCIIとする設定です。

ASCII          1 1 0
# ASCII
#0x0021..0x002F SYMBOL
#0x0030..0x0039 NUMERIC
#0x003A..0x0040 SYMBOL
#0x0041..0x005A ALPHA
#0x005B..0x0060 SYMBOL
#0x0061..0x007A ALPHA
#0x007B..0x007E SYMBOL
0x0021..0x007E ASCII

unk.defに以下を追加します。 ひとくくりにしたASCIIを名詞・一般にする設定です。 コスト値は1,1と優先度が一番高くなるようにします。

ASCII,1,1,0,名詞,一般,*,*,*,*,*

再度実行してみます。(あ、辞書はビルドしなおす必要があります)

$ echo 'P&!G' |  ../../bin/mecab
P&!G    名詞,一般,*,*,*,*,*
EOS

$ echo 'xxx-yyy' |  ../../bin/mecab
xxx-yyy 名詞,一般,*,*,*,*,*
EOS

こんな感じで調整する事ができますという紹介でした。
詳細は作者様のページにありますので、そちらを参照するのが良いと思います。

Home > 日記 > 日記2012後期 Archive

Search
Feeds

Return to page top