在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 相关文章推荐
echo, print, printf 和 sprintf 区别
Dec 06 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
PHP MemCached高级缓存配置图文教程
Aug 05 PHP
php 阴历-农历-转换类代码
Jan 16 PHP
浅析php中抽象类和接口的概念以及区别
Jun 27 PHP
php构造函数实例讲解
Nov 13 PHP
thinkPHP中volist标签用法示例
Dec 06 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
PHP封装XML和JSON格式数据接口操作示例
Mar 06 PHP
PHP的静态方法与普通方法用法实例分析
Sep 26 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 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
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
PHP 转义使用详解
2013/07/15 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
详解python解压压缩包的五种方法
2019/07/05 Python
python实现简单的tcp 文件下载
2020/09/16 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
SQL注入攻击的种类有哪些
2013/12/30 面试题
营销与策划个人求职信
2013/09/22 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
优秀党员先进材料
2014/12/18 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
行政处罚事先告知书
2015/07/01 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书