在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执行速度全攻略(上)
Oct 09 PHP
PHP 中的面向对象编程:通向大型 PHP 工程的办法
Dec 03 PHP
php error_log 函数的使用
Apr 13 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
Nov 07 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
PHP多进程编程实例
Oct 15 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
PHP缓冲区用法总结
Feb 14 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 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教程 变量定义
2009/10/23 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
Python中getpass模块无回显输入源码解析
2018/01/11 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
比利时买床:Beter Bed
2017/12/06 全球购物
介绍一下Linux中的链接
2016/05/28 面试题
政风行风建设责任书
2014/07/23 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
小学安全工作总结2015
2015/05/18 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
Python标准库之typing的用法(类型标注)
2021/06/02 Python
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python
Go归并排序算法的实现方法
2022/04/06 Golang