在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中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
WordPress开发中用于标题显示的相关函数使用解析
Jan 07 PHP
CI框架实现cookie登陆的方法详解
May 18 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
Nov 17 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
php使用parse_str实现查询字符串解析到变量中的方法
Feb 17 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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编码转换
2012/11/05 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
php实现文章评论系统
2019/02/18 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
探究python中open函数的使用
2016/03/01 Python
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
Python 变量的创建过程详解
2019/09/02 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
Html5自定义字体解决方法
2019/10/09 HTML / CSS
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
2014年留守儿童工作总结
2014/12/10 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL