在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 cout&amp;lt;&amp;lt;的一点看法
Jan 24 PHP
php做下载文件的实现代码及文件名中乱码解决方法
Feb 03 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
给ECShop添加最新评论
Jan 07 PHP
php操作xml入门之cdata区段
Jan 23 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
Nov 08 PHP
PHP实现简易计算器功能
Aug 28 PHP
PHP获取真实IP及IP模拟方法解析
Nov 24 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 COOKIE设置为浏览器进程
2009/06/21 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
javascript RadioButtonList获取选中值
2009/04/09 Javascript
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
python函数的5种参数详解
2017/02/24 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
党委书记岗位职责
2013/11/24 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
开学典礼决心书
2014/03/11 职场文书
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
党员承诺践诺书
2014/05/20 职场文书
土地租赁意向书
2014/07/30 职场文书
工作感言一句话
2015/08/01 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技
使用CSS实现百叶窗效果示例代码
2023/05/07 HTML / CSS