在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+dbfile开发小型留言本
Oct 09 PHP
php adodb连接带密码access数据库实例,测试成功
May 14 PHP
PHP三层结构(上) 简单三层结构
Jul 04 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 PHP
php使用websocket示例详解
Mar 12 PHP
php学习笔记之面向对象
Nov 08 PHP
php通过淘宝API查询IP地址归属等信息
Dec 25 PHP
Yii2简单实现多语言配置的方法
Jul 23 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
yii2 commands模式以及配置crontab定时任务的方法
Aug 19 PHP
laravel 时间格式转时间戳的例子
Oct 11 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写的采集程序
2007/03/16 PHP
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
一文读懂Python 枚举
2020/08/25 Python
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
迎新晚会主持词
2014/03/24 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
你真的会用Mysql的explain吗
2022/03/31 MySQL
python和anaconda的区别
2022/05/06 Python