在php的yii2框架中整合hbase库的方法


Posted in PHP onSeptember 20, 2018

Hbase通过thrift这个跨语言的RPC框架提供多语言的调用。

Hbase有两套thrift接口(thrift1和thrift2),但是它们并不兼容。根据官方文档,thrift1很可能被抛弃,本文以thrift2整合为例。

1、访问官网http://thrift.apache.org/download,下载

thrift-0.11.0.exe   (生成接口rpc工具,thrift-0.11.0.exe改名thrift.exe,保存在D:\project\thrift\thrift.exe)
thrift-0.11.0.tar.gz(thrift相关库,保存在D:\project\thrift\thrift-0.11.0)

2、访问hbase官网(http://archive.apache.org/dist/hbase/),下载hbase-1.2.6-src.tar.gz

解压保存在D:\project\thrift\hbase-1.2.6

3、生成php接口代码

解压hbase-1.2.6-src.tar.gz,hbase-1.2.6\hbase-thrift\src\main\resources\org\apache\hadoop\hbase文件夹同时存在thrift和thrift2接口描述文件,本文只使用thrift2

在D:\project\thrift目录中输入cmd命令,生成对应php的sdk文件。

thrift -gen php hbase-1.2.6\hbase-thrift\src\main\resources\org\apache\hadoop\hbase\thrift2\hbase.thrift

生成的D:\project\thrift\gen-php目录包含文件:

THBaseService.php
Types.php

4、要通过thrifc调用hbase,需要先启动hbase的接口服务

$HBASE_HOME/bin/hbase-daemon.sh start thrift2 //启动
$HBASE_HOME/bin/hbase-daemon.sh stop thrift2  //停止

5、与yii2整合

在vendor文件夹中新建hbase目录

vendor\hbase\gen-php //复制D:\project\thrift\gen-php
vendor\hbase\php   //复制D:\project\thrift\thrift-0.11.0\lib\php

由于thrift2的php不使用Composer,类库命名方式也不完全符合PSR-4标准, 所以本文使用include_path方式来定位并导入类文件。

common\models\HArticle.php

<?php
namespace common\models;
require_once dirname(dirname(__DIR__)).'/vendor/hbase/php/lib/Thrift/ClassLoader/ThriftClassLoader.php';
use Thrift\ClassLoader\ThriftClassLoader;
$loader = new ThriftClassLoader();
$loader->registerNamespace('Thrift', dirname(dirname(__DIR__)) . '/vendor/hbase/php/lib');
$loader->register();
require_once dirname(dirname(__DIR__)) . '/vendor/hbase/gen-php/Types.php';
require_once dirname(dirname(__DIR__)) . '/vendor/hbase/gen-php/THBaseService.php';
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TSocket;
use Thrift\Transport\TBufferedTransport;
use THBaseServiceClient;
use TGet;

class HArticle
{
  private $host = '192.168.1.108';
  private $port = 9090;
  
  public function get($rowKey){
    $socket = new TSocket($this->host, $this->port);
    $transport = new TBufferedTransport($socket);
    $protocol = new TBinaryProtocol($transport);
    $client = new THBaseServiceClient($protocol);
    $transport->open();
    
    $tableName = "article_2018";
    
    $get = new TGet();
    $get->row = $rowKey;

    $arr = $client->get($tableName, $get);
    $data = array();
    $results = $arr->columnValues;
    foreach($results as $result)
    {
      $qualifier = (string)$result->qualifier;
      $value = $result->value;
      $data[$qualifier] = $value;
    }
    $transport->close();
    return $data;
  }
}

frontend\controllers\TestController.php

<?php
namespace frontend\controllers;
use yii\web\Controller;
use common\models\HArticle;
class TestController extends Controller
{

  public function actionIndex()
  {
    $hArticle = new HArticle();
    $data = $hbaseNews->get('20180908_1f1be3cd26a36e351175015f450fa3f6');
    var_dump($data);
    exit();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
实现php加速的eAccelerator dll支持文件打包下载
Sep 30 PHP
PHP 数据库树的遍历方法
Feb 06 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
php建立Ftp连接的方法
Mar 07 PHP
PHP 验证登陆类分享
Mar 13 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
mysql_escape_string()函数用法分析
Apr 25 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
PHP的反射机制实例详解
Mar 29 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 PHP
解决php扩展安装不生效问题
Oct 25 PHP
php实现在线考试系统【附源码】
Sep 18 #PHP
PHP htmlspecialchars() 函数实例代码及用法大全
Sep 18 #PHP
Laravel用户授权系统的使用方法示例
Sep 16 #PHP
Laravel中错误与异常处理的用法示例
Sep 16 #PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 #PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 #PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 #PHP
You might like
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
PHP静态成员变量
2017/02/14 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
jQuery中实现text()的方法
2019/04/04 jQuery
JavaScript多种图形实现代码实例
2020/06/28 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python实现字典的key和values的交换
2015/08/04 Python
Python实现二叉堆
2016/02/03 Python
Python简单实现子网掩码转换的方法
2016/04/13 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
优秀毕业生推荐信
2013/11/02 职场文书
销售主管岗位职责
2014/02/08 职场文书
《泉水》教学反思
2014/04/11 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
捐款活动总结
2014/08/27 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
图神经网络GNN算法
2022/05/11 Python
Linux下搭建SFTP服务器的命令详解
2022/06/25 Servers