php可以通过thrift连接hbase,同样php可以通过thrift读取hadoop资源(HDFS资源)。
准备:
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.\n";
} 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:\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 "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 . "\n";
}
$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.2074880297866E+18
java获得php传递数据:4207488029786585088
解决方法:
修改hadoop-0.20.2\src\contrib\thriftfs\if\hadoopfs.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中的资源了
分享到:
相关推荐
1 Redis安装练习 问题 依次完成以下2小题的任务: 1) 安装Redis 2) 配置复制
课后作业 1 Redis常用的数据类型有什么? 2 如何配置启动持久化AOF? 3 查看以test开头的所有的key 4 Redis如何将key为a的hash中key为b对应的值加1 5 Redis有几种订阅方法?...9 thrift生成java接口的命令
1 Redis安装、命令行及开发 1.1 Redis安装部署 1.1.1 Redis简介 Redis简介 Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。...
python通过thrift访问hbase.docx
php访问hbase时,采用thrift的方式,编译了thrift和thrift2两套代码
php 使用thrift客户端访问服务器测试 下载后 放到站点根目录,设置 thrift_test.php里的 $socket = new TSocket('10.200.28.43', 10001); 修改为默认服务器和端口 后 直接访问 http://localhost/thrift_test.php
Golang通过Thrift框架完美实现跨语言调用
flume通过thrift协议收集日志-Python。博客地址:http://blog.csdn.net/wangshuwei5/article/details/48902757
php thrift 客户端调用 python服务端,学习了解thrif非常有用附代码和centos thift 安装文件
PHP ThriftSQL ThriftSQL.phar存档旨在提供对PHPSQL-on-Hadoop框架的访问。 它将Thrift和各种服务包捆绑在一起,并公开了用于在各种框架上运行查询的通用接口。 当前支持以下引擎: 蜂巢-在HiveServer2节俭接口,...
python3通过thrift连接hbase模块修改版,其中hbase-python3,里面的path,根据实际实际路径修改.
本文档详细说明了Linux和windows系统下配置thrift环境和hbaseC++客户端的使用。
windows下使用MinGW编译thrift方法: https://blog.csdn.net/xzhswust/article/details/126914014 windows下使用VS2015编译thrift方法: https://blog.csdn.net/xzhswust/article/details/126915345
Java通过thrift连接hbase.docxJava通过thrift连接hbase.docx
C#通过thrift连接hbase操作步骤,含有thrift客户端测试代码。
这是Apache Thrift框架的一个简单示例,用于在多语言环境中进行远程服务调用。不要积分啊,旨在进行技术交流。邮箱:whdsmile@163.com,欢迎来信!
分析Thrift的结构动机是为了实现服务端能取到客户端的IP,因此需要对它的结构、调用流程有些了解。另外,请注意本文针对的是TNonblockingServer,不包含TThreadPoolServer、TThreadedServer和TSimpleServer。 ...
然后运行 restart_thrift.sh 脚本就可以直接启动 ps 一下进程是否正常,如果错误请查看日志 然后就可以使用线下的php直接调用, 代码是从网上找到的,比较容易入门 当然也可以直接导入java目录下的java工程,直接运行...
2.4.2 Avro,REST,以及Thrift 2.5 示例 2.5.1 模式 2.5.2 加载数据 2.5.3 Web查询 2.6 HBase和RDBMS的比较 2.6.1 成功的服务 2.6.2 HBase 2.6.3 实例:HBase在Streamy.com的使用 2.7 Praxis ...