2014年11月25日火曜日

Windows7にCDH5.1.3でHadoop・その2 HDInsightインストール編

というわけで,ここを参考にHDInsightでWindows7にHadoopを導入してみようとトライ.

まずは,HDInsight Previewsのページへ・・・行ってみるとすでに404.

嫌な予感をはらみつつ,Microsoft Web Platform Installerからの導入を目指す.
直接Microsoft Web Platform InstallerをDLすると,Microsoft Web Platform Installer5.0となっている.
説明のページが4.0だったので,バージョンが上がっている.

ここで,

  1. インストーラー(wpilauncher.exe)を実行
  2. Microsoft HDInsight for Windows Server Community Technology Previewを選択

というのが流れのはずなのだが,Microsoft HDInsight for Windows Server Community Technology Previewがない.
あるのは,Microsoft HDInsight Emulator for Windows Azureのみ.
for Windows Azureというあたりに駄目そうな予感を感じながら,とりあえずダウンロードしてみる.

やたら長いインストールが終わると,C:\直下に大量のディレクトリができる.
C直下は綺麗にしておきたい身としては,勝手にフォルダ作りまくっていらっとするけど,しょうがない.

C:\Azul
C:\hadoop
C:\HadoopInstallFiles
C:\hdp
C:\hdpdata

が作成されたようだ.
このうち,C:\hdpがHadoopの各種ライブラリがインストールされているフォルダとなる.
各種アプリがすでにインストールされているが,
C:\hdp\hadoop-2.4.0.2.1.3.0-1981以下にあるのがHadoop本体.
とりあえず,C:\hdp\hadoop-2.4.0.2.1.3.0-1981でコマンドプロンプトを開き,
C:\hdp\hadoop-2.4.0.2.1.3.0-1981>bin\hadoop version
Hadoop 2.4.0.2.1.3.0-1981
Subversion git@github.com:hortonworks/hadoop-monarch.git -r 3c481b5d3c117181c4be
3d3a25697e2e0574f972
Compiled by jenkins on 2014-07-15T14:23Z
Compiled with protoc 2.5.0
From source with checksum 8a8b83aa11aad760f2a019f4cea188c
This command was run using /C:/hdp/hadoop-2.4.0.2.1.3.0-1981/share/hadoop/common
/hadoop-common-2.4.0.2.1.3.0-1981.jar

というわけで,hadoopコマンドが動くことは確認.
さて,これをどうやってEclipseから呼び出すか,それが問題だ.

ちなみに,参考ページにはProgram Filesの問題からJAVA_HOMEをHDInsightでインストールした物にしないと駄目だ,と書いてあるが,特に問題なくインストール完了.
Microsoft Web Platform Installer5.0になって,改良されたのかしらん?


Windows7にCDH5.1.3でHadoop・その1失敗編

Hadoopプログラミングをする上で,いちいちサーバにjarを持って行ってテストをするのは大変すぎるので,Windows上のEclipseでHadoopプログラムをデバッグしていたんだけど,新しいHadoopをCDH5.1.3で入れたので,新しいバージョン.
以前の情報はこちら

インストール

まず,
https://ccp.cloudera.com/display/SUPPORT/CDH+Downloads
で,CDH5.1.3のtarを取得.
CDH5.1.3なのはサーバとバージョンを併せるため.

とりあえず,
hadoop-2.3.0-cdh5.1.3.tar.gz
をダウンロード.
Cygwinの/usr/local/libに展開.

$ cd /usr/local/lib
$ tar zxvf hadoop-2.3.0-cdh5.1.3.tar.gz
$ ln -s hadoop-2.3.0-cdh5.1.3 hadoop
$ ln -s /cygdrive/c/Program\ Files\ /Java/jdk1.7.0_60/ jdk1.7
$ ln -s jdk1.7 java

Windowsの環境変数にHADOOP_HOMEを追加. Pathも追加.
HADOOP_HOME:C:\usr\cygwin\usr\local\lib\hadoop
PATH:...;%HADOOP_HOME%\bin

hadoop/bin-mapreduce1/hadoop-config.shに以下を追記
# the root of the Hadoop installation
if [ -z "$HADOOP_HOME" ]; then
  export HADOOP_HOME=`dirname "$this"`/..
else
  export HADOOP_HOME=$(cygpath -u "$HADOOP_HOME")
fi
hadoopにも以下を追記.
#cygwin=false
cygwin=true
# some Java parameters
export JAVA_HOME=/usr/local/lib/java

Windowsではローカルモードでしか起動しないので,以下のように設定する.
etc/hadoop/core-site.xml
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>C:\tmp\hadoop</value>
    </property>
</configuration>
etc/hadoop/mapred-site.xml
<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>local</value>
    </property>
    <property>
         <name>dfs.replication</name>
         <value>1</value>
    </property>
</configuration>

Eclipseプラグイン

ここまで来て問題発生.
ここにあるとおり,プラグインの公式な物がHadoop2.x系では出ていないとのこと.
ということで,どうしようかと考えていたら.
Windows用HadoopHDInsightの記事を発見.
とりあえずこれを試してみることにする.
というところで,続きは次回.

2014年11月14日金曜日

人狼知能エージェントの作成・その5 Talk編

発話の生成

人狼知能ver0.1.x系では,コミュニケーションはかなり制限されています.
 話すことが出来るのは,

  1. カミングアウト
  2. 占い結果
  3. 霊媒結果
  4. 護衛先の報告
  5. 他人の職業の予想
  6. 他人の意見への同意
  7. 他人の意見への反対
  8. 投票先の宣言
  9. 襲撃先の宣言(人狼のみ)
  10. パス
の10種類となります.
そのため,それ以外の発話を行わないように,対話生成クラスを使って発話内容を作成することが推奨されています.
発話生成には,TemplateTalkFactoryを,人狼同士の囁きの生成には,TemplateWhisperFactoryを使います.
たとえば,占い師をカミングアウトしたい場合は,
String contents = TemplateTalkFactory.comingout(getMe(), Role.SEER);
// contents = "COMINGOUT Agent[00] SEER"
とします.
これによって,占い師であることや,霊媒師であることを宣言することが可能です.

以下,他のテンプレートによる発話の例を示します.
//カミングアウト
//「私は占い師です」
String comingout = TemplateTalkFactory.comingout(mySelf, Role.SEER);
// comingout = "COMINGOUT Agent[07] SEER"

//占い結果の報告
// 「targetは人狼だった」
String divine = TemplateTalkFactory.divined(target, Species.WEREWOLF);
// divine = "DIVINED Agent[01] WEREWOLF"

//霊媒結果の報告
//「targetは人間だった」
String inquest = TemplateTalkFactory.inquested(target, Species.HUMAN);
// inquest = "INQUESTED Agent[01] HUMAN"

//護衛先の報告
//「targetを護衛した」
String guard = TemplateTalkFactory.guarded(target);
// guard = "GUARDED Agent[01]"

//予想
//「targetは村人だと思う」
String estimate = TemplateTalkFactory.estimate(target, Role.VILLAGER);
// estimate = "ESTIMATE Agent[01] VILLAGER"

//投票先の宣言
//「targetに投票する」
String vote = TemplateTalkFactory.vote(target);
// vote = "VOTE Agent[01]"

//同意
//「1日目の発言001に賛成」
String agree = TemplateTalkFactory.agree(TalkType.TALK, 1, 1);
// agree = "AGREE TALK day1 ID:1"

//反対
//「4日目の発言020に反対」
String disagree = TemplateTalkFactory.disagree(TalkType.TALK, 4, 20);
// disagree = "DISAGREE TALK day4 ID:20"

//襲撃先の宣言(人狼のみ)  
//「targetを襲撃先にする」
String attack = TemplateWhisperFactory.attack(target);
// attack = "ATTACK Agent[03]"

//一回パス(他に発言者がいなくても,次の順番で発言を行う)
String skip = TemplateTalkFactory.skip();
//skip = "Skip"

//パス(他に発言者がいなければその日の発言は終了)
String over = TemplateTalkFactory.over();
// over = "Over"
なお,通常の会話に利用する発話は,
TemplateTalkFactory
を利用し,人狼が囁きを行う場合は,
TemplateWhisperFactory
を利用します.

発話の理解

自分を含めた他のエージェントの発話は,Talk型として渡されます. その具体的な中身は,
Talk talk = talkList.get(0);
String contents = talk.getContents();
として獲得できますが,contentsの中身は先に見たTemplateTalkFactoryで作成した文字列がそのまま獲得されるだけのため,何らかの形で文字列が表す意味を理解しなければいけません.
そこで,定型文を簡単に理解できるようにParserが用意されています.
たとえば,カミングアウトした発話のみを見つけて,カミングアウトしたエージェントとその職業を表示するには以下のようにします.
List talkList = gameInfo.getTalkList();
for(Talk talk:talkList){
 Utterance utterance = new Utterance(talk.getContent());
 Topic topic = utterance.getTopic();
 if(topic == Topic.COMINGOUT){
  Agent target = utterance.getTarget();
  Role role = utterance.getRole();
  System.out.println(target+" comingouts as "+role);
 }
}
もしエージェント10が占い師としてカミングアウトしていたら,コンソールに以下のように表示されます.
Agent[10] comingouts as SEER
Utteranceから抽出できるTopicとそれに付随する変数の一覧を以下に示します.
Topic内容利用可能な情報
ESTIMATE予想getTarget(), getRole()
COMINGOUTカミングアウトgetTarget(), getRole()
DIVINED占い結果getTarget(), getResult()
INQUESTED霊媒結果getTarget(), getResult()
GUARDED護衛対象getTarget()
VOTE投票宣言getTarget()
AGREE意見に賛成getTalkType(), getTalkDay(), getTalkId()
DISAGREE意見に反対getTalkType(), getTalkDay(), getTalkId()
ATTACK襲撃対象(人狼のみ)getTarget()
OVER現段階では話すことは無い
SKIP今回は発話しない
TemplateTalkFactory,TemplateWhisperFactory,Utteranceクラスを利用することで, 他のエージェントに発話を文字列として扱うこと無く人狼知能を構築することが出来ます.

今回まで5回にわたって人狼知能作成方法について書いてきました.
途中長い中断があったために,バージョンが変わって,若干仕様の変更がありましたが,おおむねこれで人狼知能が作成できるようになったはずです
次回は,自分が作った人狼知能と人間が対戦する方法について解説します.

2014年11月3日月曜日

人狼知能エージェントの作成・その4 番外編・人狼知能ver0.1.1xの変更点

人狼知能ver0.1.11にバージョンアップされました.
ダウンロードはこちらから.
ver0.1.1xから,以降からいくつか大きな変更がありました.
ここでは主な変更点についてお知らせします.

RoleBasePlayerからAbstarctRoleAssignPlayerへ変更

主な変更として, RoleBasePlayerのクラス名が AbstarctRoleAssignPlayer と変更になりました.
これに伴って, 人狼知能エージェントの作成・その1で紹介したMyPlayerは以下のようになります.
package org.aiwolf.tori.player;

import org.aiwolf.client.base.player.AbstarctRoleAssignPlayer;

public class MyPlayer extends AbstarctRoleAssignPlayer{
 
 public MyPlayer() {
  setVillagerPlayer(new MyVillagerPlayer());
 }

 @Override
 public String getName() {
  return MyPlayer.class.getSimpleName();
 }

}
となります.

enum型の変更

ver0.1.9までは,enum型の名称が大文字小文字混じりでしたが, すべて大文字で表記するように変更されました.
たとえば,
Status.ALIVE;
Status.DEAD;
の様に表記します.

人狼プロトコルパーサの改訂

人狼プロトコルのパーサの仕様が変更されました. 人狼知能エージェントの作成・その2 Talk編 ではProtocolクラスなどを利用していましたが, ver0.1.1xからはUtteranceクラスで一括管理するようになりました.
これについては,次回詳細を説明します.

その他,細かい変更点がありますが主な変更点は以上です. 対話部分については早めにブログでサンプルをお見せするようにいたします. ご迷惑おかけしますが,よろしくお願いします.

実行クラスの変更(2014-11-14追記)

実行クラスのパッケージが変更されました. RoleRequestStarterで開始する場合,
org.aiwolf.server.bin.RoleRequestStarter
をメインクラスとして指定してください.