在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 相关文章推荐
Oracle Faq(Oracle的版本)
Oct 09 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
php+js iframe实现上传头像界面无跳转
Apr 29 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
PHP函数超时处理方法
Feb 14 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
PHP.vs.JAVA
Apr 29 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
laravel实现简单用户权限的示例代码
May 28 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
在laravel5.2中实现点击用户头像更改头像的方法
Oct 14 PHP
php并发加锁问题分析与设计代码实例讲解
Feb 26 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
使用 php4 加速 web 传输
2006/10/09 PHP
php标签云的实现代码
2012/10/10 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
js实现倒计时关键代码
2017/05/05 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
python实现神经网络感知器算法
2017/12/20 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
简单了解python的内存管理机制
2019/07/08 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
python openCV自制绘画板
2020/10/27 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
如何设置Java的运行环境
2013/04/05 面试题
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
天地会口号
2014/06/17 职场文书
工会趣味活动方案
2014/08/18 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
使用 Apache 反向代理的设置技巧
2022/01/18 Servers