php は thrift を通じて hbase に接続でき、同様に php は thrift を通じて hadoop リソース (hdfs リソース) を読み取ることができます。
準備:
php には thrift のライブラリが必要です
packages:hadoop-0.20.2srccontribthriftfsgen-php
ソース コード:
$globals['thrift_root'] = ルートパス。 '/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) ; // 10 秒
$hadoop_socket -> // 20 秒
$hadoop_transport = new tbufferedtransport($hadoop_socket);
$hadoop_protocol = new tbinaryprotocol($hadoop_transport); >$hadoopclient = new thrifthadoopfilesystemclient($hadoop_protocol);
$hadoop_transport -> open();
try {
// ディレクトリを作成
$dirpathname = new hadoopfs_pathname(array("pathname" = > "/user/root/hadoop"));
if($hadoopclient ->exists($dirpathname) == true) {
echo $dirpathname ->
} else {
$result = $hadoopclient -> mkdirs($dirpathname);
}
// put file
$filepathname = new hadoopfs_pathname(array("pathname" =>) ; $dirpathname -> パス名 . "/hello.txt"));
$localfile = fopen("hello.txt", "rb");
$hadoopclient ->ファイルパス名);
while(true) {
$data = fread($localfile, 1024);
if(strlen($data) == 0)
break;
$hadoopclient - > write($hdfsfile, $data);
}
$hadoopclient -> close($hdfsfile);
fclose($localfile);
// ファイルを取得
ファイルを読み取ります:n";
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:n";
$result = $hadoopclient -> liststatus($dirpathname);
print_r($result);
foreach($result as $key => $value) {
if($value -> isdir == "1")
print "dirt" ;
else
print "filet";
print $value -> $value -> $value -> $value -> パス>$hadoop_transport -> close();
} catch(例外 $e) {
print_r($e);
}
?>
Hadoop の節約を開始します
hadoop -0.20.2srccontribthriftfsscriptsstart_thrift_server.sh 59256
問題 1:
Hadoop ディレクトリにファイルを作成するのではなく、システム ディレクトリにファイルを作成する
原因:
Thrift は起動時にデフォルトの構成ファイルをロードします
:
start_thrift_server.sh ファイルを変更します
top=/usr/local/hadoop-0.20.2
classpath=$classpath:$top/conf
問題 2:
java.lang 。 nullpointerException
org.apache.hadoop.thriftfs.hadoopthriftserver$hadoopthrifthandler.write(hadoopthriftserver.java:282)
org.apache.hadoop.thriftfs.api.thrifthadoopfilesystem$processor$write.process(不明なソース)
org.apache.hadoop.thriftfs.api.thrifthadoopfilesystem$processor.process(不明なソース)
com.facebook.thrift.server.tthreadpoolserver$workerprocess.run(不明なソース)
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 から返されるマップ ハッシュ ID はlong型であり、php (32ビット) はlong型データを格納できないため、float データへの変換後に精度が失われます。
private long nextid = new random().nextlong();
java return data: 4207488029786584864 この記事のリンク http://www.cxybl.com/html/wlbc/Php/20120607/28513.html