作りかけの何かが出てきたのでサルベージしておく
ぶっちゃけ、$ hadoop dfs ~ をPHPのコマンド風に呼び出せるようにしてみただけ
※ で、execしている
たしか途中でいらなくなったので、作ってる途中でお蔵入りしたはず
めっちゃ遅い
<?php
class HadoopWrapper
{
/**
* ファイルの内容を取得する
*
* @param unknown $filename
*/
function file_get_contents($filename)
{
$cmd = sprintf(" -cat %s", self::getPath($filename));
$ret = self::exec($cmd);
return (join("\n", $ret["stdout"]));
}
/**
* ファイルの内容を取得する
*
* @param unknown $filename
*/
function file_put_contents($filename, $data, $flags = 0)
{
$tempname = $filename;
{ // テンポラリにディレクトリを作成
$dirname = sys_get_temp_dir() . "/" . "hadoop";
@mkdir($dirname);
@chmod($dirname, 0777);
}
{ // テンポラリにファイルを作成
$tempname = tempnam($dirname, 'dfs');
$tempanme = md5($filename);
@chmod($tempname, 0777);
}
{ // dfs上のファイルをローカルにコピーする
@unlink($tempname);
$cmd = sprintf(" -get %s %s", self::getPath($filename), $tempname);
$ret = self::exec($cmd);
}
// ローカルのファイルを編集
// 複数プロセスから書き込まれる可能性があるので排他制御を行う
file_put_contents($tempname, $data, $flags | LOCK_EX);
{ // 編集した結果のファイルをdfsに上げ直す
// はじめに元のファイルを削除する
$ret = self::unlink($filename);
// 改めてアップロードする
$cmd = sprintf(" -put %s %s", $tempname, self::getPath($filename));
$ret = self::exec($cmd);
// 使い終わったファイルは消しておく
// @unlink($tempname);
return $ret;
}
}
function unlink($filename)
{
$cmd = sprintf(" -rm %s", self::getPath($filename));
$ret = self::exec($cmd);
}
/**
* ファイルの存在を確認する
*
* @param string $filename
* チェックしたいファイル名
* @return boolean
*/
function file_exists($filename)
{
$cmd = sprintf(" -test -e %s", self::getPath($filename));
$ret = self::exec($cmd);
return ($ret["status"] == 0 ? true : false);
}
/**
* ディレクトリを作成する
* デフォルトの動作で、再帰的にディレクトリを作成する
*
* @param unknown $pathname
* @return boolean
*/
function mkdir($pathname)
{
$pathname = self::getPath($pathname);
// 既にファイルが存在すれば、何もしない
if (self::file_exists($pathname)) {
return (true);
}
$cmd = sprintf(" -mkdir %s", self::getPath($pathname));
$ret = self::exec($cmd);
}
/**
* パーミッションを変更する
* デフォルトの動作で、再帰的に変更する
* @param unknown $filename
* @param unknown $mode
* @return boolean
*/
function chmod($filename, $mode=0777)
{
$cmd = sprintf(" -chmod -R %o %s", $mode, self::getPath($filename));
$ret = self::exec($cmd);
return (true);
}
/**
* ファイル名が"/"から始まっていなければ
* フルパスに変更する
*
* @param unknown $filename
* @return unknown
*/
function getPath($filename)
{
if (! preg_match("&^/&", $filename)) {
$filename = sprintf("%s/%s", HDF_DIR, $filename);
}
return ($filename);
}
function exec($cmd)
{
$output = "";
$return = 0;
exec("hadoop dfs $cmd", $output, $return);
return (array(
"stdout" => $output,
"status" => $return
));
}
}