C/C++ 是否存在大數據生態圈,為什麼?
現在一提起大數據,基本就等同於 Hadoop / Spark / Storm 等一系列 JVM 體系下的開源架構;而如果說要用 C/C++ 的話,基本就是還在造輪子的階段,差距十分懸殊。
是不是有一天也會像 Nginx 的誕生一樣,在 Apache 如日中天的時候,有一個神秘的 C 高手團隊造就了 Nginx 現在的地位。個人的臆想是,在 Linux 文件系統上再用 C 做一個文件管理層(據我了解阿里雲和百度已經是這樣乾的),分散式通信可以借鑒 Thrift 這樣的 RPC 框架,shell 層可以考慮使用 C++ / Python等相對敏捷的語言來實現,還有 MySQL、Redis 這樣的親戚可以一併拉入來實現部分文件索引工作。計算引擎方面,實現像 Spark 那樣實時的流式計算,無非就是把數據和索引建在內存里,提供一些類似 MLlib 的演算法包。任務調度和負載均衡可以借鑒 Nginx 然後根據實際計算需求加以平衡。曾經用 C++ 寫過一個較為輕量級的分散式計算引擎,相比起 Spark 而言,時間性能提升1到2個數量級,內存減少四到五倍。
但是為何業界還是一致地在追求 JVM 體系下的大數據架構?只是功利性地考慮了用人成本、技術成本、維護成本嗎?或者是牛逼的企業已經做了,只是都不願意公開?
請茲辭 DMLC Distributed (Deep) Machine Learning Common · GitHub
我其實不太懂大數據。只提一些個人看法。
不同的領域各個任務的優先順序和當時的狀況都不太一樣。
C/C++的優勢在於性能,缺點在於開發速度和難度。所以只有以性能為優先的場景,C和C++才會有足夠的優勢。更加具體的分析在這裡:
純C語言的工作有前(錢)景嗎? - 編程
但是這個階段的大數據:需求沒有完全實現,迭代速度快,熱錢多,問題並行性很好對性能密度沒有要求。所以顯然 C/C++ 並不是什麼很好的選擇。
反觀Nginx所針對的Web Server,已經褪去了高速發展期,需求已經相對穩定(也就是產品規劃穩定),所以降低了C/C++開發的難度,同時大家也開始收縮這個方面的投入,有一個性能更高的軟體也會減少硬體方面的投入,甚至還能解決一些不宜伸縮的部分的性能問題。
所以長期來看,我認為C/C++在Big Data中的推廣,可能和Nginx一樣,在大數據的熱潮即將褪去的時候,給大家一個更具性價比和性能潛力的軟體方案。
樓主這個設想非常不錯,谷歌的三寶(GFS,MapReduce,BigTable)應該就是通過c++實現的,可惜就是不開源。
性能優化,應該放在最後才做.
現在大數據領域,還在戰國時代,百家爭鳴,遠遠沒有達到穩定,以我的了解,這個方向坑深的程度現在還遠遠沒有到.反觀題主說的apache/nginx的例子,那是在apache以及HTTP協議已經穩定多年,另外新的技術(epoll)出現的情況下,舊有 的apache還在採取一個請求一個線程的處理(對apache不算熟悉,如有錯誤請指出)的模型,所以才有了Nginx的橫空出世.
而現在,在爭奪話語權快速驗證模型的情況下,顯然開發效率/社區完善度是更重要的,幾個先發的大數據相關軟體已經佔了先機,短時間還看不到拿C++來重寫的可能.Scylla DB
補充一點:
如果系統性能的瓶頸不在語言上,沒有必要用c和c++來寫。如Haddop這種基於磁碟的批處理,基本上性能就卡在網路和磁碟IO上,為啥自找麻煩用c來寫。如果語言是瓶頸(如JVM系的會帶來GC的開銷),可以採取折中的方案阿,自己維護off-heap的storage(Spark的tungsten)。另外,比較活躍的開源分散式系統大部分都是jvm系的吧,至少說明在性能和易用性方面大家都選後者。說明這點語言帶來的性能開銷大家還都能忍。啥時候不能忍了,就到了c/c++系的崛起的時候。
另外說到內存的計算引擎,如果真的在乎性能,就應該直接上MPI,讓搞HPC的人來做。
java 把寫大規模並發程序的難度降低了,但是把問題挪到了JVM上面,雖然內存分配省心了,但是問題在JVM上面表現出來了。
C++ 是寫的時候難了,但是用起來爽GO 的話,並發解決了, GC問題還是沒解決 和java 一樣一樣的!沒能力用C++寫就苦逼著吧, 在nginx之前, 你們用apache 那麼多年 不也都忍了嗎?確實有好多框架是用C++實現的,
NoSQL有:ScyllaDB,MongoDB,Aerospike,Kudu ,SequoiaDB;Ad-hoc查詢引擎有:Impala;實時流計算有:Hurricane;資源調度框架有:Mesos;就連新開源的Heron也有一部分是用C++實現的。
可是,有沒有生態圈,最終還是取決於圈中的人。java有巨人的肩膀
不是業界有C++的實現方案,Apache Mesos么?Apache Mesos
其實是有的,BAT內部系統應該大部分都是C++弄的,確實開發成本高,效果好,所以就不捨得開源了么。
其實已經有用純C研發的分散式計算框架了,叫dc4c,源碼開放在http://git.oschina.com和http://github.com上,有銀行在用。
阿里雲的飛天系統就是c++實現的。飛天系統的演進表明,這種分散式系統面臨最大的問題是IO,而非計算。所以,c++帶來的性能紅利沒那麼大,而且,c++坑多,一不小心就寫出極低效的代碼,沒有想像中的好駕馭。架構上的優化大於實現語言上的優劣。
谷歌的生態圈就是c++的,只是,不開源
企業內部自造的輪子很多是C/C++的, 包括谷歌和BAT. 但是開源的時候會改成Java, 因為會C/C++的大數據相關人員很少, 直接開源C版本的話沒幾個人關注, 面子上過不去.
看了這問題和樓里的諸多答案。覺得阿里的飛天真是栽了。
瓶頸不在語言上。磁碟IO,網路開銷才是瓶頸。
我一直在考慮這個問題,其實我已經在開始做的。網站:http://orebin.com剛開始,業餘時間太少,有相同想法的給點幫助。
cloudera自己的大數據生態就是C++的, 比如Impala,kudu
工業界做任何事情,首先看投入產出比。基於這個前提,如果題主所說的「大數據」就是指海量數據的存儲分析利用等,那麼基於jvm的方案是自然而然的。一方面基礎設施成熟,一方面應用開發人員比較多。其他的回答也提到了,在「大數據」這個事情上的主要矛盾不是代碼執行效率的問題,一個能充分利用帶寬、iops、內存的系統,保障了容錯,再有足夠的其他工具、庫、服務的支持,就足以滿足各種應用的需求。各個大廠開發自己的基於c/c++的私有實現,沒有特別成功的,google的情況也不具有普遍性。
推薦閱讀:
※有data binding之後,早先的Android應用架構還有用處嗎?
※怎麼才能做軟體架構師?
※為什麼linux命令比dos多很多?
※「QT不適合開發高並發的網路應用」 是真的嗎?如果不是,應該如何設計;如果是,應該如何化解?
※為什麼有些大公司技術弱爆了?