在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 相关文章推荐
DOMXML函数笔记
Oct 09 PHP
PHP也可以?成Shell Script
Oct 09 PHP
PHP_Cooikes不同页面无法传递的解决方法
Mar 07 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
PHP中调用SVN命令更新网站方法
Jan 07 PHP
php 利用array_slice函数获取随机数组或前几条数据
Sep 30 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 PHP
PHP中PCRE正则解析代码详解
Apr 26 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
laravel按天、按小时,查询数据的实例
Oct 09 PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
php开发工具之vs2005图解
2008/01/12 PHP
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
Python序列化pickle模块使用详解
2020/03/05 Python
python中字典增加和删除使用方法
2020/09/30 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
个人四风问题整改措施
2014/10/24 职场文书
政工师工作总结2015
2015/05/26 职场文书
个人更名证明
2015/06/23 职场文书
Python sklearn分类决策树方法详解
2022/09/23 Python