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中的资源了
分享到:
相关推荐
### Java大数据内容_8Redis、Thrift、Hadoop2 #### 1. Redis 安装、命令行及开发 Redis 是一款开源的、高性能的键值存储系统,它以其独特的特性成为了众多应用中的首选数据存储解决方案之一。下面将详细介绍Redis...
- 通过`getResource()`方法获取连接,并执行Redis命令。 - 在使用完毕后,调用`returnResource()`方法将连接返回到连接池中。 **示例代码:** ```java import redis.clients.jedis.Jedis; import redis.clients....
这里`<your_thrift_file>.thrift`是你的Thrift定义文件。该命令会生成相应的Java接口文件和实现类,方便你在Java程序中调用Thrift服务。 以上就是本次Java大数据作业中涉及的主要知识点,包括Redis的各种数据类型、...
接着,在PHP环境中,需要获取Thrift的PHP库,通常是通过Composer来管理依赖。然后,使用Thrift的IDL文件来生成PHP客户端代码,这些代码会提供连接HBase、创建表、插入数据、查询数据等操作的方法。最后,开发者可以...
Flume 是 Apache Hadoop 生态系统中的一个分布式、可靠且可用于有效收集、聚合和移动大量日志数据的工具。在本场景中,我们关注的是如何使用 Python 与 Flume 通过 Thrift 协议来实现日志收集。Thrift 是一个跨语言...
"Python 通过 Thrift 访问 HBase" 在大数据时代,HBase 作为一个分布式的、面向列的 NoSQL 数据库,广泛应用于大规模数据存储和处理中。Python 作为一门流行的编程语言,也提供了多种方式来访问 HBase。其中,...
【标题】: "通过Thrift使用C++访问HBase" 【描述】: "本文档详述了如何在Linux和Windows环境下配置Thrift环境并使用HBase的C++客户端。" 【标签】: "hadoop hbase thrift boost" 在IT领域,特别是大数据处理中,...
总结一下,"hbase_hive_thrift_php"这个主题涵盖了如何使用PHP通过Thrift与HBase和Hive进行交互,以实现大数据的存储、管理和Web应用中的查询。这种技术栈对于需要在PHP环境中处理大规模数据的项目非常有价值。
在IT行业中,Thrift是一种高性能、可扩展的跨语言服务开发框架,由Facebook开源。...通过本文的实践,你可以进一步理解如何在PHP和Python之间使用Thrift进行通信,这对于构建多语言服务架构有着重要的价值。
本主题将详细探讨如何利用Java通过Thrift-0.9.1版本来读取HBase表数据。 HBase是一个基于Google Bigtable设计的开源NoSQL数据库,它构建在Hadoop之上,提供高可靠性、高性能、分布式的行存储。HBase支持实时读写,...
1. **获取正确版本的库**:可以从Hive源码仓库或者Thrift官方仓库获取最新或兼容的PHP库,确保它们是为当前环境编译的。 2. **重新编译Thrift**:如果需要,可以重新编译Thrift以生成适用于PHP的库,确保所有依赖项...
标题中的“test_hive.rar_ThriftHive.php_hive_hive php_php hive_php hive Thr”暗示了我们讨论的主题是关于使用PHP通过Thrift接口与Hive数据仓库进行交互的一个库,具体来说,是一个名为“ThriftHive.php”的文件...
这些可以从Apache Thrift官方网站获取。下载后,解压源码包。 2. **生成Thrift客户端接口代码** 找到Hbase的源码包中的HBase.Thrift文件,将其复制到thrift-0.9.1.exe同一目录下。打开命令行,切换到thrift-0.9.1...
在压缩包中的`ljg_resource1`文件可能是一个示例`.thrift`文件,或者是包含解析和生成mock数据代码的资源文件。具体用途需要解压后查看内容才能明确。 总的来说,这个压缩包提供了一种方法,根据Thrift定义的数据...
php 使用thrift客户端访问服务器测试 下载后 放到站点根目录,设置 thrift_test.php里的 $socket = new TSocket('10.200.28.43', 10001); 修改为默认服务器和端口 后 直接访问 http://localhost/thrift_test.php
PHP ThriftSQL ThriftSQL.phar存档旨在提供对PHPSQL-on-Hadoop框架的访问。 它将Thrift和各种服务包捆绑在一起,并公开了用于在各种框架上运行查询的通用接口。 当前支持以下引擎: 蜂巢-在HiveServer2节俭接口,...
- 获取源代码:从Thrift官方网站或者通过Git下载源代码。 - 配置依赖:确保系统安装了必要的依赖库,如Boost, zlib, libevent等。 - 配置:运行`./configure`脚本来检查系统环境并生成Makefile。 - 编译:执行`...