在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 组件化编程技巧
Jun 06 PHP
一些php技巧与注意事项分析
Feb 03 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
php页面缓存ob系列函数介绍
Oct 18 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
php定时计划任务与fsockopen持续进程实例
May 23 PHP
PHP is_subclass_of函数的一个BUG和解决方法
Jun 01 PHP
php之readdir函数用法实例
Nov 13 PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
浅谈laravel orm 中的一对多关系 hasMany
Oct 21 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
document.documentElement的一些使用技巧
2013/04/18 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
vue2里面ref的具体使用方法
2017/10/27 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
iview实现图片上传功能
2020/06/29 Javascript
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
python写日志文件操作类与应用示例
2019/07/01 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
django做form表单的数据验证过程详解
2019/07/26 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
煤矿班组长竞聘书
2014/03/31 职场文书
大学学风建设方案
2014/05/04 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL