在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 中的类
Oct 09 PHP
php 缓存函数代码
Aug 27 PHP
必须收藏的php实用代码片段
Feb 02 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
Feb 12 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之密码加密的几种方式
2015/07/29 PHP
PHP可变函数学习小结
2015/11/29 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
Python读取网页内容的方法
2015/07/30 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
python中返回矩阵的行列方法
2018/04/04 Python
python画折线图的程序
2018/07/26 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
python中使用.py配置文件的方法详解
2020/11/23 Python
企事业单位求职者的自我评价
2013/12/28 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
气象学专业个人求职信
2014/04/22 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
python脚本框架webpy的url映射详解
2021/11/20 Python