一、前言
用C/C++开发hbase应用,需要用到thrift接口。在windows平台使用Visual Studio时,要比在linux平台复杂一些,主要是因为一些依赖库无法做到自动安装(类似yum install或 apt-get install那样),其次是因为Linux本来就是hbase及其依赖库的原生平台。但总体而言,两个平台的过程大体相似。
开发环境需要的组件包括:
- 接口库libthrift、libthriftnb(可选),源码编译安装;
- 依赖库boost,可二进制安装或编译安装;
- 依赖库libevent(可选),源码编译安装;
- 依赖库openssl,可解压安装或二进制安装;
- thrift接口源码文件。
二、boost库
boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。在Windows平台有二进制安装或编译安装两种方式,这里选择前一种。
- 从官网https://dl.bintray.com/boostorg/release/1.64.0/binaries/选择安装文件下载,注意与VS版本、OS位数保持一致,否则将来会报:链接错误—找不到库文件;
- Winows 64位、VS 2015对应的安装文件是boost_1_64_0-msvc-14.0-64.exe,下载后开始安装,过程略,假设安装目录为D:oost_1_64_0;
- 所有lib和dll文件均在D:oost_1_64_0lib64-msvc-14.0文件夹,而头文件(注意是hpp而非h)在boost子目录。
三、libevent库(可选)
Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,只有在用到libthriftnb才需要。需源码编译安装。
- 访问官网http://libevent.org/,选择合适的稳定版源码包进行下载,假设为libevent-2.0.22-stable.tar.gz;
- 解压至相应目录,假设为D:libevent;因其中缺少一个文件test/print_winsock_errors.c,需补上,方法参见另一篇随笔《windows编译libevent时报告“缺少print_winsock_errors.obj”的解决》;
- 使用VS命令提示工具,cd至D:/libevent,开始编译:nmake /f Makefile.nmake
- 完成后,生成的库文件libevent_core.lib和libevent.lib及原有的h文件均在D:/libevent目录。
四、openssl库
openssl库是一个被很多项目用到的依赖库,解压安装和二进制安装均可。
- 解压安装:这里直接使用了另一个项目的解压包,下载地址是http://downloads.datastax.com/cpp-driver/windows/,选择解压包时依然注意与VS版本、OS位数保持一致,假设是openssl-1.0.2l-win64-msvc140.zip,解压目录假设为D:openssl,静态库文件libeay32.lib和ssleay32.lib在D:opensslstaticlib文件夹;
- 二进制安装:下载OpenSsl-Win64.exe开始安装,网上资源很多,不多说。
五、libthrift及libthritnb
libthrift是非阻塞式的服务,一般不需要,只需编译libthrift。
- 从thrift官网https://thrift.apache.org/download下载源码最新安装包thrift_0.10.0.tar.gz,假设解压至目录D:/thrift;
- 修改lib/cpp/3rdparty.props中的BOOST_ROOT、OPENSSL_ROOT_DIR和LIBEVENT_ROOT,或者在随后步骤中设置libthrift工程的properties;
- 用VS打开lib/cpp/thrift.sln(版本较早,可能需要升级),里面有libthrift和libthriftnb两个工程,一般只用第一个;
- 若3rdparty.props文件无效,修改工程的properties:附加incluede目录增加:D:libboost,D:openssl,附加link目录增加:D:libboostoost,D:openssllib;
- 编译libthrift工程,缺省生成的h文件在D:/thriftlibcppsrc hrift文件夹,库文件libthrift.lib在D:/thriftlibcppDebug(或Release)文件夹,注意只有本依赖库需要区分Debug版和Release版。
- 如果还需要libthriftnb,设置工程的properties时include目录和link目录再分别增加libevent的相应值即可,略。
六、thrift接口源文件
本部分操作需在hbase服务器上进行,建议在原生的linux平台。
- 如果不是采用源码编译安装的hbase,安装目录下没有hbase.thrift文件,此时需要下载hbase源码包,从中解压出hbase.thrift;
- hbase提供了两种互不兼容的thrift接口:thrift(也有称为thrift1的)和thrift2,其thrift文件的目录分别为:
src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift
据称,thrift1将被hbase官方抛弃,且thrift2的API与其java API更相似,推荐选择thrift2作为开发接口。
- 生成c++的driver文件库
cp src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift YOURPATH/thrift cd YOURPATH/thrift thrift --gen cpp hbase.thrift
据称,thrift1将被hbase官方抛弃,且thrift2的API与其java API更相似,故选择thrift2作为开发接口。
- 开发目录下新生成gen-cpp文件夹,其下即为所需的接口源码文件,可复制到任意平台的开发环境。
文件夹下有7个文件,但实际上只有6个有用,拷贝到windows平台:
- 在hmaster服务器上启动hbase后,接着启动thrift2服务:
cd /usr/hbase-1.2.5/bin ./hbase-daemon.sh start thrift2 #单节点环境 ./ hbase-daemons.sh start thrift2 #集群环境
注意:如果是集群环境,thrift2服务只随HRegionServer启动,而与HMasterServer无关;编程时要连接的服务器只能是已启动thrift2服务的节点。
七、VS开发注意事项
在VS中创建自己的工程,直接将上述6个接口源文件拷贝过来;
- 修改工程的properties,附加include目录增加:libthrift安装目录d: hriftlibcppsrc,d:libboost,注意:前一个最后不要加thrift文件夹,后一个最后不要加boost文件夹,它们已在thrift接口源码文件中指定;
- 继续修改工程的properties,附加link目录增加:libthrift、libboost和openssl库所在目录:D:/thriftlibcppDebug(或Release), D:oost_1_64_0lib64-msvc-14.0, D:opensslstaticlib;
- 继续修改工程的properties,链接库增加libthrift.lib、libeay32.lib, ssleay32.lib;
- 如果应用程序源码是从linux平台移植过来的,可能在#include处要略做调整,使包含的thrift相关头文件目录与接口源码文件中一致。