在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 调试环境(IIS+PHP+MYSQL)
Jan 10 PHP
PHP开发不能违背的安全规则 过滤用户输入
May 01 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
php页面防重复提交方法总结
Nov 25 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
腾讯CMEM的PHP扩展编译安装方法
Sep 25 PHP
Symfony查询方法实例小结
Jun 28 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
Jul 27 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 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配置参数总结
2013/06/14 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
python实现根据ip地址反向查找主机名称的方法
2015/04/29 Python
Python基于numpy灵活定义神经网络结构的方法
2017/08/19 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
浅谈python3中input输入的使用
2019/08/02 Python
python datetime中strptime用法详解
2019/08/29 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
什么是Python中的匿名函数
2020/06/02 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
2014年党务公开实施方案
2014/02/27 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
创业计划书之都市休闲农庄
2019/12/28 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python