`
zhangcs053
  • 浏览: 33126 次
  • 性别: Icon_minigender_1
  • 来自: 徐州
社区版块
存档分类
最新评论

php通过thrift获取hadoop资源

阅读更多
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
0
分享到:
评论
4 楼 gongyaxuan 2015-07-14  
最后一步请问如何打包??
3 楼 IntPassion 2013-06-14  
你好,最后几步不是太懂,请问如何重新打包?
2 楼 zhangcs053 2012-07-17  
weiqi1716 写道
请问在哪里修改org.apache.hadoop.thriftfs.api.ThriftHandle类

在hadoop的源码包里有ThriftHandle.java文件
src\contrib\thriftfs\gen-java\org\apache\hadoop\thriftfs\api\ThriftHandle.java
1 楼 weiqi1716 2012-06-27  
请问在哪里修改org.apache.hadoop.thriftfs.api.ThriftHandle类

相关推荐

    java大数据内容_8Redis、Thrift、Hadoop2

    ### Java大数据内容_8Redis、Thrift、Hadoop2 #### 1. Redis 安装、命令行及开发 Redis 是一款开源的、高性能的键值存储系统,它以其独特的特性成为了众多应用中的首选数据存储解决方案之一。下面将详细介绍Redis...

    java大数据案例_8Redis、Thrift、Hadoop2

    - 通过`getResource()`方法获取连接,并执行Redis命令。 - 在使用完毕后,调用`returnResource()`方法将连接返回到连接池中。 **示例代码:** ```java import redis.clients.jedis.Jedis; import redis.clients....

    java大数据作业_8Redis、Thrift、Hadoop2

    这里`&lt;your_thrift_file&gt;.thrift`是你的Thrift定义文件。该命令会生成相应的Java接口文件和实现类,方便你在Java程序中调用Thrift服务。 以上就是本次Java大数据作业中涉及的主要知识点,包括Redis的各种数据类型、...

    php-hbase-thrift

    接着,在PHP环境中,需要获取Thrift的PHP库,通常是通过Composer来管理依赖。然后,使用Thrift的IDL文件来生成PHP客户端代码,这些代码会提供连接HBase、创建表、插入数据、查询数据等操作的方法。最后,开发者可以...

    flume通过thrift协议收集日志-Python

    Flume 是 Apache Hadoop 生态系统中的一个分布式、可靠且可用于有效收集、聚合和移动大量日志数据的工具。在本场景中,我们关注的是如何使用 Python 与 Flume 通过 Thrift 协议来实现日志收集。Thrift 是一个跨语言...

    python通过thrift访问hbase.docx

    "Python 通过 Thrift 访问 HBase" 在大数据时代,HBase 作为一个分布式的、面向列的 NoSQL 数据库,广泛应用于大规模数据存储和处理中。Python 作为一门流行的编程语言,也提供了多种方式来访问 HBase。其中,...

    通过thrift使用c++访问hbase

    【标题】: "通过Thrift使用C++访问HBase" 【描述】: "本文档详述了如何在Linux和Windows环境下配置Thrift环境并使用HBase的C++客户端。" 【标签】: "hadoop hbase thrift boost" 在IT领域,特别是大数据处理中,...

    hbase_hive_thrift_php

    总结一下,"hbase_hive_thrift_php"这个主题涵盖了如何使用PHP通过Thrift与HBase和Hive进行交互,以实现大数据的存储、管理和Web应用中的查询。这种技术栈对于需要在PHP环境中处理大规模数据的项目非常有价值。

    php_thrift_python安装测试记录

    在IT行业中,Thrift是一种高性能、可扩展的跨语言服务开发框架,由Facebook开源。...通过本文的实践,你可以进一步理解如何在PHP和Python之间使用Thrift进行通信,这对于构建多语言服务架构有着重要的价值。

    java 通过thrift-0.9.1读取hbase表数据

    本主题将详细探讨如何利用Java通过Thrift-0.9.1版本来读取HBase表数据。 HBase是一个基于Google Bigtable设计的开源NoSQL数据库,它构建在Hadoop之上,提供高可靠性、高性能、分布式的行存储。HBase支持实时读写,...

    php连接hive thrift的lib依赖包

    1. **获取正确版本的库**:可以从Hive源码仓库或者Thrift官方仓库获取最新或兼容的PHP库,确保它们是为当前环境编译的。 2. **重新编译Thrift**:如果需要,可以重新编译Thrift以生成适用于PHP的库,确保所有依赖项...

    test_hive.rar_ThriftHive.php_hive_hive php_php hive_php hive Thr

    标题中的“test_hive.rar_ThriftHive.php_hive_hive php_php hive_php hive Thr”暗示了我们讨论的主题是关于使用PHP通过Thrift接口与Hive数据仓库进行交互的一个库,具体来说,是一个名为“ThriftHive.php”的文件...

    C#通过thrift连接hbase过程

    这些可以从Apache Thrift官方网站获取。下载后,解压源码包。 2. **生成Thrift客户端接口代码** 找到Hbase的源码包中的HBase.Thrift文件,将其复制到thrift-0.9.1.exe同一目录下。打开命令行,切换到thrift-0.9.1...

    根据 .thrift 获取数据结构,生成 mock 数据.zip

    在压缩包中的`ljg_resource1`文件可能是一个示例`.thrift`文件,或者是包含解析和生成mock数据代码的资源文件。具体用途需要解压后查看内容才能明确。 总的来说,这个压缩包提供了一种方法,根据Thrift定义的数据...

    php使用thrift客户端访问服务器测试

    php 使用thrift客户端访问服务器测试 下载后 放到站点根目录,设置 thrift_test.php里的 $socket = new TSocket('10.200.28.43', 10001); 修改为默认服务器和端口 后 直接访问 http://localhost/thrift_test.php

    php-thrift-sql:一个通过Thrift连接到Hive或ImpalaPHP库

    PHP ThriftSQL ThriftSQL.phar存档旨在提供对PHPSQL-on-Hadoop框架的访问。 它将Thrift和各种服务包捆绑在一起,并公开了用于在各种框架上运行查询的通用接口。 当前支持以下引擎: 蜂巢-在HiveServer2节俭接口,...

    centos6.5编译好thrift

    - 获取源代码:从Thrift官方网站或者通过Git下载源代码。 - 配置依赖:确保系统安装了必要的依赖库,如Boost, zlib, libevent等。 - 配置:运行`./configure`脚本来检查系统环境并生成Makefile。 - 编译:执行`...

Global site tag (gtag.js) - Google Analytics