一、前言
用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:\boost_1_64_0;
- 所有lib和dll文件均在D:\boost_1_64_0\lib64-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:\openssl\static\lib文件夾;
- 二進制安裝:下載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:\libboost\boost,D:\openssl\lib;
- 編譯libthrift工程,缺省生成的h文件在D:/thrift\lib\cpp\src\thrift文件夾,庫文件libthrift.lib在D:/thrift\lib\cpp\Debug(或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:\thrift\lib\cpp\src,d:\libboost,注意:前一個最后不要加thrift文件夾,后一個最后不要加boost文件夾,它們已在thrift接口源碼文件中指定;
- 繼續修改工程的properties,附加link目錄增加:libthrift、libboost和openssl庫所在目錄:D:/thrift\lib\cpp\Debug(或Release), D:\boost_1_64_0\lib64-msvc-14.0, D:\openssl\static\lib;
- 繼續修改工程的properties,鏈接庫增加libthrift.lib、libeay32.lib, ssleay32.lib;
- 如果應用程序源碼是從linux平台移植過來的,可能在#include處要略做調整,使包含的thrift相關頭文件目錄與接口源碼文件中一致。