php thriftによるhadoopリソースの取得
phpはthriftでhbaseに接続でき、同様にphpはthriftでhadoopリソース(HDFSリソース)を読み出すことができる.
準備:
phpにはthriftのlibaryが必要です
packages:hadoop-0.20.2\src\contrib\thriftfs\gen-php
ソース:
hadoopのthriftを起動
hadoop-0.20.2\src\contrib\thriftfs\scripts\start_thrift_server.sh 59256
problem one:
hadoopディレクトリではなくシステムディレクトリにファイルを作成
理由:
thrift起動時にデフォルトのプロファイルをロード
解決方法:
start_の変更thrift_server.shファイル
TOP=/usr/local/hadoop-0.20.2
CLASSPATH=$CLASSPATH:$TOP/conf
problem two:
java.lang.NullPointerException
at org.apache.hadoop.thriftfs.HadoopThriftServer$HadoopThriftHandler.write(HadoopThriftServer.java:282)
at org.apache.hadoop.thriftfs.api.ThriftHadoopFileSystem$Processor$write.process(Unknown Source)
at org.apache.hadoop.thriftfs.api.ThriftHadoopFileSystem$Processor.process(Unknown Source)
at com.facebook.thrift.server.TThreadPoolServer$WorkerProcess.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
理由:
JAvaが返すmap hash idはlongタイプであり、php(32ビット)はlongタイプのデータを格納できず、floatデータに変換して精度が失われる.
private long nextId = new Random().nextLong();
JAva返却データ:4207488029786584864
php取得データ:4.2074880297866 E+18
JAva取得php転送データ:4207488029786585088
解決方法:
hadoop-0.20.2srccontribthriftfsifhadoopfsを変更します.thriftファイル
変更
struct ThriftHandle {
i64 id
}
を選択します.
struct ThriftHandle {
string id
}
php packagesの再生成
thrift --gen php hadoopfs.thrift
変更org.apache.hadoop.thriftfs.api.ThriftHandleクラス
変更
public long id;
次のようになります.
public String id;
対応するプログラムの変更
org.apache.hadoop.thriftfs.HadoopThriftServer
変更
long id = insert(out);
ThriftHandle obj = new ThriftHandle(id);
を選択します.
long id = insert(out);
String _id = String.valueOf(id);
ThriftHandle obj = new ThriftHandle(_id);
対応するプログラムの変更
再パッケージしてhadoopのthriftを起動します.
hadoop-0.20.2\src\contrib\thriftfs\scripts\start_thrift_server.sh 59256
phpはhadoopのリソースに接続して取得できます
準備:
phpにはthriftのlibaryが必要です
packages:hadoop-0.20.2\src\contrib\thriftfs\gen-php
ソース:
<?php
$GLOBALS['THRIFT_ROOT'] = ROOTPATH . '/lib/thrift';
require_once($GLOBALS['THRIFT_ROOT'].'/Thrift.php');
require_once($GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php');
require_once($GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php');
require_once($GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php');
require_once($GLOBALS["THRIFT_ROOT"] . "/packages/hadoopfs/ThriftHadoopFileSystem.php");
$hadoop_socket = new TSocket("localhost", 59256);
$hadoop_socket -> setSendTimeout(10000); // Ten seconds
$hadoop_socket -> setRecvTimeout(20000); // Twenty seconds
$hadoop_transport = new TBufferedTransport($hadoop_socket);
$hadoop_protocol = new TBinaryProtocol($hadoop_transport);
$hadoopClient = new ThriftHadoopFileSystemClient($hadoop_protocol);
$hadoop_transport -> open();
try {
// create directory
$dirpathname = new hadoopfs_Pathname(array("pathname" => "/user/root/hadoop"));
if($hadoopClient -> exists($dirpathname) == TRUE) {
echo $dirpathname -> pathname . " exists.
";
} else {
$result = $hadoopClient -> mkdirs($dirpathname);
}
// put file
$filepathname = new hadoopfs_Pathname(array("pathname" => $dirpathname -> pathname . "/hello.txt"));
$localfile = fopen("hello.txt", "rb");
$hdfsfile = $hadoopClient -> create($filepathname);
while(true) {
$data = fread($localfile, 1024);
if(strlen($data) == 0)
break;
$hadoopClient -> write($hdfsfile, $data);
}
$hadoopClient -> close($hdfsfile);
fclose($localfile);
// get file
echo "read file:
";
print_r($filepathname);
$data = "";
$hdfsfile = $hadoopClient -> open($filepathname);
print_r($hdfsfile);
while(true) {
$data = $hadoopClient -> read($hdfsfile, 0, 1024);
if(strlen($data) == 0)
break;
print $data;
}
$hadoopClient -> close($hdfsfile);
echo "listStatus:
";
$result = $hadoopClient -> listStatus($dirpathname);
print_r($result);
foreach($result as $key => $value) {
if($value -> isdir == "1")
print "dir\t";
else
print "file\t";
print $value -> block_replication . "\t" . $value -> length . "\t" . $value -> modification_time . "\t" . $value -> permission . "\t" . $value -> owner . "\t" . $value -> group . "\t" . $value -> path . "
";
}
$hadoop_transport -> close();
} catch(Exception $e) {
print_r($e);
}
?>
hadoopのthriftを起動
hadoop-0.20.2\src\contrib\thriftfs\scripts\start_thrift_server.sh 59256
problem one:
hadoopディレクトリではなくシステムディレクトリにファイルを作成
理由:
thrift起動時にデフォルトのプロファイルをロード
解決方法:
start_の変更thrift_server.shファイル
TOP=/usr/local/hadoop-0.20.2
CLASSPATH=$CLASSPATH:$TOP/conf
problem two:
java.lang.NullPointerException
at org.apache.hadoop.thriftfs.HadoopThriftServer$HadoopThriftHandler.write(HadoopThriftServer.java:282)
at org.apache.hadoop.thriftfs.api.ThriftHadoopFileSystem$Processor$write.process(Unknown Source)
at org.apache.hadoop.thriftfs.api.ThriftHadoopFileSystem$Processor.process(Unknown Source)
at com.facebook.thrift.server.TThreadPoolServer$WorkerProcess.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
理由:
JAvaが返すmap hash idはlongタイプであり、php(32ビット)はlongタイプのデータを格納できず、floatデータに変換して精度が失われる.
private long nextId = new Random().nextLong();
JAva返却データ:4207488029786584864
php取得データ:4.2074880297866 E+18
JAva取得php転送データ:4207488029786585088
解決方法:
hadoop-0.20.2srccontribthriftfsifhadoopfsを変更します.thriftファイル
変更
struct ThriftHandle {
i64 id
}
を選択します.
struct ThriftHandle {
string id
}
php packagesの再生成
thrift --gen php hadoopfs.thrift
変更org.apache.hadoop.thriftfs.api.ThriftHandleクラス
変更
public long id;
次のようになります.
public String id;
対応するプログラムの変更
org.apache.hadoop.thriftfs.HadoopThriftServer
変更
long id = insert(out);
ThriftHandle obj = new ThriftHandle(id);
を選択します.
long id = insert(out);
String _id = String.valueOf(id);
ThriftHandle obj = new ThriftHandle(_id);
対応するプログラムの変更
再パッケージしてhadoopのthriftを起動します.
hadoop-0.20.2\src\contrib\thriftfs\scripts\start_thrift_server.sh 59256
phpはhadoopのリソースに接続して取得できます