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<LongWritable, Text, Text, IntWritable> {
  public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter)       
    throws IOException {
  }
}
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
  public void reduce(Text key, Iterator<Intwritable> values, OutputCollector>Text, IntWritable< 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のせいかと思い無効化してみるけどやはりダメ。
マスタサーバ内にスレーブを立ち上げは繋がる。

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

あけまして

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