Category Archives: UNIX

rsyncのディレクトリ指定でエスケープの必要な文字を含めるには

Pocket

先に結論:ダブルクオーテーションで括ればよい。

rsyncの対象ディレクトリでカッコ「()」など、エスケープの必要な文字の含まれているケースがある。
たとえば、Sambaでサービスしている共有フォルダとか。
そのままディレクトリ名をrsyncに与えてしまうと、とても面倒なことになる。

どうするか。
ダブルクオーテーションで括ればよい。
ふむ。よろしい。
ではディレクトリがリモートにある場合、どこからどこまでを括ればよいの?
以下の通りである。
192.168.1.1にsomeoneでログインした先のディレクトリを手元にsyncする場合。

rsync -avz someone@192.168.1.1:"/work/fileshare/file\(20141022\)" /home/someone/fileshare/backup

参考
http://serverfault.com/questions/234876/escaping-spaces-in-a-remote-path-when-using-rsync-over-a-remote-ssh-connection

以上。

vimでまさかのタブ表示

Pocket

 

結論

vim -pで複数ファイルをタブ表示できる。
.profileにaliasを書いとけ。
以上。

-pオプション

vimのmanを眺めていたらこんな記載が。

       -p[N]       Open N tab pages.  When N is omitted, open one tab page for
                   each file.

なんですと。
さっそく試そう!

vim -p に続けて複数ファイルを指定

こんな感じ。
もちろん*.confなんて指定のしかたもできるよ。

# vim -p freebsd-update.conf inetd.conf rc.conf make.conf portsnap.conf

すると開くファイルをズラッと表示してくれる。
しかもreadonlyのファイルがあればそれもご丁寧に。

"freebsd-update.conf" 76 lines, 2906 characters
"inetd.conf" 118 lines, 5025 characters
"rc.conf" [readonly] 31 lines, 662 characters
"make.conf" [readonly] 4 lines, 127 characters
"portsnap.conf" 35 lines, 1514 characters
Press ENTER or type command to continue

こんな感じ。
一番上の行に指定したファイルが並んでいる。
長いファイル名は表示できていないが。

vimp00

編集を終えて:qで抜けると次のファイルに移る。
:qを使わなくとも”gt”, “gT”でファイルを映ることができる。
“gt”で右へ、”gT”で左へ。

alilasの設定

気に入ったらaliasを設定しておく。
bashなら.profileに書き込んでおく。

alias vim="vim -p"

 

 

No tags for this post.

nginxとlighttpdで悩んでlighttpd + php5 + fastcgiのインストールと設定へ

Pocket

apacheは吊るしのFreeBSD pkgでphpを使えない。

10.0-BETA1にして曲がりなりにもpkgが普通に使えるようになって、あまりの便利さに感動し、追加ソフトウェアはすべてpkgにしようと決めたのだが。

apacheとphpでいきなり壁に当たりました。
apacheをpkgでインストールすると、phpのモジュールが付いてこないのである。
phpモジュールが欲しいなら、apacheをportsからインストールしないといけない。

もちろん、pkgngはportsと一緒に使えるよう考えて作られている。
apacheだけportsからインストールしたって何の問題もない。
ただ、あの巨大な/usr/portsディレクトリをメンテしていくのが億劫なわけですよ。

ならばよろしいapacheはもう捨てよう。
たぶんまた、吊るしのpkgで使えないソフトウェアが出てくると思うが、その時はその時考えよう。

nginx, lighttpdのどちらがよいか。

apacheの代替といってすぐに思い浮かぶのはnginxとlighttpdである。

“nginx lighttpd comparison”などとググってみると、いくつかのもまとめがヒットする。

http://www.wikivs.com/wiki/Lighttpd_vs_nginx
http://wiki.dreamhost.com/Web_Server_Performance_Comparison

軽く速く柔軟な設定が可能という点では同じだが、概観したところnginx優勢のようである。

また、lighttpdには品質面で気になる点もある。
どうも長い間放置されているメモリリークがあるようだ。

ただlighttpdの設定のほうが分かりやすい、というのは皆の認めるところらしい。
メモリリークは心配だが、さっさとhttpサーバを設定したいのでlighttpdを選択。

以下、lighttpdでphpを、fastcgiで動かす。
環境はFreeBSD 10.0-BETA1。pkgngでインストール。
設定方法は他OSでも参考になる部分があるかも。

lighttpd, php5のインストール

pkgでインストール。
簡単。
lighttpdは依存も少ない。

# pkg install php5 lighttpd
(略)

 

php5のバージョン確認

lighttpdを扱う前に、phpを確認する。
fastcgi対応かどうか。

“php5″でインストールされたのは5.4.20
/usr/local/bin/php-cgiを確認すると、特に指定や追加のインストールの必要なくfastcgi対応であることが分かる。

# php -v
PHP 5.4.20 (cli) (built: Oct  3 2013 03:35:30)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

# php-cgi -v
PHP 5.4.20 (cgi-fcgi) (built: Oct  3 2013 03:35:34)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

 

lighttpdのファイル配置

lighttpdとしてインストールされたファイルを確認する。

設定ファイル
/usr/local/etc/lighttpd下に。

# cd /usr/local/etc/lighttpd/
# ls
RCS                     lighttpd.conf.sample    vhosts.d
conf.d                  modules.conf
lighttpd.conf           modules.conf.sample

ドキュメントルート
初期状態では/usr/local/www/dataだが、ディレクトリは自分で作る必要がある。

lighttpdのログファイル
初期状態では/var/log/lighttpd下に。

# cd /var/log/lighttpd/
# ls
access.log      error.log

ファイルを確認したら、lighttpdの設定に移る。

lighttpdの設定

流れとしては、

  1. lighttpd.confで全体の設定を、
  2. modules.confで読み込むモジュールの設定を、
  3. conf.d/下の*.confで各モジュールの設定を行う。

fastcgiを使うなら、
lighttpd.confで設定ののち、
modules.confでfastcgiのモジュールを読み込む指定をし、
conf.d/fastcgi.confでphpの指定をする、となる。

なお、php.iniにも一部変更が必要。

lighttpdオフィシャルのチュートリアルはここ
以下、/usr/local/etc/lighttpd下にある設定ファイルに手を加えていく。

lighttpd.confの修正

lighttpd.conf.sampleから変えたのは以下の3行だけ。

server.use-ipv6 = "disable"
server.bind = "192.168.154.241"
$SERVER["socket"] == "192.168.154.241:80" { }

コメント行、空行を除いたlighttpd.confは以下の通り。
include “modules.conf”と指定がある通り、ここでmoduleを読み込んでいる。

# grep -v "^#" ./lighttpd.conf|grep -v "^$"
var.log_root    = "/var/log/lighttpd"
var.server_root = "/usr/local/www/data"
var.state_dir   = "/var/run"
var.home_dir    = "/var/spool/lighttpd"
var.conf_dir    = "/usr/local/etc/lighttpd"
var.vhosts_dir  = server_root + "/vhosts"
var.cache_dir   = "/var/cache/lighttpd"
var.socket_dir  = home_dir + "/sockets"
include "modules.conf"
server.port = 80
server.use-ipv6 = "disable"
server.bind = "192.168.154.241"
server.username  = "www"
server.groupname = "www"
server.core-files = "disable"
server.document-root = "/usr/local/www/data/"
server.tag = "lighttpd"
server.pid-file = state_dir + "/lighttpd.pid"
server.errorlog             = log_root + "/error.log"
include "conf.d/access_log.conf"
include "conf.d/debug.conf"
server.event-handler = "freebsd-kqueue"
server.network-backend = "writev"
server.max-fds = 2048
server.stat-cache-engine = "simple"
server.max-connections = 1024
index-file.names += (
"index.xhtml", "index.html", "index.htm", "default.htm", "index.php"
)
url.access-deny             = ( "~", ".inc" )
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" )
include "conf.d/mime.conf"
include "conf.d/dirlisting.conf"
server.follow-symlink = "enable"
server.upload-dirs = ( "/var/tmp" )
$SERVER["socket"] == "192.168.154.241:80" { }

 

modules.conf

lighttpd.confで指定されたmodules.confの設定。
どんなmoduleを読み込むか。
以下の行を有効にしただけ。
つまりfastcgiを有効に。
そのほかにも興味深そうなmoduleはあるがミニマルスタートが原則。

include "conf.d/fastcgi.conf"

コメント行、空行を除いたlighttpd.confは以下の通り。

# grep -v "^#" ./modules.conf|grep -v "^$"
server.modules = (
"mod_access",
)
include "conf.d/fastcgi.conf"

 

conf.d/fastcgi.conf

fastcgiの設定。
phpをどう実行するかを指定できる。

ローカルのphp-cgiでもよいし、ローカルホストの別webサーバ(apacheとか)でもよいし、はたまた別ホストのwebサーバでもよい。
詳細はこちら

ここでは、ローカルの/usr/local/bin/php-cgiを使う。
fastcgi対応のphpである。

ローカルなのでIPアドレスやTCP/IPポートの指定は不要で、UNIXドメインソケットして使うファイルを指定すればよい。
最終的に以下の行を追加

fastcgi.server = ( ".php" =>
                    (("bin-path" => "/usr/local/bin/php-cgi",
                      "socket" => "/tmp/php.socket"
                     ))
                 )

コメント行、空行を除いたlighttpd.confは以下の通り。

server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
        (("bin-path" => "/usr/local/bin/php-cgi",
        "socket" => "/tmp/php.socket"
        ))
        )

以上でlighttpdの設定は完了

php.iniの設定

lighttpdのドキュメントを見ると以下のように書いてあるので、php.iniを修正する。

If you want to use PATH_INFO and PHP_SELF in you PHP scripts you have to configure php and lighttpd. The php.ini needs the option:
cgi.fix_pathinfo = 1

FreeBSDだとphp.iniは/usr/local/etcに置かれるべきもの。
初期状態ではphp.iniが無いので、sampleからコピーする。
sampleにはphp.ini-developmentとphp.ini-productionの二つがある。
developmentの方を選んだ。

# cd /usr/local/etc/
# cp php.ini-development php.ini

以下の行のコメントを外す。

cgi.fix_pathinfo=1

 

起動確認

/usr/local/www/dataを作り、”It works!”とでも書いたindex.htmlを作る。

# mkdir /usr/local/www/data
# echo "It works" > /usr/local/www/data/index.html

FreeBSDなら/etc/rc.confに以下の行を追加。

# enable lighttpd at boot
lighttpd_enable="YES"

 

起動。

# service lighttpd start
Performing sanity check on lighttpd configuration:
Syntax OK
Starting lighttpd.

 

ログに異常もなし。

# tail /var/log/lighttpd/error.log
2013-10-22 21:30:20: (log.c.166) server started
#

 

ブラウザでつないで、index.htmlが表示されればOK。

No tags for this post.

仮想マシンイメージの変換について

Pocket

 

VMWare PlayerのイメージをESXi用に変換するには

VMWareが提供しているコンバータを使う。
以下、まとめ。

なお、動機としては、「手元のVMware Playerで手軽にいろいろ検証をして、出来上がったものをESXiに移す」ことが出来るようにしたい、というもの。
しかし最後に書くように、変換してもVMware Player上と同じようにESXi上でも動くとは限らない。
可能なら最初からESXi上で検証したほうがよいようだ。

VMware vCenter Converterとは。

 

「VMware vCenter Converter は、物理マシンから仮想マシンへの変換のほか、仮想マシン フォーマット間の変換を自動化および簡素化します。 VMware vCenter Converter では、直感的なウィザード形式のインターフェイスを使用して、物理マシンを仮想マシンに変換できます。」

vmware.comを見ると、「物理マシンから仮想マシンへ変換」なんてすごい事が書いてある(2013/8/1現在)。

さらにvmware.comから引く。

VMware vCenter Converter は、さまざまなハードウェア上で実行でき、最も広く使用されている Microsoft Windows と Linux オペレーティング システムの各バージョンに対応します。 この堅牢なエンタープライズ クラスの移行ツールにより、次のことが可能になります。

システム停止やダウンタイムなしで、ローカルおよびリモートの物理マシンを迅速かつ確実に仮想マシンに変換できます。
統合管理コンソールと直感的な変換ウィザードにより、複数の変換を同時に実行します。

Microsoft Hyper-V、Microsoft Virtual PC、Microsoft Virtual Server など、サードパーティの仮想マシン フォーマットのほか、Symantec Backup Exec System Recovery や Norton Ghost など、物理マシンのバックアップ イメージを VMware の仮想マシンに変換します。

入手

http://www.vmware.com/jp/products/converter

 

手順

ここでは5.0.0ビルド 470252を使用している。

メニューから変換を選ぶ

  1. 「ソースのタイプを選択」→「VMware Workstation またはその他の VMware 仮想マシン」を選ぶ
  2. 仮想マシンファイルで変換したいvmxファイルを選ぶ。
  3. 「ターゲットのタイプを選択」→「VMware Infrastructure 仮想マシン」
  4. VMware Infrastructure サーバの詳細で、ESXiマシンの詳細を入れる。

ESXi上での名前を決めて、あとは適当に。
100MのEternetで2GBytes程度の仮想イメージを転送したところ、10分強かかった。

また、ESXi上で起動するときもいくつか聞かれるが、それも適当に。

 

愚痴

本記事が、とてもやる気のない感じになっているのは、VMware Playerで問題のなかった仮想マシンが、ESXiに移したら途端に調子が悪くなったから。
具体的には、FreeBSD 9.1-RELEASE(amd64)をESXiに移したら、ira16から割り込みの嵐が発生してまともにパフォーマンスがでなかった。
新規で同じOSを入れたら事象発生せず(vmstat -iを見たら割り込みを発生させたデバイスがない)。
ぐぐっても解決策なし。
がっかり。

No tags for this post.

コード、エラー、設定ファイル共有サイトのすすめ

Pocket

 

sprunge.usというサービスがあるのを、いまさら知って驚いてそして大感謝した。
以下に顛末を記す。

sprunge.usってなんだ。

ブラウザでsprunge.usを開くと、manページのような見てくれで何か間違えたかと二度見するようなサイトなのだが、よく見ると凄い事が書いてある。

何らかのコマンドの標準出力をsprunge.usに食わすと、URLが返る。
そのURLへアクセスすると、先の出力結果が見えるというわけ。

sprunge.usの使い方

使い方といっても上記の通りなんだが、やってみるのが早い。
uname -aの結果を食べさせてみる。

$ uname -a | curl -F 'sprunge=<-' http://sprunge.us
http://sprunge.us/CTQL

返ってきたURL、http://sprunge.us/CTQLにアクセスしていただくと、uname -aの結果、すなわち我輩の鯖の詳細が分かる。

 

使いどころ

このサービスの何が便利なのか。
sprunge.usを使うことで、エラーや設定ファイル、ちょっとしたスクリプト、ソースを手軽に共有できる。

たとえば私が、あるサーバが意図した動作をせず困っているときに、助けを求めるとする。
助けを求める相手が、twitterにいるとする。
twitterには140文字しか書けないので、エラー、使用している設定ファイルの中身をすべて貼り付けるのは無理がある。
ではどこかのサイト(いわゆるアップローダと言われているサイトなど)にアップロードするか?それも面倒。
そこでコマンドラインからsprunge.usにアップロードし、そのURLを相手に送る。

これは便利じゃありませんかみなさん。
まあ、助けを求める相手がいる限りにおいてですが。

 

いつまで残るの・・・?

sprungeに載せた内容はいつまで残るのか。
調べてみたけど、ちょっと分からなかった。
末尾で触れるpastebinだと、残す期間を選べたりするのだが。

 

やってもうた時は?

共有すべきでない内容をsprunge.usしてしまった時はどうするのだろうか。
これも検索したけど分からない。
センシティブな情報、IDとかパスワードとかが含まれそうな場合は、後述のpastbinの方がよいかも。

 

sprungeをもっと便利に使う。

まずですね、aliasを設定しましょう。
こんな長いの、いちいちタイプできんですよ。
設定したらすぐ確かめるのが紳士のたしなみ。ここだとaliasを引数なしですぐさま叩く。

$ alias sprunge="curl -F 'sprunge=<-' http://sprunge.us"
$ alias
alias sprunge='curl -F '\''sprunge=<-'\'' http://sprunge.us'

テストして問題なければ、シェルに合わせた初期設定ファイルに書き込んでおく。
~/.profileとか。

sprungeはファイルの内容だってOK。

sprungeは標準出力を受け付けるので、ファイルの内容だって貼り付けられる。
FreeBSDのftpd起動シェルスクリプトで試してみよう。
どうせなら、上記で作成したaliasで。

$ cat /etc/rc.d/ftpd | sprunge
http://sprunge.us/LQCZ

http://sprunge.us/LQCZ どうだろうか。

 

構文強調と行番号表示もできる。

sprunge.usに以下のように書いてある。

    add ?<lang> to resulting url for line numbers and syntax highlighting
    use this form to paste from a browser

上記のftpdシェルスクリプトを例に引く。
シェルスクリプトなので、「sh」を?に続けてURLに加えればよい。

http://sprunge.us/LQCZ?sh

 

sprungeに意地悪をしてみる。

知る人ぞ知るコマンドにslがある。

これはlsをslとタイプミスしてしまったとき、アスキーアートのSL機関車がターミナルを爆走する豪快なコマンドだ。
slコマンドをご存じなく、UNIX系マシンをお持ちの方はぜひインストールしてその目で確かめてほしい。
ちなみにFreeBSDではportsに収録されている。games/slからどうぞ。

で、これをsprungeに食わせてみた。

$ sl | sprunge
http://sprunge.us/Sijg

http://sprunge.us/Sijg …うん。まあ。仕方ないね。

 

同様の別サービス

sprunge.usと同様のサービスにpastbinがある。
http://pastebin.com/
世間的にはsprunge.usよりこちらの方が有名な様子。

CUIから使うためにwgetpastといったツールもある。

 

 

No tags for this post.

[Hadoop]Hadoop 擬似分散(Psuedo-distributed)モードの設定

Pocket

 

Standaloneモードでは、複数のホストを使った処理は行わない。デーモンも動かさない。

しかしHadoopは分散処理をしてナンボである。
分散処理をする場合には、複数のホストでいくつかのデーモンを動作させる必要がある。
それはまあ当然。

ただ、いきなり複数ホストを使うのはハードルが高い。
そこで、「Hadoopは複数ホストで動いているつもりだけど実際は1台のホストで動いている」モードで設定の確認をする。
これが擬似分散(Psuedo-distributed)モード。

擬似分散モードに必要な各設定の意味

擬似分散(Psuedo-distributed)モードの動作には以下、四つの設定が必要。
完全分散(Full distributed)モードでも変わらないんだけどね。

  1. HDFSのメタデータを格納するnamenodeの設定
  2. データをいくつ複製(replication)するかの設定(デフォルトで3)
  3. タスク分散を受け持つJobTrackerの設定
  4. 実データを格納し、タスクを実行するdatanodeかつTaskTrackerの設定

1と3と4にそれぞれlocalhostを指定する(なおこれを別ホストにすればFull distributedモードに)。
2では1を指定する。
デフォルトのままだと、複製を3つ作ろうとする。ひいてはホストが3つ必要になってしまう。
擬似分散モードでは自ホストしか使わないわけだから1を指定するというわけ。

namenode, replication, JobTrackerの設定

以下、三つのファイルを変更する。
前章の1,2,3に対応する。

  • core-site.xml(namenode設定)
  • hdfs-site.xml(replication設定)
  • mapred-site.xml(JobTracker設定)

FreeBSDでportsから入れたなら/usr/local/etc/hadoopにある。

core-site.xml

<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://localhost/</value>
        </property>
</configuration>

hdfs-site.xml

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
</configuration>

mapred-site.xml

<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>localhost:8021</value>
        </property>
</configuration>

 

datanode, TaskTrackerの設定

/usr/local/etc/hadoopの下にmasters, slavesというファイルを作る。
ここでsecondary namenode, datanode, TaskTrackerを指定する。

secondary namenodeとは、namenodeのデータをバックアップするノード。
datanode、TaskTrackerとは、HDFSの実データが置かれ、JobTrackerから指定されたタスクをこなすノード。

mastersというファイルには、secondary namenodeを書く。
slavesというファイルには、datanodeかつTaskTrackerとなるホストを書く。

擬似分散モードでは、secondary namenodeの指定は不要。
mastersという空ファイルだけ作っておけばよい。
slavesには、localhostと書いておく。

$ cd /usr/local/etc/hadoop/
$ sudo touch slaves masters
$ sudo sh -c 'echo "localhost" >> ./slaves'
$ cat masters
$
$ cat slaves
localhost
$

 

HDFSのフォーマット

初回に限り、HDFSのフォーマットが必要である。
HDFSにはメタデータを保存するnamenodeと、実データの保存されるdatanodeがある。

ここでの「HDFSのフォーマット」とは、実際のところnamenodeの初期化を意味する。

なので、datanodeはこのフォーマットとは無関係。不要。
しかもdatanodeを追加したり削除したときだって、namenodeでの設定変更、フォーマットは不要。

拍子抜けするくらいである。
だが。裏を返すとnamenodeが壊れればすべてのデータが死亡することを意味する。
実運用の際には、secondaly namenodeを立てるなどして事故に備えることになる。

しかし今は擬似分散モードなので気軽に進める。
HDFSのフォーマットは以下のようにして行う。
※フォーマットは、実際にHadoopを使うユーザで行うこと。FreeBSDでportsから入れた場合は注意

$ hadoop namenode -format
Warning: $HADOOP_HOME is deprecated.

13/07/23 20:12:16 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/127.0.0.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 1.0.0
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1214675; compiled by 'hortonfo' on Thu Dec 15 16:36:35 UTC 2011
************************************************************/
13/07/23 20:12:18 INFO util.GSet: VM type = 64-bit
13/07/23 20:12:18 INFO util.GSet: 2% max memory = 19.33375 MB
13/07/23 20:12:18 INFO util.GSet: capacity = 2^21 = 2097152 entries
13/07/23 20:12:18 INFO util.GSet: recommended=2097152, actual=2097152
13/07/23 20:12:19 INFO namenode.FSNamesystem: fsOwner=vanilla
13/07/23 20:12:20 INFO namenode.FSNamesystem: supergroup=supergroup
13/07/23 20:12:20 INFO namenode.FSNamesystem: isPermissionEnabled=true
13/07/23 20:12:20 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
13/07/23 20:12:20 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
13/07/23 20:12:20 INFO namenode.NameNode: Caching file names occuring more than 10 times
13/07/23 20:12:20 INFO common.Storage: Image file of size 113 saved in 0 seconds.
13/07/23 20:12:20 INFO common.Storage: Storage directory /tmp/hadoop-vanilla/dfs/name has been successfully formatted.
13/07/23 20:12:20 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1
************************************************************/

 

HDFSの場所

上記のログにもある通り、デフォルトでは/tmpの下に作られる。
厳密に言えば、/tmp/hadoop-${user.name} に作られる。
namenodeでも、datanodeでも同じ。

/tmpディレクトリだと、システムが消したりするので実運用では場所を変えたほうがよい。

これらの場所は、hdfs-site.xmlで制御できる。
hadoop.tmp.dirがprefixなので、これを変えればよい。
あるいは、dfs.name.dir(namenode向け)、dfs.data.dir(datanode向け)で明示してもよい。

Hadoopの起動

start-all.shで起動させる。

$ sudo su - hadoop
[hadoop@isis ~]$
[hadoop@isis ~]$
[hadoop@isis ~]$ start-all.sh
Warning: $HADOOP_HOME is deprecated.

starting namenode, logging to /var/log/hadoop/hadoop-hadoop-namenode-isis.out
localhost: Warning: $HADOOP_HOME is deprecated.
localhost:
localhost: starting datanode, logging to /var/log/hadoop/hadoop-hadoop-datanode-isis.out
starting jobtracker, logging to /var/log/hadoop/hadoop-hadoop-jobtracker-isis.out
localhost: Warning: $HADOOP_HOME is deprecated.
localhost:
localhost: starting tasktracker, logging to /var/log/hadoop/hadoop-hadoop-tasktracker-isis.out
[hadoop@isis ~]$

HADOOP_HOMEについて文句をつけられている。スクリプトを見れば分かるが、これは無視してよい。この点については別途。
namenode, datanode, jobtracker, tasktrackerの4つを起動しようと試みていることが分かる。

さて実際に起動しているか。jpsで確認。動いていますな。

[hadoop@isis ~]$ jps
2135 DataNode
2324 TaskTracker
2057 NameNode
2377 Jps
2229 JobTracker
[hadoop@isis ~]$

 

そしてこれらのプロセスは、ポート待ち受けをする。調べてみる。

[hadoop@isis ~]$ sockstat -l4|grep hadoop
hadoop   java       1746  55 tcp4 6 *:24923               *:*
hadoop   java       1746  60 tcp4   127.0.0.1:8021        *:*
hadoop   java       1746  71 tcp4 6 *:50030               *:*
hadoop   java       1621  55 tcp4 6 *:64722               *:*
hadoop   java       1621  63 tcp4   127.0.0.1:8020        *:*
hadoop   java       1621  74 tcp4 6 *:50070               *:*
[hadoop@isis ~]$

50030はJobTrackerの、50070はnamenodeの管理Web用ポート、8020はnamenodeの、8021はdatanodeのポート。

namenodeに対し、ブラウザで前二者のポートにアクセスするとステータスが分かる。

実際に動かすのは今度。
関連エントリ

[FreeBSD] Hadoopのportsからのインストール
[FreeBSD] portsのHadoopで分散(x-distributed)モードを動かす準備
[Hadoop]擬似分散モードで実験
[Hadoop] 擬似分散モードから完全分散モードへ(データノードの追加)

No tags for this post.

[FreeBSD][Linux] ssh経由でコマンド実行すると環境変数を読まないでござる

Pocket

ssh経由bashでコマンド実行するときの環境変数を有効にするには。

以下のようにして、リモートホストでコマンドを実行する場合、リモートでの環境変数が有効にならない事がある。

$ ssh user@remotehost /path/command

 

これはbashの仕様が原因で、解決にはsshdとリモートユーザの設定が必要。
おそらくshでも同じと思うが、ひとくちにshと言ってもいろんな変種があるので調べていない。
以下にまとめる。

なお、複数ホストを用意するのが面倒なので、本記事で実例を示す場合には接続先をlocalhostしている。

Continue reading

No tags for this post.

[FreeBSD] Hadoopのportsからのインストール

Pocket

 

Hadoopをインストールしたのでメモ。

 

野良HadoopとportsのHadoop

Hadoopを野良で入れるか、portsから入れるか。
結局portsにした。その訳は。

hadoopはJavaで動作する。
ということは、Javaさえ入っていれば、インストールに特殊な手間の必要なくhadoopが動作するはず。
だからインストールを扱う記事、blog等々はhadoopをダウンロードしてtarで展開して…、というものがほとんど。
FreeBSDでだってそれは同じ。

しかしFreeBSDでは、hadoopがportsに収録されている。
portsだと依存するportsを一括で入れてくれるし、ユーザ追加や権限設定なども自動でしてくれる。
便利な一方、世の中の記事とは違うところ(おもにファイル配置)が出てきたり、ひょっとすると最新版を使えないリスクもある。

どっちもどっちだが、hadoopが初めてならportsから入れるのが良いと判断した。
Javaなど依存portsのインストールが面倒だし、そもそもやりたいことはHadoopのセットアップではなくてその先にあるわけだから。
なお2013/7/23時点でportsのhadoopは1.0.0の模様。

 

hadoopのインストール

ports、と言っておきながらなんだけど、けっこう量があるのでスピード重視でpackageから入れた。

まずpackageの入手先を近所のftpに設定する。~/.profileに書いとけ。

PACKAGEROOT="ftp://ftp2.jp.freebsd.org";export PACKAGEROOT

 

sudoを使うならvisudoで以下の行をアンコメントしておく。

Defaults env_keep += "PKG_PATH PKG_DBDIR PKG_TMPDIR TMPDIR PACKAGEROOT PACKAGESITE PKGDIR FTP_PASSIVE_MODE"

 

インストール。あそうそう、bashとrsyncも忘れずにね。

$ sudo pkg_add -r bash rsync hadoop

 

しばらく放置。

 

事前準備

一式が入ったのだが、hadoopを動かす前に準備がいる。
OpenJDK向け設定、ホスト名の設定、JAVA_HOMEの設定。

 

OpenJDK向けの設定

OpenJDKをインストールすると以下の表示が現れる。
素直に設定する。

===============================================================
This OpenJDK implementation requires fdescfs(5) mounted on /dev/fd and
procfs(5) mounted on /proc.

If you have not done it yet, please do the following:

mount -t fdescfs fdesc /dev/fd
mount -t procfs proc /proc

To make it permanent, you need the following lines in /etc/fstab:

fdesc /dev/fd fdescfs rw 0 0
proc /proc procfs rw 0 0

===============================================================

 

以下のように。

$ sudo mount -t fdescfs fdesc /dev/fd
$ sudo mount -t procfs proc /proc
$ mount
/dev/da0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
fdescfs on /dev/fd (fdescfs)
procfs on /proc (procfs, local)

 

/etc/fstabにも以下の通り記載しておく(空白はタブで)

fdesc /dev/fd fdescfs rw 0 0
proc /proc procfs rw 0 0

 

ホスト名の設定

hadoopはhostnameが解決できないと動作しない。
/etc/hostsにhostnameの記載があるか確認して、なければ加える。
DHCPでIPアドレス取得しているなら、127.0.0.1のところにホスト名を入れる。
以下はhostnameがvanillaの場合

127.0.0.1 localhost localhost.my.domain vanilla

 

JAVA_HOMEの設定

portsからHadoopをインストールしているなら不要。
/usr/local/etc/hadoop/envvars.d/000.java_home.envでJAVA_HOMEを設定している。
そして000.java_home.envは起動の都度、読み込まれる(後述)。

export JAVA_HOME=${JAVA_HOME:-/usr/local/openjdk6}

 

portsから入れていないんだったら、hadoopを使うユーザの~/.profileで設定しておく。

JAVA_HOME=/usr/local/openjdk6;export JAVA_HOME

 

 

ファイル配置

ファイル配置の確認。
portsから入れると、FreeBSDの流儀に沿ってファイルが配置される。

openjdk6の場所

/usr/local/openjdk6

 

hadoop関連

hadoopコマンド: /usr/local/bin/hadoop
実行ファイル他: /usr/local/share/hadoop
設定: /usr/local/etc/hadoop
ログ: /var/log/hadoop
設定サンプル: /usr/local/share/examples/hadoop/

 

各ディレクトリの中身

openjdk6

$ ls /usr/local/openjdk6/
ASSEMBLY_EXCEPTION demo man
LICENSE include sample
THIRD_PARTY_README jre src.zip bin lib

 

hadoop関連ファイル

$ ls /usr/local/etc/hadoop
capacity-scheduler.xml hadoop-policy.xml
configuration.xsl hdfs-site.xml
core-site.xml log4j.properties
envvars.d mapred-queue-acls.xml
fair-scheduler.xml mapred-site.xml
hadoop-env.sh taskcontroller.cfg
hadoop-metrics2.properties

$ ls /usr/local/share/hadoop/
bin hadoop-core-1.0.0.jar lib
contrib hadoop-test-1.0.0.jar webapps
hadoop-ant-1.0.0.jar hadoop-tools-1.0.0.jar

$ ls /usr/local/share/examples/hadoop/
conf hdfs-default.xml
core-default.xml mapred-default.xml
hadoop-examples-1.0.0.jar

 

これでインストールはおしまい。
hadoopはこれだけでも動く。しかしその前に。

/usr/local/bin/hadoopってなんだ

FreeBSDのports特有のものと思うけど、/usr/local/bin/hadoopについて。

/usr/local/bin/hadoopを便宜的にhadoopコマンドと呼ぶ。
hadoop一式は/usr/local/share/hadoop下にあるのに一体これはなんだろう。

中身を見ればすぐ分かる。hadoopコマンドの正体はbashスクリプト。
もう少し見ると、環境変数を設定してからhadoopの実体を呼ぶwrapperであると分かる。
と同時に、環境変数の設定は/usr/local/etc/hadoop/envvars.dの下に置いておけばよいと言う点も分かる。

#!/usr/bin/env bash
for i in `ls /usr/local/etc/hadoop/envvars.d/*.env`
do
. ${i}
done

exec /usr/local/share/hadoop/bin/hadoop $@

続き

[FreeBSD] portsのHadoopで分散(x-distributed)モードを動かす準備
[Hadoop]Hadoop 擬似分散(Psuedo-distributed)モードの設定
[Hadoop]擬似分散モードで実験
[Hadoop] 擬似分散モードから完全分散モードへ(データノードの追加)

 

 


No tags for this post.

アーカイバlz4を試してみたら(圧縮は)速すぎ笑った

Pocket

 

lz4という圧縮形式があることを知った。
なんでも、なかなかの圧縮効率を誇るわりには、圧縮伸長が速いとのこと。
公式サイト通りにいえば、圧縮では1.5倍程度、身長では1.8倍程度速い、と(>50% faster on compression, >80% faster on decompression)。

速いアーカイバはなぜ嬉しいか。

速いアーカイバはなぜ嬉しいか。
端的に言えば圧縮されたバックアップからの書き戻し時間の短縮化であり、言ってみればMTTRというか、何らかの障害からの復旧速度に効いてくるからである。

というのも。
いくらHDDが安くなったとはいうものの、あればあるだけ使ってしまうせいで、バックアップにはいつまで経っても追いつかない。

そこでディスク容量をかせぐために、古いデータはしかたなく圧縮して保存するのだが、そうするといざ必要になったときには伸長待ちでえらく待たされる。
で、そういう古いデータが必要になるときというのは、高確率で緊急復旧が必要な時なんである。

みなさん、いつまで経っても終わらない伸長をジリジリしながら待ったことはあるだろうか。
ユーザが今か今かと待ってるプレッシャーを背中に感じて作業した事があるだろうか。

何年も前の私はほとほと痛い目を見たので、持っておける世代数は減るものの、原則として圧縮しないでtarで固めるだけにした(高い授業料であった)。

むろんディスクもっと買えとか、速いディスクにしろよとか、ディスク構成考えろとかあるけど、この世の中、インフラエリアにはなかなかお金を使ってもらえないよね。

というわけで、そこそこの圧縮効率があり、しかし速度がめっぽう速いとなれば気にならないわけがないのだ。

なお、速いアーカイバを活かせる道はもうひとつあって、それは圧縮ファイルシステム。
じっさい、lz4を知ったのも、ZFSに入れるよーという話から。

 

各種ポインタ

lz4のソース置き場はこちら。

http://code.google.com/p/lz4/

lz4については以下のslideshareを。ほー。ドラクエですか。

http://www.slideshare.net/komiyaatsushi/dsirnlp-3-lz4

 

入れてみよう!

FreeBSDのportsには入ってないのでsvnでgooglecodeからダウンロード。
コンパイルにはcmakeが必要なので注意。
cmakeディレクトリを引数にcmakeを実行し、さらにmakeを実行する。

$ svn checkout http://lz4.googlecode.com/svn/trunk/ lz4
(略)
Checked out revision 88.
$ cd ./lz4
$ cmake ./cmake/
$ make
Scanning dependencies of target lz4demo32
[ 12%] Building C object CMakeFiles/lz4demo32.dir/lz4.c.o
[ 25%] Building C object CMakeFiles/lz4demo32.dir/lz4hc.c.o
[ 37%] Building C object CMakeFiles/lz4demo32.dir/bench.c.o
[ 50%] Building C object CMakeFiles/lz4demo32.dir/lz4demo.c.o
Linking C executable lz4demo32
[ 50%] Built target lz4demo32
Scanning dependencies of target lz4demo64
[ 62%] Building C object CMakeFiles/lz4demo64.dir/lz4.c.o
[ 75%] Building C object CMakeFiles/lz4demo64.dir/lz4hc.c.o
[ 87%] Building C object CMakeFiles/lz4demo64.dir/bench.c.o
[100%] Building C object CMakeFiles/lz4demo64.dir/lz4demo.c.o
Linking C executable lz4demo64
[100%] Built target lz4demo64

 

すると同じディレクトリにlz4demo64, lz4demo32という実行ファイルができる。
このあとinstallとかするんだろうが、システムに入れたくはないので、自分の/binフォルダに入れる。64bitアーキテクチャなのでlz4demo64のほうを。

$ cp ./lz4demo64 ~/bin/lz4

helpを与えてみるとこんな感じ。

$ lz4 -h
*** Compression CLI using LZ4 algorithm , by Yann Collet (Feb 11 2013) ***
Usage :
./lz4demo64 [arg] input output
Arguments :
-c0: Fast compression (default)
-c1: High compression
-d : decompression
-b#: Benchmark files, using # compression level
-t : check compressed file
-h : help (this text)
input  : can be ‘stdin’ (pipe) or a filename
output : can be ‘stdout'(pipe) or a filename or ‘null’

 

試してみよう!

 

手元にあった685MBytesのFreeBSDインストールディスクイメージをgzip, bzip2, lz4の三種で圧縮、伸長し、その速度と圧縮効率をグラフにしてみた。

それがこれ。スクリーンショット 2013-02-11 21.50.16

青が圧縮時、緑が伸張時にかかった秒数を左軸で示す。
圧縮後、どれくらいのサイズに縮んだかを黄色、右の軸で示す。

gzip, bzip2で6割程度のサイズにまで圧縮したのに対し、lz4は75%に留まる。

そして気になる圧縮伸長では。
lz4が圧縮ではほぼぶっちぎりである。
しかし一方の伸張ではgzipと同じくらいで公式サイトの額面通りには行かなかった。

ただ、圧縮したものがインストールディスク、つまり中身は圧縮済みデータが多かろう点には注意が必要かもしれない。
仮想マシンのディスクイメージだったらまた面白い結果が出たかもしれないけど時間切れである。

え?lzmaですか?試したけど明らかに遅くて途中でやめた。

それからマシン負荷も気になって三種アーカイバのload averageも記録したけどグラフにするの面倒でやめた。

 

まとめ

伸張の方はまだまだ使わないと分からないけど、圧縮は本当に速い。
あっという間に終わってリアルで「えっ?」と言ったほど。

ただ、弱点があって、それはoutputのファイル名を指定しないといけないこと。
zcatのようなもので、これは弱点というよりそういう仕様なんで何とも言えない。

本記事のマクラに出したバックアップへの利用にもちょっと。

でも速いぞ。おまえらも一度使ってみろ。

No tags for this post.

MovableType

Pocket

おなごもすなるMovableTypeを。

まず注意。

Xの入っていないサーバにインストールするときには、あらかじめImageMagick-nox11-6.7.4.4_1 を入れておく!

インストール

下記からインストール

ただ、ImageMagickに依存しているので、何も考えずにインストールするとX関連のportsをたくさん呼び寄せて大変なことになる。

あらかじめImageMagick-nox11をインストールしておくとよいでしょう。

(/etc/make.confにWITHOUT_X11=yes という手もあるが)

# cd /usr/ports/japanese/MT
# make config
# make install clean

make configでUSE_APACHEをチェックしておくと、apacheの設定ディレクトリに必要なファイルを入れてくれるので便利。

(/usr/local/etc/apache22/Includes)

また、デフォルトだとバックエンドのDBにsqliteを使ってくれるのは、個人用との場合には嬉しいですな。

MovableTypeの設定

apache22再起動

# /usr/local/etc/rc.d/apache22 restart

以下にアクセス。あとは画面手順に沿う。

http://<サーバのアドレス>/MTcgi/mt-wizard.cgi

スタティックウェブパス、スタティックファイルパスは、FreeBSDでportsから入れた場合だとそれぞれ/MT、/usr/local/www/data/mt-static。

具体的にはapacheの以下の設定で指定した場所。

<IfModule alias_module>
Alias /MT "/usr/local/www/data/mt-static"
ScriptAlias /MTcgi "/usr/local/www/cgi-bin/mt"
</IfModule>
スタティックウェブパス: /MT
スタティックファイルパス: /usr/local/www/data/mt-static

最初のウェブサイトを作る。movabletype専用ならサーバ直下でいいけど、そうでないなら適当なディレクトリを指定する。

それに合わせて、サーバ上にディレクトリを作る。忘れずに権限を変えておく。

# mkdir /usr/local/www/apache22/data/m
# chown www:www /usr/local/www/apache22/data/m

あとはまあ。movabletypeの指定に従う。

No tags for this post.