HDFSのラッパー

作りかけの何かが出てきたのでサルベージしておく
ぶっちゃけ、$ 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  
        ));  
    }  
}