2010年8月13日金曜日

Cassandra GUI 0.1 released.

Cassandra GUI の0.1をリリースしました。
リリースした機能(以前のものも含みます)は、

・基本情報(コンフィグ情報)の表示
・カラムファミリに対しての追加、更新、削除(スーパーカラム含む)
・カラムファミリに対してのキー検索、レンジ検索、ロー表示

0.1.1の予定は

・表示系の修正
・ISSUE対応
・インポート
・エクスポート(データ量を考えるとボツの可能性大)

です。

2010年6月29日火曜日

第3回Hadoopソースコードリーディング Hadoop MR + Cassandra のスライド #hadoopreading

昨日使ったスライドをアップしました。

若干修正しました。
失念していたissueのところの追加とデモで使用した、
GUIの公開先を追加しました。

2010年6月16日水曜日

第2回 AWS User Group - Japan 勉強会のスライド #jawsug

第2回 AWS User Group - Japan 勉強会のスライドをアップしました。


スライドをアップするまでが勉強会です。
と、誰かが言ってたか知りませんが。

2010年6月8日火曜日

#cassandra-gui on google code

自分のデータ確認用として使っていたものをGoogle codeにあげました。

Cassandra GUI Project

現状データの確認しか必要なかったので参照しか作ってないのと
細かいバグはありますが。

値の更新とか一括追加とかも自分でも欲しいのでその内追加します。

2010年5月28日金曜日

Hadoop第2回ソースコードリーディングのスライド

昨日のスライドを上げました。



修正したい気もするがメンドクサイのでもういいw
ってか、ソースも張らないとなんのこっちゃって感じもしますが。
手元のソースご覧くださいってことで。

2010年3月30日火曜日

EC2 Elastic Load BalancingのプライベートIPアドレスが変わる件 続

前回のEC2 Elastic Load BalancingのプライベートIPアドレスが変わる件で解決した。

えがったえがった

って思ってたら落とし穴が...

よくよく見たらSSLが全滅じゃん。
SSLは全部ELBのアドレスになってる。

でっ、フォーラムたどってみると...

Discussion Forumsの「Thread: Elastic Load Balancing Client IP?」に

The short answer is "you can't". 

The long answer: 
HTTPS traffic is regular HTTP traffic encrypted using SSL and sent over TCP port 443.
It is not possible to insert HTTP headers into HTTPS packets without decrypting the packets.
Normally only the two endpoints can decrypt the packets.
This can be accomplished in a load-balancing setup if the load balancer
supports "SSL offloading" (also known as SSL acceleration).
But ELB does not support SSL offloading. 

だってさ...orz
いつ、対応してくれるんだよ。

あきらめて自分で立てるしかないのかなぁ。
じゃあ、AutoScalingどうするんだって話だよ。

2010年3月24日水曜日

EC2 Elastic Load BalancingのプライベートIPアドレスが変わる件

アクセスログの解析にリモートホストも使っているのだけれど
ある時からElastic Load BalancingのプライベートIPアドレス
が変わっていたのでmod_rpafに設定したIPアドレスが無効になり
アクセスログが全て同じIPアドレス(ELBのアドレス)に
なっていた... orz

mod_rpafはIPアドレスをビットでは指定できないし...
どうしたもんかと now loading...

もう、mod_rpaf書き換えちまえYO!
ってことで以下のようにした。

mod_rpaf-2.0.cの142行目辺りの
if (strcmp(remote_ip, list[i]) == 0)

if (strncmp(remote_ip, list[i], strlen(list[i])) == 0)
として

rpaf.confのRPAFproxy_ipsを
RPAFproxy_ips 10.

としてAクラスから来たものは強制的に。
もっと、他の方法があるんじゃないかと思ったけど
思い浮かばないし、誰か同じことで悩んでる方ご助言を。

あっ、一応上記でも動いてます。

EC2 Elastic Load Balancing設定

久しぶりにやって忘れたので残しとく。

ロードバランサの作成
# elb-create-lb test-lb --headers --listener "lb-port=80,instance-port=80,protocol=http" --listener "lb-port=443,instance-port=443,protocol=tcp" --availability-zones us-east-1b

ロードバランサにインスタンス登録
# elb-register-instances-with-lb test-lb --instances i-AAAAAAAA

ロードバランサ確認
# elb-describe-lbs


基本elb系のコマンドで。

2010年3月10日水曜日

EC2 AutoScaling(自動スケーリング設定)

EC2を自動スケーリングするように設定した。
てっきり、CloudWatchでモニタリングして自分でインスタンス立ち上げて
ロードバランサに割り当てるもんだと思ってたがAutoScaling設定しとけば
勝手にやってくれるのね。

ってことで、以下のような感じで。

コンフィグ設定
サンプルパラメータは名前 AMI名 AMIのタイプ
# as-create-launch-config test-lc --image-id ami-TEST --instance-type m1.large

スケーリンググループ作成
サンプルパラメータは名前 コンフィグ名 ゾーン 最小構成 最大構成 ロードバランサ名
ロードバランサに割り当てる場合は--load-balancersを指定する。
(ロードバランサは事前に作成しておく)
# as-create-auto-scaling-group test-sgroup --launch-configuration test-lc --availability-zones us-east-1b --min-size 1 --max-size 5 --load-balancers test-lb

トリガ設定
サンプルパラメータは名前 スケーリンググループ名 モニタリング項目 閾値の項目 モニタリングの設定 モニタリング間隔 閾値を下回った場合のスケール 閾値を上回った場合のスケール 閾値を越えた場合の実行秒
# as-create-or-update-trigger test-trigger --auto-scaling-group test-sgroup --measure CPUUtilization --statistic Average --dimensions "AutoScalingGroupName=test-sgroup" --period 60 --lower-threshold 20 --upper-threshold 80 --lower-breach-increment=-1 --upper-breach-increment 1 --breach-duration 120


その他確認コマンドは

コンフィグ設定の確認
# as-describe-launch-configs

スケーリンググループの確認
# as-describe-auto-scaling-groups

トリガの確認
パラメータにスケーリンググループ名
# as-describe-triggers test-sgroup

細かいマニュアルは --help で。

2010年3月6日土曜日

また本買ってもうた

いや、存在は知ってたけどなんか買う気がおきず
立ち読みしたら気になったもので。。。

2010年2月28日日曜日

本いろいろ

久しぶりにまとめて本を買った。

1冊目はデブサミで@yoshioriが紹介していて
おもしろそうだと思い即購入。



2冊目はtwitterでも結構話が出ていて第2版になっていたので購入。




しばらくは電車で暇を持て余さなくて済みそうだ。。。

2010年2月9日火曜日

MapReduceのテスト

MapReduceのテストはHadopp本にはMockitoを使う良いあるよと書いております。
でも、やはり0.19.xが前提なので情報が古い。
ってことで、0.20.xで以下のような感じで書いてみた。



package example.test;

import java.util.Arrays;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;

import static org.mockito.Mockito.*;

import junit.framework.TestCase;

public class CountTest extends TestCase {
    @SuppressWarnings("unchecked")
    public void testMapLongWritableTextContext() {
        // Mapのテスト
        Map map = new Map();
        Mapper.Context map_context = mock(Mapper.Context.class);

        Text value = null;
        try {
            value = new Text("test1");
            map.map(null, value, map_context);
            verify(map_context, times(1)).write(new Text("test1"), new LongWritable(1));

            value = new Text("test2");
            map.map(null, value, map_context);
            verify(map_context, times(0)).write(new Text("test1"), new LongWritable(0));
        } catch (Exception e) {
            fail(e.getMessage());
        }


        // Reduceのテスト
        Reduce reduce = new Reduce();
        Reducer.Context red_context = mock(Reducer.Context.class);

        Text key = null;
        Iterable<longwritable> values;
        try {
            key = new Text("test1");
            values = Arrays.asList(new LongWritable(2));
            reduce.reduce(key, values, red_context);
            verify(red_context, times(1)).write(new Text("test1"), new LongWritable(2));

            key = new Text("test2");
            values = Arrays.asList(new LongWritable(2), new LongWritable(2));
            reduce.reduce(key, values, red_context);
            verify(red_context, times(1)).write(new Text("test2"), new LongWritable(4));
        } catch (Exception e) {
            fail(e.getMessage());
        }
    }
}

2010年2月2日火曜日

HDFSへの書き込み/読み込み方法

下記のような感じで。

Configuration conf = new Configuration();
// ユーザを指定する場合
conf.set(UnixUserGroupInformation.UGI_PROPERTY_NAME, "hoge,supergroup");
FileSystem fs = FileSystem.get(new URI("hdfs://hoge:9000/"), conf);

// ディレクトリの作成など
try {
  fs.getFileStatus(new Path("hoge"));
} catch (FileNotFoundException e) {
  fs.mkdirs(new Path("hoge"));
}

// ファイルへの出力
// ex. 最後のフラグは上書き
FSDataOutputStream dos = fs.create(new Path("hoge/hoge.txt"), true);
dos.writeChars("テスト\n");
dos.close();

みたいに。

2010年1月28日木曜日

Scotch make方法

かなりハマッたので残しとく。

グラフ分割で検索するとたいていMETISが出てくる。

最新のgcc(現時点使用で4.4.1)でコンパイルするとシグナル系で
コンパイル通らないのとライセンスがなんかわかりづらくLICENSE.txtとFAQで
言ってることが違ってる感じ。
原則二次配布はダメみたいなんけどよくわからんからミネソタ大学に
問い合わせたほうが早いってことでめんどくさいし断念。
開発も2007年で止まってるしね。

最近(?)の流れとして完璧フリーなScotchに流れてるみたい。
こちらの最新は5.1.7で最新は2009年の9月だしね。

でっ、make方法。

ここから最新のソースをダウンロード。

解答後、基本はINSTALL.txtのとおり。
srcに移動後

$ ln -s Make.inc/Makefile.inc.xxxx_xxx_xxx Makefile.inc
もしくは
$ cp Make.inc/Makefile.inc.xxxx_xxx_xxx Makefile.inc

xxxx_xxx_xxxは環境に合わせて。
Linuxだったら、

Makefile.inc.x86-64_pc_linux2_icc

で、OKかと。
Makefile.inc.x86-64_pc_linux2_iccはicc用なのでgcc用に編集。
ここでハマッた orz

Scotch自体がC99に準じて開発されているのでiccをgccに変更だけではコンパイルが通らない。

#CCS    = icc -O3 -fp-model fast
CCS     = gcc -O3 -std=c99

で、いくかと思ったらこれが罠だった...

#CCS    = icc -O3 -fp-model fast
CCS     = gcc -O3 -std=gnu99

で、GNU仕様にしないとダメみたい。

あとは環境によってフラグの追加。
64bit環境なので

-DLONG

を追加。32bitとか他に何にもいらないなら素のままでOKかと。
以上で
$ make

で通ります。

しかし、改めて見たけど、C99で言語仕様、結構変わってまつのね。。。


追記。

どうやら、Makefile.incは

Makefile.inc.i686_pc_linux2

でも良いみたい。
あの苦労はなんだったんだ...
でも、まぁ、このままやってたら32bitでコンパイルされてるのも
気づかなかっただろうし良しとするか。

2010年1月27日水曜日

#ifdef #ifは使っちゃダメ とな

#ifdef #ifは使っちゃダメ

ちょっと探し物をしてて発見。
んじゃ、OS毎にソースを別けるのか?32bit/64bit使い分けもソース別けるのか?

コメントにあるとおり、使い方しだいと使う人のセンスの問題。
世の中のオープンソースのコミッタ全員にその理論を説いてあげてください。

と思いますた。

2010年1月21日木曜日

Amazon EC2 でAMI作成方法

久しぶりにやって忘れてたので。。

# ec2-bundle-vol -d /mnt --privatekey プライベートキー --cert 証明書 --user アカウント番号 --fstab /etc/fstab

# ec2-upload-bundle --bucket バケット名 --manifest image.manifest.xml --access-key アクセスキー --secret-key シークレットキー

追記。

上記はS3のアップまで上記、下記は実際の登録など。

下記、コマンドが変わっているので修正(--nameが必須になってます。)

# ec2-describe-images -o self // 現在のAMI確認
# ec2-deregister AMI名 // AMIの削除
# ec2-register S3のパス/image.manifest.xml // AMIの登録
# ec2-register S3のパス/image.manifest.xml --name AMI_NAME // AMIの登録

Hadoop MapReduce 0.19.* -> 0.20.*

Hadoopネタが続いてるが備忘録なので

MapReduce の0.19.*から0.20.*でかなり仕様が変わっている。

情報も少ないし、本家のチュートリアルも古いしでまったく使い物にならない。
ってことで、基本部分の変更箇所。

org.apache.hadoop.mapredで
使用していたものが
org.apache.hadoop.mapreduce

を使用するように変わっている。


public static class Map extends MapReduceBase implements Mapper&lt;LongWritable, Text, Text, IntWritable&gt; {
  public void map(LongWritable key, Text value, OutputCollector&lt;Text, IntWritable&gt; output, Reporter reporter)       
    throws IOException {
  }
}
public static class Reduce extends MapReduceBase implements Reducer&lt;Text, IntWritable, Text, IntWritable&gt; {
  public void reduce(Text key, Iterator&lt;Intwritable&gt; values, OutputCollector&gt;Text, IntWritable&lt; output, Reporter reporter)
    throws IOException {
  }
}

みたいにMapもReduceもインターフェースでやってたいところが

public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
  protected void map(LongWritable key, Text value, Context context)
    throws java.io.IOException ,InterruptedException {
  }
}
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
  protected void reduce(Text key, Iterable<intwritable> values, Context context)
    throws java.io.IOException ,InterruptedException {
  }
}

みたいに抽象クラスを使用するようになっている。
# 基本、上記の古いほうはDeprecatedになってる。

で、Jobもそのまま使用するようになっているのでだいたい、こんな感じに変更。



package example.hadoop;

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;

public class UserCount extends Configured implements Tool {
  public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    protected void map(LongWritable key, Text value, Context context)
      throws java.io.IOException ,InterruptedException {
      String[] s = value.toString().split(",");
      word.set(s[0]);
      context.write(word, one);
    }
  }

  public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();

    protected void reduce(Text key, Iterable<intwritable> values, Context context)
      throws java.io.IOException ,InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

  @Override
  public int run(String[] args) throws Exception {
    Job job = new Job(getConf(), "user count");
    job.setJarByClass(UserCount.class);

    job.setMapperClass(Map.class);
    job.setCombinerClass(Reduce.class);
    job.setReducerClass(Reduce.class);

    TextInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    return job.waitForCompletion(true) ? 0 : -1;
  }

  public static void main(String[] args) {
    status = ToolRunner.run(new UserCount(), args);
    System.exit(status);
  }
}

以上、備忘録。

2010年1月18日月曜日

Task process exit with nonzero status of 1.が出る件

エラーの出るサーバをスレーブからはずし起動するとこのエラーが出ない。
ということでOSの問題もあるなこりゃ。


どっかでインストールし直したほうが良いと。

2010年1月15日金曜日

HDFSでスレーブからマスタに接続できない件

たぶん解決。

なんのことはない、IPv6の接続がやっぱりネックになっていた。
hadoop-env.shのHADOOP_OPTSを

export HADOOP_OPTS="-server -Djava.net.preferIPv4Stack=true"

みたいにIPv4でに全てのマスタ/スレーブ設定すればおk。


# 追記
やっと起動したと思ってMapReduceを何回か実行すると

java.io.IOException: Task process exit with nonzero status of 1.
  at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:418)

が出る。ヽ(`Д´)ノ
コレか?

http://www.koopman.me/2009/04/hadoop-0183-could-not-create-the-java-virtual-machine/

2010年1月8日金曜日

Hadoopの

HDFSでスレーブからマスタに接続できない。

core-site.xmlの


  
    fs.default.name
    hdfs://localhost:9000
  


のvalueを

  hdfs://hoge:9000
  hdfs://hoge.example.jp:9000
  hdfs://0.0.0.0:9000

等、いろいろ試したが全てダメ。

ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to hoge/192.168.0.1:9000 failed on loc
al exception: java.net.SocketException: Network is unreachable

となりまふ。

Debian/Ubuntu間でやってるけどIPv6のせいかと思い無効化してみるけどやはりダメ。
マスタサーバ内にスレーブを立ち上げは繋がる。

何が原因なんだろうかと投稿し誰かの助け舟を待ってるみる。

あけまして

おめでとうございました。
来年もよろしくお願いしました。