【預研】Storm C++ Wrapper demo的單機版本實現
基礎知識思考整理
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
相關文章
- 【預研】Storm Ubuntu 12.04 64 bit 的單機版本的安裝和執行ORMUbuntu
- Storm 系列(三)—— Storm 單機版本環境搭建ORM
- [C++ Daily] 使用模板實現簡易Python WrapperC++AIPythonAPP
- JStorm Storm 上手demoJSORM
- 【大資料】Linux下Storm(0.9版本以上)的環境配置和小Demo大資料LinuxORM
- LRU Cache 的簡單 C++ 實現C++
- C++實現單例模式C++單例模式
- 單例模式c++實現單例模式C++
- C++的Stack模板的簡單實現C++
- 預研canvas實現Excel開源專案CanvasExcel
- 【C++】實現一個簡單的單例模式C++單例模式
- webpack配合vue.js實現完整的單頁面demoWebVue.js
- gradle-wrapper的簡單使用GradleAPP
- 再探C++的單件實現 (轉)C++
- 【Storm篇】--Storm併發機制ORM
- 【Storm篇】--Storm 容錯機制ORM
- c++實現單連結串列C++
- Lean and extensible mySQL C++ wrapper - CodeProjectMySqlC++APPProject
- 自研ORM框架實現工作單元模式ORM框架模式
- iOS 實現簡單的列表預載入iOS
- binder 一個簡單的c++服務的實現,與callback實現C++
- 分析模式-計量的C++實現——完美版本 (轉)模式C++
- opencv安裝實錄附十幾行C++實現的一個人臉識別demoOpenCVC++
- 聊聊UDP、TCP和實現一個簡單的JAVA UDP小DemoUDPTCPJava
- Twitter Storm安裝配置(Ubuntu系統)單機版ORMUbuntu
- 【大資料】Summingbird(Storm + Hadoop)的demo執行大資料ORMHadoop
- 一個有限狀態機的C++實現C++
- C++ 異常處理機制的實現C++
- 常見的 emit 實現 AOP demoMIT
- 感知機簡單實現
- 實現一個簡單的C++協程庫C++
- 設計模式——單例模式C++實現設計模式單例C++
- 理解storm的ACKER機制原理ORM
- 資料結構——單連結串列的C++實現資料結構C++
- C++實現以秒為單位的計數器C++
- 一致性hash的c++簡單實現C++
- 帶頭結點的單連結串列實現(C++)C++
- 簡單c++實現複數的四則運算C++