回覆列表
  • 1 # 小紅的甜心

      一、需要解決中央控制端到各節點伺服器之間的通訊。

      這個其實牽扯到一個通訊協議的問題,各語言都有自己的socket,thread的庫,直接呼叫即可。但是這個通訊協議就需要自己來完成了。既不能太簡單,太簡單了,明碼傳輸,如果別人獲知了這個介面,就很容易執行一些令人討厭的操作。也不能太複雜,太複雜了等於是給自己找麻煩,所以簡單的資料包編解碼的工作或者用token驗證的方式是需要的。通訊協議起碼要兩種,一種是傳輸命令執行的協議,一種是傳輸檔案的協議。

      二、跨語言的socket通訊

      為什麼要跨語言,主控端和代理端通訊,用什麼語言開發其實無所謂。但是為了給自己省事,儘可能使用伺服器上已經有了的預設語言,Ambari前期採用php+puppet的方式管理叢集,這不是不可以,puppet自己解決了socket通訊協議和檔案傳輸的問題,可你需要為了puppet在每臺伺服器上都安裝ruby。我是個有點伺服器和程式碼潔癖的人。光是為了一個puppet就裝個ruby,我覺得心裡特對不起伺服器的資源。所以我自己寫了一個python的代理端。python是不管哪個linux系統在安裝的時候就都會有了。然後主控端的通訊,可以用python實現,也可以用php實現,但是考慮到對於更多的使用者來說,改php可能要比改tornado簡單許多,所以就沒用python開發。hadoop分支版本眾多,釋出出去,使用者要自己修改成安裝適合自己的hadoop發行版,就勢必要改原始碼,會php的明顯比會python的多。php裡面的model封裝了所有的操作,而python只是個操作代理人的角色而已。

      所以也延伸出一個問題,什麼語言用來做這種分散式管理系統的代理端比較合適,我自己覺得,也就是python比較合適了,作業系統自帶,原生的package功能基本夠用。用java和php也可以寫agent,但是你勢必在各節點預先就鋪設好jre或者php執行環境。這就跟為什麼用python和java寫mapred的人最多是一樣的。沒人攔著你用nodejs寫mapred,也可以寫,就是你得在每個節點都裝v8的解釋引擎,不嫌麻煩完全可以這樣幹。原理參看map/reduce論文,不解釋。perl也是作業系統原生帶的,但是perl的可維護性太差了,還是算了吧。

      所以這就牽扯到一個跨語言的socket問題,理論上來說,這不存在什麼問題。但這是理論上的,實際開發過程中確實存在問題,比如socket長連線,通訊資料包在底層的封裝方式不同。我沒有使用xml-rpc的原因之一就是我聽說php的xmlrpc跟其他語言的xmlrpc有不同的地方,需要修改才能用,我就沒有用這種辦法。最早是自己定義的操作協議,這時就遇到了這些問題,所以後來直接採用了thrift方式。就基本不存在跨語言的socket通訊問題了。

      三、代理端執行結果的獲取

      無論命令還是檔案是否在代理端執行成功,都需要獲取到執行結果返回給中央端。所以這裡也涉及一個讀取節點上的stdout和stderr的問題。這個總體來說不是很難,都有現成的包。當然這個時候你需要的是阻塞執行,而不能搞非同步回撥。

      還有個問題是,我要儘可能使用python預設就帶的包,而儘量不讓伺服器去訪問internet下載第三方的包。

      還有代理端最重要的一點,就是python的版本相容性。centos5用python 2.4,centos6用python 2.6,ubuntu基本預設都是2.7。所以一定要最大限度的保證語言的跨版本相容性,要是每個作業系統和每一個版本我都寫一個代理,我一個人就累死了。

    本回答由提問者推薦

  • 中秋節和大豐收的關聯?
  • S60系統和新的S90系統有什麼差距?