【預研】Storm C++ Wrapper demo的單機版本實現

aganlengzi發表於2016-11-23

基礎知識思考整理
http://blog.csdn.net/aganlengzi/article/details/53302256

主要是參照[1][2][3]實現一個C++寫的WordCountTopology的demo併成功執行,記錄一下,原始碼和具體的實現參照https://github.com/Aganlengzi/stormcpp-demo
系統和其中各軟體的版本資訊如下:

Ubuntu12.04 64bit
Apache-storm-1.0.2
Apache-maven-3.0.5
Python2.7.6
Java1.7.0_79
Zookeeper-3.3.5
Jsoncpp-src-0.6.0-rc2 

其中,這個jsoncpp需要是嚴格這個版本,我使用最新版本的結果出現錯誤,換了另一個c++的json直譯器也出錯,最後才發現原因是在這個版本的問題。

在storm安裝完成之後就一直想使用最熟悉的C++來開發相應的例子,但是參照了網上較少的兩處資源(CSDN[1]和國外的一個前輩[2])後還是沒能夠成功,現在想來這和軟體版本應該是有著莫大的關係。

在前一篇實踐中,我介紹了整個環境的搭建過程和執行自帶的wordCountTopology的例子,這篇實現的c++的demo實際上是和這個自帶例子的功能和原理是一致的,只是將其中的spout、bolt都換成了c++實現(參照[3])而不是split功能僅僅用python實現。

主要參照的是jsoncpp的安裝[4]和原始碼例子demo[3],但是將整個原始碼工程重新組織了一下,主要是適應我個人的習慣。另外,我的整個工程是在storm-starter中進行的,所以相當於是在storm-starter中新增了另外一個可以執行的類WordCountTopologyCpp。WordCountTopologyCpp.Java參照[3],放在/path/to/storm-starter/src/jvm/org/apache/storm/starter/,這個c++工程放在了/path/to/storm-starter/multilang/resources中,實際就是需要編譯結果和shell檔案,方便起見放在了這裡,整個結構如下圖:
這裡寫圖片描述

需要注意的問題在前面的部落格中基本上都有說到,在這裡結合我自己遇到的總結一下:
1)jsoncpp版本選擇Jsoncpp-src-0.6.0-rc2,建議編譯成靜態庫或者動態庫也可以放在開發工程的本地使用,而不是放在系統全域性使用這個庫。通過CMake可以非常容易做到一個C++工程的組織和編譯。出現的問題類似於關鍵字:

Json::Value::value***
或者
Operator=***

還可能存在的一個問題是,在使用maven打包的jar中執行的時候找不到.so動態連結庫,如果是自己的庫的話建議使用靜態連結的方式進行編譯(只使用.a檔案),這樣的好處是不會出現庫檔案找不到的情況另外替換也比較方便。

2)仿照storm-starter中自帶的WordCountTopology例子,使用Java作為一個程式的殼。相當於每一個獨立的程式是整個流水線上的一個功能工人。只不過這個工人是用C++實現的。

3)使用shell指令碼來呼叫可執行檔案,也就是編譯好的spout,bolt等,這樣時機上還有個好處是在Java程式的殼確定好之後,可以專注開發c++程式和其中的功能。

#/bin/bash
chmod a+x count
./count

4)使用sudo提升當前使用者的許可權可能能夠解決cannot execute *等問題。

5)其它問題我沒怎麼遇到,如有其它問題可以參照[1][3]
Demo中,Storm.h中實現了基本型別Spout、Bolt和BasicBolt類還有一些工具函式,SplitSentence.h(實際上在這個demo中感覺叫做WordCount.h比較好)基於上述基本型別實現了WordCount的spout和bolt類。然後後面的三個檔案中只要宣告物件並且呼叫其中的run成員函式就好了,就是讓工人動起來。

值得注意一點的是,在執行過程中的log資訊很多,我剛開始接觸並不是十分理解其中的每個的含義,這在後面需要研究一下。但是[2]中實現的基本原始碼中是有中間結果和最後結果的檔案儲存的,所以可以檢視。例如,在SplitSentence.h中,count Bolt的實現中可見最終結果儲存到對應檔案中的:
這裡寫圖片描述
結果檔案路徑下:
這裡寫圖片描述
這個路徑要保證兩點,首先是到目錄的最後一級是存在的;另外就是對這個路徑是有寫許可權的。否則程式在執行的過程中仍然可能掛掉。
參考
[1] http://blog.csdn.net/jmppok/article/details/16827837
[2] http://demeter.inf.ed.ac.uk/cross/stormcpp.html
[3] http://blog.csdn.net/lybingo/article/details/52873673
[4] http://blog.sina.com.cn/s/blog_752aac070101cnfr.html

相關文章