當您需要處理大量資料時,儲存它們是一個不錯的選擇。令人難以置信的發現或未來預測不會來自未使用的資料。大資料是一個複雜的怪獸。用 Java™ 程式語言編寫複雜的 MapReduce 程式要耗費很多時間、良好的資源和專業知識,這正是大部分企業所不具備的。這也是在 Hadoop 上使用諸如 Hive 之類的工具構建資料庫會成為一個功能強大的解決方案的原因。
如果一家公司沒有資源構建一個複雜的大資料分析平臺,該怎麼辦?當業務智慧 (BI)、資料倉儲和分析工具無法連線到 Apache Hadoop 系統,或者它們比需求更復雜時,又該怎樣辦?大多數企業都有一些擁有關聯式資料庫管理系統 (RDBMSes) 和結構化查詢語言 (SQL) 經驗的員工。Apache Hive 允許這些資料庫開發人員或者資料分析人員使用 Hadoop,無需瞭解 Java 程式語言或者 MapReduce。現在,您可以設計星型模型的資料倉儲,或者常態化的資料庫,而不需要挑戰 MapReduce 程式碼。忽然之間,BI 和分析工具,比如 IBM Cognos® 或者 SPSS® Statistics,就可以連線到 Hadoop 系統。
資料庫
構建資料庫,並且能夠使用這些資料,這不是 Hadoop 或者資料庫問題。多年以來,人們一直習慣將資料組織到庫中。有許多由來已久的問題:如何將資料分門別類?如何將所有資料連線到整合的平臺、機箱或者 庫?多年來,各種方案層出不窮。
人們發明了很多方法,比如 Dewey Decimal 系統。他們將通訊錄中的人名或企業名按照字母順序排列。還有金屬檔案櫃、帶貨架的倉庫、地址卡檔案系統,等等。僱主嘗試用時間卡,打卡器以及時間表追蹤員工。人們需要結構化和組織化資料,還需要反映和檢查這些資料。如果您無法訪問、結構化或理解這些資料,那麼儲存這麼多的資料有什麼實際意義呢?
RDBMSes 使用了過集合論和第三正規化。資料倉儲有 Kimball、Inmon、星型模型、Corporate Information Factory,以及專用資料集市。他們有主資料管理、企業資源規劃、客戶關係管理、電子醫療記錄和其他許多系統,人們使用這些系統將事務組織到某種結構和主題中。現在,我們有大量來自各個行業的非機構化或半結構化資料,例如,社交媒體、郵件、通話記錄、機械指令、遠端資訊,等等。這些新資料需要整合到儲存結構化的新舊資料的非常複雜、非常龐大的系統中。如何分類才能使得銷售經理能夠改進報告?如何構建庫才能使得執行主管能夠訪問圖表和圖形?
您需要找到一種將資料結構化到資料庫的方法。否則,只是擁有大量只有資料科學家才能訪問資料。有時,人們只是需要簡單的報告。有時,他們只是想要拖拽或者編寫 SQL 查詢。
大資料、Hadoop 和 InfoSphere BigInsights
本小節將向您介紹 InfoSphere® BigInsights™,以及它與 Hadoop、大資料、Hive、資料庫等有何聯絡。InfoSphere BigInsights 是 Hadoop 的 IBM 分割槽。您可能對 Apache 和 Cloudera 比較瞭解,但是業內許多人都曾涉足 Hadoop。它開始於開源的使用 MapReduce 的 Hadoop 和 Hadoop 分散式檔案系統 (HDFS),通常還包括其他工具,比如 ZooKeeper、Oozie、Sqoop、Hive、Pig 和 HBase。這些釋出版與普通 Hadoop 的區別在於它們被新增在 Hadoop 頂層。InfoSphere BigInsights 就屬於這一類版本。
您可以在 Hadoop 的 Cloudera 版本之上使用 InfoSphere BigInsights。此外,InfoSphere BigInsights 提供一個快速的非結構化的分析引擎,您可以將它和 InfoSphere Streams 結合在一起使用。InfoSphere Streams 是一個實時的分析引擎,它開創了聯合實時分析和麵向批次的分析的可能。
InfoSphere BigInsights 還擁有內建的、基於瀏覽器的電子表格 BigSheets。這個電子表格允許分析人員每天以電子表格樣式使用大資料和 Hadoop。其他功能包括基於角色的安全和管理的 LDAP 整合;與 InfoSphere DataStage® 的整合,用於提取、轉換、載入 (ETL);常用的使用案例的加速器,比如日誌和機器資料分析;包含常用目錄和可重複使用工作的應用目錄;Eclipse 外掛;以及 BigIndex,它實際上是一個基於 Lucene 的索引工具,構建於 Hadoop 之上。
您還可以使用 Adaptive MapReduce、壓縮文字檔案、自適應排程增強來提高效能。此外,您還可以整合其他應用,例如,內容分析和 Cognos Consumer Insights。
Hive
Hive 是一個強大的工具。它使用了 HDFS,後設資料儲存(預設情況下是一個 Apache Derby 資料庫)、shell 命令、驅動器、編譯器和執行引擎。它還支援 Java 資料庫連線性 (JDBC) 連線。 由於其類似 SQL 的能力和類似資料庫的功能,Hive 能夠為非程式設計人員開啟大資料 Hadoop 生態系統。它還提供了外部 BI 軟體,例如,通過 JDBC 驅動器和 Web 客戶端和 Cognos 連線。
您可以依靠現有的資料庫開發人員,不用費時費力地尋找 Java MapReduce 程式設計人員。這樣做的好處在於:您可以讓一個資料庫開發人員編寫 10-15 行 SQL 程式碼,然後將它優化和翻譯為 MapReduce 程式碼,而不是強迫一個非程式設計人員或者程式設計人員寫 200 行程式碼,甚至更多的複雜 MapReduce 程式碼。
Hive 常被描述為構建於 Hadoop 之上的資料倉儲基礎架構。事實是,Hive 與資料倉儲沒有什麼關係。如果您想構建一個真實的資料倉儲,可以藉助一些工具,比如 IBM Netezza。但是如果您想使用 Hadoop 構建一個資料庫,但又沒有掌握 Java 或者 MapReduce 方面的知識,那麼 Hive 會是一個非常不錯的選擇(如果您瞭解 SQL)。Hive 允許您使用 Hadoop 和 HBase 的 HiveQL 編寫類似 SQL 的查詢,還允許您在 HDFS 之上構建星型模型。
Hive 與 RDBMSes
Hive 是一個讀模式 系統,而 RDBMSes 是一個典型的寫模式 系統。傳統的 RDMBSes 在編寫資料時驗證模型。如果資料與結構不符,則會遭到拒絕。Hive 並不關心資料的結構,至少不會在第一時間關心資料結構,它不會在您載入資料時驗證模型。更確切地說,只在您執行查詢之後,它才會關心該模型。
Hive 的限制
在使用 Hive 時可能會有一些挑戰。首先,它與 SQL-92 不相容。某些標準的 SQL 函式,例如 NOT IN
、NOT LIKE
和 NOT EQUAL
並不存在,或者需要某種工作區。類似地,部分數學函式有嚴格限制,或者不存在。時間戳或者 date
是最近新增的值,與 SQL 日期相容性相比,更具有 Java 日期相容性。一些簡單功能,例如資料差別,不能正常工作。
此外,Hive 不是為了獲得低延時的、實時或者近乎實時的查詢而開發的。SQL 查詢被轉化成 MapReduce,這意味著與傳統 RDBMS 相比,對於某種查詢,效能可能較低。
另一個限制是,後設資料儲存預設情況下是一個 Derby 資料庫,並不是為企業或者生產而準備。部分 Hadoop 使用者轉而使用外部資料庫作為後設資料儲存,但是這些外部後設資料儲存也有其自身的難題和配置問題。這也意味著需要有人在 Hadoop 外部維護和管理 RDBMS 系統。
安裝 InfoSphere BigInsights
這個棒球運動資料示例向您展示了在 Hive 中如何從平面檔案構建常用的資料庫。雖然這個示例比較小,但它顯示了使用 Hive 構建資料庫有多麼輕鬆,您可以使用該資料執行統計資料,確保它符合預期。將來嘗試組織非結構資料時就無需檢查那些資訊。
完成資料庫構建之後,只要連線到 Hive JDBC,就可以使用任何語言構建 Web 或者 GUI 前端。(配置和設定一個 thrift 伺服器,Hive JDBC 是另一個話題)。我使用 VMware Fusion 在我的 Apple Macbook 上建立了一個 InfoSphere BigInsights 虛擬機器 (VM)。這是一個簡單的測試,這樣我的 VM 就有 1 GB 的 RAM 和 20 GB 的固態磁碟儲存空間。作業系統是 CentOS 6.4 64-bit distro 的 Linux®。您還可以使用某些工具,例如 Oracle VM VirtualBox,如果您是 Windows® 使用者,那麼您還可以使用 VMware Player 建立 InfoSphere BigInsights VM。(在 Fusion 上設定 VM、VMware Player 或者 VirtualBox 不在本文的討論範圍之內。)
從下載 IBM InfoSphere BigInsights 基礎版開始。您需要有一個 IBM ID,或者您可以註冊一個 ID,然後下載 InfoSphere BigInsights 基礎版。
輸入和分析資料
現在,您可以在任何地方獲取資料。絕大多數網站都提供了逗號分隔值 (CSV) 格式的資料:天氣、能源、運動、金融和部落格資料。例如,我使用來自 Sean Lahman 網站的結構化資料。使用非結構化資料會費力一些。
首先 下載 CSV 檔案(參見 圖 1)。
圖 1. 下載示例資料庫
如果您寧願在一個更手動的環境中,那麼可以從 Linux® 完成它,您需要建立一個目錄,然後執行 wget
:
1 2 3 |
$ Sudo mkdir /user/baseball. sudo wget http://seanlahman.com/files/database/lahman2012-csv.zip |
該資料使用了 Creative Commons Attribution-ShareAlike 3.0 Unported 許可。
壓縮檔案在 CSV 檔案中,包含了棒球和棒球運動員的統計資料。示例中包含四個主表,每個表都只有一個列(Player_ID):
- Master table.csv— 運動員姓名、出生日期和生平資訊
- Batting.csv— 擊球統計
- Pitching.csv— 投球統計
- Fielding.csv— 接球統計
輔表:
- AllStarFull.csv— 全明星陣容
- Hall of Fame.csv— 名人堂投票資料
- Managers.csv— 管理統計
- Teams.csv— 年度統計和排名
- BattingPost.csv— 賽季後的擊球統計
- PitchingPost.csv— 賽季後的投球統計
- TeamFranchises.csv— 加盟資訊
- FieldingOF.csv— 場外位置資料
- FieldingPost.csv— 賽季後的現場資料
- ManagersHalf.csv— 經紀人的分季資料
- TeamsHalf.csv— 團隊的分季資料
- Salaries.csv— 球員薪資資料
- SeriesPost.csv— 賽季後系列資訊
- AwardsManagers.csv— 經紀人獎項
- AwardsPlayers.csv— 球員獎項
- AwardsShareManagers.csv— 經紀人獎項投票
- AwardsSharePlayers.csv— 球員獎項投票
- Appearances.csv
- Schools.csv
- SchoolsPlayers.csv
設計資料庫
設計資料庫的大部分內容已經完成。Player_ID 是四個主表(Master、Batting、Pitching 和 Fielding)的主鍵。(為了更好地理解表格結構和依賴性,請閱讀 Readme2012.txt。)
設計非常簡單:主表是通過 Player_ID 連線的。Hive 並沒有真的使用主鍵或者引用完整性的概念。Schema on Read 意味著 Hive 會摒棄您輸入到表格中的所有內容。如果檔案是混亂無序的,那麼可能需要尋求連線它們的最佳方法 。此外,在將資料載入到 HDFS 或 Hive 之前,需要進行一些轉化。根據 Schema on Rea 原理,不良資料在 Hive 中將徹底變成不良資料。這就是資料分析(無論是源級別的或者 HDFS 級別的)是一個重要步驟的原因。沒有資料分析,最終獲得的原始資料沒有人可以使用。幸運的是,這個棒球的示例包含一些資料,這些資料在您輸入 Hadoop 之前,已經被清理和組織到一起。
將資料載入到 HDFS 或者 Hive
將資料載入到 Hadoop 使用了很多不同的理論和實踐。有時,您可以將原始檔案直接輸入到 HDFS。您可能會建立一個目錄和子目錄來組織檔案,但是將檔案從一個地方複製或移動到另一個位置是一個簡單的過程。
就這個示例來說,只需發出 put
命令,然後建立一個名為 baseball 的目錄即可:
1 2 3 |
Hdfs dfs -mkdir /user/hadoop/baseball hdfs dfs -put /LOCALFILE /user/hadoop/baseball |
使用 Hive 構建資料庫
隨著資料分析和設計的完成,下一步就是構建資料庫了。
雖然我沒有介紹所有的示例,但是,如果跟隨我構建了第一個示例,那麼您就能夠了解如何完成剩下的步驟。我通常會構建一些 SQL 文字指令碼,然後將它們輸入或者貼上到 Hive。其他人可以使用 Hue 或其他工具來構建資料庫和表格。
為了簡便起見,我們使用了 Hive Shell。高階步驟是:
- 建立棒球資料庫
- 建立表格
- 載入表格
- 驗證表格是正確的
您會看到一些選項,例如,建立外部或者內部資料庫和表格,但是在這個示例中,需要遵守內部預設設定。實際上,內部的 就意味著 Hive 處理了內部儲存的資料庫。清單 1 說明了 Hive shell 的流程。
清單 1. 建立資料庫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ Hive Create Database baseball; Create table baseball.Master ( lahmanID int, playerID int, managerID int, hofID int, birthyear INT, birthMonth INT, birthDay INT, birthCountry STRING, birthState STRING, birthCity STRING, deathYear INT, deathMonth INT, deathDay INT, deathCountry STRING, deathState STRING, deathCity STRING, nameFirst STRING, nameLast STRING, nameNote STRING, nameGive STRING, nameNick STRING, weight decimal, height decimal, bats STRING, throws STRING, debut INT, finalGame INT, college STRING, lahman40ID INT, lahman45ID INT, retroID INT, holtzID INT, hbrefID INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ; |
其他所有表也都遵守這個程式。為了將資料載入到 Hive 表,將會再次開啟 Hive shell,然後執行以下程式碼:
1 2 |
$hive LOAD DATA LOCAL INPATH Master.csv OVERWRITE INTO TABLE baseball.Master; |
使用 Hive 構建標準化資料庫
這個棒球的資料庫或多或少是標準化的:有四個主表和幾個輔表。再次重申,Hive 是一個 Schema on Read,因此您必須完成資料分析和 ETL 階段的大部分工作,因為沒有傳統 RDBMSes 中的索引或者引用完整性。如果您想要使用索引功能,那麼下一步應該使用類似 HBase 的工具。請檢視 清單 2 中的程式碼。
清單 2. 執行一個查詢
1 2 3 4 5 6 |
$ HIVE Use baseball; Select * from Master; Select PlayerID from Master; Select A.PlayerID, B.teamID, B.AB, B.R, B.H, B.2B, B.3B, B.HR, B.RBI FROM Master A JOIN BATTING B ON A.playerID = B.playerID; |
結束語
這就是 Hive 的優勢以及構建資料庫的好處:它為混沌的世界建立了結構。和我們喜歡討論的非結構化或半結構化資料一樣,它最終還是要了解誰可以分析資料,誰能基於它執行報告,以及您如何能夠讓它快速投入到工作中。大多數使用者將 Hive 視為某種黑盒:他們不在意資料來自何處,也不在乎需要做什麼才能以正確格式獲取資料。也不會在意整合或者驗證這些資料有多麼困難,只要這些資料是精確的。這通常意味著您必須有組織和結構。否則,您的資料庫會成為一個永久儲存無限制資料的死區,沒人能夠或者想要使用這些資料。
結構複雜的資料倉儲已經風光不再。雖然近年情況有所好轉,但是概念還是一樣:這是一個業務,業務使用者想要結果,而不是程式設計邏輯。這就是在 Hive 中構建資料庫會成為正確開端的原因。