Hadoop,開發者糾結的十件事

jopen 10年前發布 | 11K 次閱讀 Hadoop

  開源數據處理平臺 Hadoop 在大數據時代的今天有著非常廣泛的應用。著名的大象圖標遍布各行各業,從醫療記錄到銀行交易,從車票預定到房屋租賃,乃至很多科學數據處理,都可以見到 Hadoop 的身影。

  在 Hadoop 生態繁榮的背后,是開發者們夜以繼日的開發與支持。而在用戶得益甚至贊賞這些應用的時候,開發者們卻不得不面對 Hadoop 平臺中一些可用性較差的地方。本文列舉了網絡上一些關于 Hadoop 的缺點,供大家探討,部分觀點來自 InfoWorld 及開發者博客。

  1、 平臺尚未成熟

  雖然用途廣泛,但不得不承認的是,Hadoop 目前仍在開發階段。很多數據結構都不全,比如 Hadoop 一直不支持原生 datatime 數據類型,最近才在時間序列數據開發者的強烈建議下下引入此數據類型。其次,技術支持并不到位,無論是 Google 還是 Stack Overflow 上尋找的答案,都不足以解決開發者遇到的問題。

  2、 數據模式模糊不清

  Hadoop 目前對模式(Schema)的描述并不清晰,很多開發者在撰寫 Pig 腳本的過程中,會花費超過 50% 的時間在調試對 Schema 的支持上。

  3、 Pig 和 Hive 無法互通

  Hive 和 Pig 用起來完全是兩個東西。熟悉 SQL 的開發者可以在 Hive 中使用類似的腳本,但是在 Pig 中卻不得不重新學習其語法。在 Pig 中無法使用 Hive 的 UDFS,也無法使用 HCatalog 訪問 Pig 的 Hive 表。反過來,無法在 Hive 中使用 Pig 的 UDFS。這讓開發者在兩者切換使用的過程中頗為糾結,需要耗費精力重新撰寫腳本來完成已有的工作。

  4、 HDFS 存儲共享函數庫

  鑒于 Hadoop 的復用機制,一旦開發者將 Pig 腳本保存于 HDFS,那么 Hadoop 將自動認為所有的 JAR 包的存儲方式都應如此。通常情況下,這樣的做法并無問題,但是有時候,當一個項目需要維護大量共享庫的時候,這就變得非常復雜。而且,大部分時間 JAR 包通常都在安裝客戶端的時候一并安裝過,Hadoop 這種存儲方式使得 JAR 包多次存儲。據悉,腳本存儲的問題 Pig 新版本已修正,但是共享函數庫存儲的問題卻仍然存在。

  5、 報錯信息不完整

  這幾乎是 Hadoop 系列工具的通病,經常在出了問題的時候,返回一個“運行失敗,無更多錯誤信息”這樣的報錯提示,使得開發者無法進行更進一步的錯誤調試。還有,Hadoop 經常會拋出一些無法找到指針的異常(NPE),而這些問題則是由文件解析之類的操作造成,并不能屬于 NPE 范疇。另外,由于采用 UDFS,導致很多報錯最終以 udf 執行錯誤的樣子呈現給開發者,而它們可能僅僅是語法錯誤或者類型錯誤。

  6、 不兼容的安全機制

  開發者經常會聽到這樣的說法:“已經有足夠多的案例證明,想要保證 Hadoop 的安全性,建議使用 Kerberos,LDAP 直白易用。”但是現狀就是,Hadoop 平臺并未對此有友好的集成:沒有 SAML、沒有 OAuth,也沒有很好的安全驗證機制(開發者只能時不時的無奈面對再一次出現的登錄窗口)。更有意思的是,Hadoop 平臺中很多組件都自己支持 LDAP,且彼此不考慮兼容性。

  7、 難以開發的 LDAP 連接器

  對開發者來講,用 Java 成功完成一個能用的 LDAP 連接器,至少需要修改上百次代碼。而反過來看看完成的代碼,連接器的功能還不完善。實際上,開發者們能感覺出 Knox 有點像一時沖動的產物。畢竟用 Apache 配置 mod_rewrite 模塊就能完成的事情,非要用 Java 再寫一遍,的確是讓開發者頭痛的事情。

  8、 難以擴展的 Hive 表管理

  如果開發者使用 Hive 進行表管理的話,在 Hive 執行了 drop 表命令后,會自動將表刪除。但是如果這個表是外部的話,則不會自動刪除。為什么 Hive 不能將這兩個表同樣對待呢?此外,既然 Hive 現在有向 RDBMS 發展的趨勢,為什么不增加 Update 和 Delete?

  9、 不兼容的 Namenode

  Hadoop 的很多組件,如 Oozie、Knox 等,都不遵循新的 Namenode HA。開發者可以做一個 HA Hadoop,前提是他完全不想使用其他組件。

  10、 出錯的文檔

  Hadoop 的文檔存在很多問題,開發者經常會發現文檔的示例代碼中有問題,有一些文檔本身都沒有遵循 Hadoop 的模式設計。鑒于這些文檔在互聯網上流傳廣泛,應該有相當一批人學習并嘗試,因此都會遇到并糾結于這些錯誤。實際上,有些錯誤是完全可以避免的,只要文檔的撰寫人在完成文檔的同時,自己動手運行一下示例代碼。比如 Oozie 文檔中充斥著大量過去版本的樣例代碼,開發者遇到錯誤的時候,很可能不是自己程序寫錯了,而是由于 Oozie 版本更替而導致之前教程中的函數不兼容造成,比如協議問題、模式有效性問題等等。有人形容 Oozie,稱其類似 Ant 和 Maven,只是沒有任何調試手段,而且代碼非常善變。

  此外,在 Hadoop 平臺的適用范圍方面,它對實時數據訪問支持并不好,也無法高效存儲大量小文件,而且目前尚不支持多用戶。

來自: InfoQ
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!