在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 高性能书写
Dec 11 PHP
PHP正则表达式之定界符和原子介绍
Oct 05 PHP
解决File size limit exceeded 错误的方法
Jun 14 PHP
ThinkPHP3.1基础知识快速入门
Jun 19 PHP
php内嵌函数用法实例
Mar 20 PHP
10款PHP开源商城系统汇总介绍
Jul 23 PHP
smarty学习笔记之常见代码段用法总结
Mar 19 PHP
php将文件夹打包成zip文件的简单实现方法
Oct 04 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
Yii框架的路由配置方法分析
Sep 09 PHP
laravel框架中视图的基本使用方法分析
Nov 23 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预定义变量9大超全局数组用法详解
2016/04/23 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
Vue 自定义动态组件实例详解
2018/03/28 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
nodejs aes 加解密实例
2018/10/10 NodeJs
亲自动手实现vue日历控件
2019/06/26 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
python 爬取微信文章
2016/01/30 Python
深入理解Python3中的http.client模块
2017/03/29 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
会计学自我鉴定
2014/02/06 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
小学亲子活动总结
2014/07/01 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
作文评语怎么写
2014/12/25 职场文书
职位证明模板
2015/06/23 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python