作者:Piotr Krewski&Adam Kawa
翻譯:陳之炎
校對:丁楠雅
本文約6000字,建議閱讀10分鐘。
本文為你介紹Hadoop的核心概念,描述其體系架構,指導您如何開始使用Hadoop以及在Hadoop上編寫和執行各種應用程序。
作者:GETINDATA公司創始人兼大數據顧問彼得亞·雷克魯斯基(Piotr Krewski)和GETINDATA公司首席執行官兼創始人亞當·卡瓦(Adam Kawa)
目錄
內容簡介
設計理念
HADOOP組件
HDFS
YARN
YARN 應用程序
監控 YARN 應用程序
用HADOOP處理數據
HADOOP 的其它工具
其它資源
內容簡介
Hadoop是目前最流行的大數據軟件框架之一,它能利用簡單的高級程序對大型數據集進行分佈式存儲和處理。本文將介紹Hadoop的核心概念,描述其體系架構,指導您如何開始使用Hadoop以及在Hadoop上編寫和執行各種應用程序。
Hadoop是阿帕奇(Apache)軟件基金會發布的一個開源項目,它可以安裝在服務器集群上,通過服務器之間的通信和協同工作來存儲和處理大型數據集。因為能夠高效地處理大數據,Hadoop近幾年獲得了巨大的成功。它使得公司可以將所有數據存儲在一個系統中,並對這些數據進行分析,而這種規模的大數據分析用傳統解決方案是無法實現或實現起來代價巨大的。
以Hadoop為基礎開發的大量工具提供了各種各樣的功能,Hadoop還出色地集成了許多輔助系統和實用程序,使得工作更簡單高效。這些組件共同構成了Hadoop生態系統。
Hadoop可以被視為一個大數據操作系統,它能在所有大型數據集上運行不同類型的工作負載,包括脫機批處理、機器學習乃至實時流處理。
您可以訪問hadoop.apache.org網站獲取有關該項目的更多信息和詳細文檔。
您可以從hadoop.apache.org獲取代碼(推薦使用該方法)來安裝Hadoop,或者選擇Hadoop商業發行版。最常用的三個商業版有Cloudera(CDH)、Hortonworks(HDP)和MapR。這些商業版都基於Hadoop的框架基礎,將一些組件進行了打包和增強,以實現較好的集成和兼容。此外,這些商業版還提供了管理和監控平臺的(開源或專有的)工具。
設計理念
Hadoop在解決大型數據集的處理和存儲問題上,根據以下核心特性構建:
分佈式:存儲和處理並非構建在一臺大型超級計算機之上,而是分佈在一群小型電腦上,這些電腦之間可以相互通信並協同工作。
水平可伸縮性:只需添加新機器就可以很容易地擴展Hadoop集群。每臺新機器都相應地增加了Hadoop集群的總存儲和處理能力。
容錯:即使一些硬件或軟件組件不能正常工作,Hadoop也能繼續運行。
成本優化:Hadoop不需要昂貴的高端服務器,而且在沒有商業許可證的情況下也可以正常工作。
編程抽象:Hadoop負責處理與分佈式計算相關的所有紛雜的細節。由於有高級API,用戶可以專注於實現業務邏輯,解決他們在現實世界中的問題。
數據本地化:Hadoop不會將大型數據集遷移到應用程序正在運行的位置,而是在數據所在位置運行應用程序。
Hadoop組件
Hadoop有兩個核心組件:
HDFS:分佈式文件系統
YARN:集群資源管理技術
許多執行框架運行在YARN之上,每個框架都針對特定的用例進行調優。下文將在“YARN應用程序”中重點討論。
我們來看看它們的架構,瞭解一下它們是如何合作的。
HDFS
HDFS是Hadoop分佈式文件系統。
它可以在許多服務器上運行,根據需要,HDFS可以輕鬆擴展到數千個節點和乃至PB(Petabytes 10的15次方字節)量級的數據。
HDFS設置容量越大,某些磁盤、服務器或網絡交換機出故障的概率就越大。
HDFS通過在多個服務器上覆制數據來修復這些故障。
HDFS會自動檢測給定組件是否發生故障,並採取一種對用戶透明的方式進行必要的恢復操作。
HDFS是為存儲數百兆字節或千兆字節的大型文件而設計的,它提供高吞吐量的流式數據訪問,一次寫入多次讀取。因此對於大型文件而言,HDFS工作起來是非常有魅力的。但是,如果您需要存儲大量具有隨機讀寫訪問權限的小文件,那麼RDBMS和Apache HBASE等其他系統可能更好些。
注:HDFS不允許修改文件的內容。只支持在文件末尾追加數據。不過,Hadoop將HDFS設計成其許多可插拔的存儲選件之一。例如:專用文件系統MapR-Fs的文件就是完全可讀寫的。其他HDFS替代品包括Amazon S3、Google Cloud Storage和IBM GPFS等。
HDFS架構
HDFS由在選定集群節點上安裝和運行的下列進程組成:
NameNode:負責管理文件系統命名空間(文件名、權限和所有權、上次修改日期等)的主進程。控制對存儲在HDFS中的數據的訪問。如果NameNode關閉,則無法訪問數據。幸運的是,您可以配置多個NameNodes,以確保此關鍵HDFS過程的高可用性。
圖1說明了在一個4節點的集群上安裝HDFS。一個節點的主機節點為NameNode進程而其他三節點為DataNode進程
注:NameNode和DataNode是在Linux操作系統 (如RedHat、CentOS、Ubuntu等)之上運行的Java進程。它們使用本地磁盤存儲HDFS數據。
HDFS將每個文件分成一系列較小但仍然較大的塊(默認的塊大小等於128 MB--更大的塊意味著更少的磁盤查找操作,從而導致更大的吞吐量)。每個塊被冗餘地存儲在三個DataNode上,以實現容錯(每個文件的副本數量是可配置的)。
圖2演示了將文件分割成塊的概念。文件X被分割成B1和B2塊,Y文件只包含一個塊B3。在集群上將所有塊做兩個備份。
與HDFS交互
HDFS提供了一個簡單的類似POSIX的接口來處理數據。使用HDFS DFS命令執行文件系統操作。
要開始使用Hadoop,您不必經歷設置整個集群的過程。Hadoop可以在一臺機器上以
所謂的偽分佈式模式運行。您可以下載sandbox虛擬機,它自帶所有HDFS組件,使您可以隨時開始使用Hadoop!只需按照以下鏈接之一的步驟:
mapr.com/products/mapr-sandbox-hadoop
hortonworks.eom/products/hortonworks-sandbox/#install
cloudera.com/downloads/quickstart_vms/5-12.html
HDFS用戶可以按照以下步驟執行典型操作:
列出主目錄的內容:
$ hdfs dfs -ls /user/adam
將文件從本地文件系統加載到HDFS:
$ hdfs dfs -put songs.txt /user/adam
從HDFS讀取文件內容:
$ hdfs dfs -cat /user/adam/songs.txt
更改文件的權限:
$ hdfs dfs -chmod 700 /user/adam/songs.txt
將文件的複製因子設置為4:
$ hdfs dfs -setrep -w 4 /user/adam/songs.txt
檢查文件的大小:
'$ hdfs dfs -du -h /user/adam/songs.txt Create a subdirectory in your home directory.
$ hdfs dfs -mkdir songs
注意,相對路徑總是引用執行命令的用戶的主目錄。HDFS上沒有“當前”目錄的概念(換句話說,沒有“CD”命令):
-
將文件移到新創建的子目錄:
$ hdfs dfs -mv songs.txt songs
從HDFS中刪除一個目錄:
$ hdfs dfs -rm -r songs
注:刪除的文件和目錄被移動到trash中 (HDFS上主目錄中的.trash),並保留一天才被永久刪除。只需將它們從.Trash複製或移動到原始位置即可恢復它們。
您可以在沒有任何參數的情況下鍵入HDFS DFS以獲得可用命令的完整列表。
如果您更喜歡使用圖形界面與HDFS交互,您可以查看免費的開源HUE (Hadoop用戶體驗)。它包含一個方便的“文件瀏覽器”組件,允許您瀏覽HDFS文件和目錄並執行基本操作。
您也可以使用HUE的“上傳”按鈕,直接從您的計算機上傳文件到HDFS。
YARN
YARN (另一個資源協商器)負責管理Hadoop集群上的資源,並允許運行各種分佈式應用程序來處理存儲在HDFS上的數據。
YARN類似於HDFS,遵循主從設計,ResourceManager進程充當主程序,多個NodeManager充當工作人員。它們的職責如下:
ResourceManager
跟蹤集群中每個服務器上的LiveNodeManager和可用計算資源的數量。
為應用程序分配可用資源。
監視Hadoop集群上所有應用程序的執行情況。
NodeManager
管理Hadoop集群中單個節點上的計算資源(RAM和CPU)。
運行各種應用程序的任務,並強制它們在限定的計算資源範圍之內。
YARN以資源容器的形式將集群資源分配給各種應用程序,這些資源容器代表RAM數量和CPU核數的組合。
在YARN集群上執行的每個應用程序都有自己的ApplicationMaster進程。當應用程序被安排在集群上並協調此應用程序中所有任務的執行時,此過程就開始了。
圖3展示了YARN進程在4節點集群上運行兩個應用程序的協作情況,共計產生7個任務。
HADOOP = HDFS + YARN
在同一個集群上運行的HDFS和YARN為我們提供了一個存儲和處理大型數據集的強大平臺。
DataNode和NodeManager進程配置在相同的節點上,以啟用本地數據。這種設計允許在存儲數據的機器上執行計算,從而將通過網絡發送大量數據的必要性降到最低,使得執行時間更快。
YARN 應用程序
YARN僅僅是一個資源管理器,它知道如何將分佈式計算資源分配給運行在Hadoop集群上的各種應用程序。換句話說,YARN本身不提供任何處理邏輯來分析HDFS中的數據。因此,各種處理框架必須與YARN集成(通過提供ApplicationMaster實現),以便在Hadoop集群上運行,並處理來自HDFS的數據。
下面介紹幾個最流行的分佈式計算框架,這些框架都可以在由YARN驅動的Hadoop集群上運行。
MapReduce:Hadoop的最傳統和古老的處理框架,它將計算表示為一系列映射和歸約的任務。它目前正在被更快的引擎,如Spark或Flink所取代。
Apache Spark:用於處理大規模數據的快速通用引擎,它通過在內存中緩存數據來優化計算(下文將詳細介紹)。
Apache Flink:一個高吞吐量、低延遲的批處理和流處理引擎。它以其強大的實時處理大數據流的能力脫穎而出。下面這篇綜述文章介紹了Spark和Flink之間的區別:dzone.com/ports/apache-Hadoop-vs-apache-smash
Apache Tez:一個旨在加速使用Hive執行SQL查詢的引擎。它可在Hortonworks數據平臺上使用,在該平臺中,它將MapReduce替換為Hive.k的執行引擎。
監控YARN應用程序
使用ResourceManager WebUI可以跟蹤運行在Hadoop集群上的所有應用程序的執行情況,默認情況下,它在端口8088。
每個應用程序都可以讀取大量重要信息。
使用ResourceManager WebUI,可以檢查RAM總數、可用於處理的CPU核數量以及
當前Hadoop集群負載。查看頁面頂部的“集群度量”。
單擊"ID"列中的條目,可以獲得有關所選應用程序執行的更詳細的度量和統計數據。
用HADOOP處理數據
有許多框架可以簡化在Hadoop上實現分佈式應用程序的過程。在本節中,我們將重點介紹最流行的幾種:HIVE和Spark。
HIVE
Hive允許使用熟悉的SQL語言處理HDFS上的數據。
在使用Hive時,HDFS中的數據集表示為具有行和列的表。因此,對於那些已經瞭解SQL並有使用關係數據庫經驗的人來說,Hive很容易學習。
Hive不是獨立的執行引擎。每個Hive查詢被翻譯成MapReduce,Tez或Spark代碼,隨後在Hadoop集群中得以執行。
HIVE 例子
讓我們處理一個關於用戶在一段時間裡聽的歌曲的數據集。輸入數據由一個名為Song s.tsv的tab分隔文件組成:
Creep" Radiohead piotr 2017-07-20 Desert Rose" Sting adam 2017-07-14 Desert Rose" Sting piotr 2017-06-10 Karma Police" Radiohead adam 2017-07-23 Everybody" Madonna piotr 2017-07-01 Stupid Car" Radiohead adam 2017-07-18 All This Time" Sting adam 2017-07-13
現在用Hive尋找2017年7月份兩位最受歡迎的藝術家。
將Song s.txt文件上傳HDFS。您可以在HUE中的“File Browser”幫助下完成此操作,也可以使用命令行工具鍵入以下命令:
# hdfs dfs -mkdir /user/training/songs
# hdfs dfs -put songs.txt /user/training/songs
使用Beeline客戶端進入Hive。您必須向HiveServer 2提供一個地址,該進程允許遠程客戶端(如Beeline)執行Hive查詢和檢索結果。
# beeline
beeline> !connect jdbc:hive2://localhost:10000 <user><password>/<user>
在Hive中創建一個指向HDFS數據的表(請注意,我們需要指定文件的分隔符和位置,以便Hive可以將原始數據表示為表):
使用Beeline開始會話後,您創建的所有表都將位於“默認”數據庫下。您可以通過提供特定的數據庫名稱作為表名的前綴,或者鍵入“use<database>;”命令來更改它。/<database>
Check if the table was created successfully: beeline> SHOW tables; Run a query that finds the two most popular artists in July, 2017:
檢查表創建是否成功:beeline>>顯示錶;運行一個查詢,找到在2017年7月份兩位最受歡迎的藝術家:
SELECT artist, COUNT(\\*) AS total FROM songs
WHERE year(date) = 2017 AND month(date) = 7 GROUP BY artist ORDER BY total DESC LIMIT 2;
您可以使用ResourceManager WebUI監視查詢的執行情況。根據配置,您將看到MapReduce作業或Spark應用程序在集群上的運行情況。
注:您還可以從HUE中編寫和執行Hive查詢。有一個專門用於Hive查詢的編輯器,具有語法自動完成和著色、保存查詢、以及以行、條形或餅圖形顯示結果等基本功能。
SPARK
Apache Spark是一個通用的分佈式計算框架。它與Hadoop生態系統友好集成,Spark應用程序可以很容易地在YARN上運行。
與傳統的Hadoop計算範式MapReduce相比,Spark在滿足不同的數據處理需求的同時提供了出色的性能、易用性和通用性。
Spark的速度主要來自它在RAM中存儲數據的能力,在後續執行步驟中對執行策略和串行數據進行優化。
讓我們直接到代碼中去體驗一下Spark。我們可以從Scala、Java、Python、SQL或RAPI中進行選擇。這個例子是用Python寫的。啟動Spark Python shell(名為pyspark)
輸入 # pyspark.
片刻之後,你會看到一個Spark提示。這意味著Spark應用程序已在YARN上啟動。(您可以轉到ResourceManager WebUI進行確認;查找一個名為“PySparkShell”的正在運行的應用程序)。
如果您不喜歡使用shell,則可以查看基於web的筆記本,如jupyter.org或Zeppelin(zeppelin.apache.org)。
作為使用Spark的Python DataFrame API的一個示例,我們實現與Hive相同的邏輯,找到2017年7月兩位最受歡迎的藝術家。
首先,我們必須從Hive表中讀取數據# songs = spark.table(MsongsM)
Spark中的數據對象以所謂的dataframe的方式呈現。Dataframes是不可變的,是通過從不同的源系統讀取數據或對其他數據文件應用轉換而生成的。
調用Show()方法預覽dataframe的內容:
為了獲得預期的結果,我們需要使用多個直觀的函數:
# from pyspark.sql.functions import desc
# songs.filter(Myear(date) = 2017 AND month(date) = 7") \\
.groupBy(MartistM) \\
.count() \\
.sort(desc("count")) \\
.limit(2) \\
.show()
Spark的dataframe轉換看起來類似於SQL操作符,因此它們非常容易使用和理解。
如果您對相同的dataframe執行多個轉換(例如創建一個新的數據集),您可以通過調用dataframe上的cache()方法(例如Song s.cache()),告訴Spark在內存中存儲它。Spark會將您的數據保存在RAM中,並在運行後續查詢時避免觸及磁盤,從而使您獲得更好的性能。
Dataframes只是Spark中可用的API之一。此外,還有用於近實時處理(Spark流)、機器學習(MLIB)或圖形處理(圖形幀)的API和庫。
由於Spark的功能豐富,您可以使用它來解決各種各樣的處理需求,保持在相同的框架內,並在不同的上下文(例如批處理和流)之間共享代碼片段。
Spark可以直接將數據讀寫到許多不同的數據存儲區,而不僅僅是HDFS。您可以輕鬆地從MySQL或Oracle表中的記錄、HBASE中的行、本地磁盤上的JSON文件、ElasticSearch中的索引數據以及許多其他的數據中創建數據。
Hadoop的其他工具
Hadoop生態系統包含許多不同的工具來完成現代大數據平臺的特定需求。下文列舉了一些前面章節中沒有提到的流行和重要項目的列表。
您可以使用命令行與Sqoop交互,選擇所需的操作並提供一系列控制數據遷移過程的必要參數。
從MySQL表導入有關用戶的數據只需鍵入以下命令:
# sqoop import \\
--connect jdbc:mysql://localhost/streamrock \\
--username $(whoami) -P \\
--table users \\
--hive-import
注:Sqoop使用MapReduce在關係型數據庫和Hadoop之間傳輸數據。你可以跟蹤由ResourceManager WebUI Sqoop提交的MapReduce應用。
Oozie:Hadoop的協調和編排服務。
使用Oozie,您可以構建一個在Hadoop集群上執行的不同操作的工作流(例如HDFS命令、Spark應用程序、Hive查詢、Sqoop導入等等),然後為自動執行安排工作流。
HBase:一個建立在HDFS之上的NoSQL數據庫。它允許使用行鍵對單個記錄進行非常快速的隨機讀寫。
Zookeeper:Hadoop的分佈式同步和配置管理服務。大量的Hadoop服務利用Zookeeper正確有效地在分佈式環境中工作。
小結
Apache Hadoop是用於大數據處理的最流行的平臺,這得益於諸如線性可伸縮性、高級APIs、能夠在異構硬件上運行(無論是在前端還是在雲中)、容錯和開源等特性。十多年來,Hadoop已經被許多公司成功地應用於生產中。
Hadoop生態系統提供了各種開源工具,用於收集、存儲和處理數據,以及集群部署、監視和數據安全。多虧了這個令人驚歎的工具生態系統,每一家公司現在都可以以一種分佈式和高度可伸縮的方式輕鬆、廉價地存儲和處理大量的數據。
其他資源
hadoop.apache.org
hive.apache.org
spark.apache.org
spark.apache.org/docs/latest/sql-programming-guide.html
dzone.com/articles/apache-hadoop-vs-apache-spark
dzone.com/articles/hadoop-and-spark-synergy-is-real
sqoop.apache.orgdzone.com/articles/sqoop-import-data-from-mysql-to-hive
oozie.apache.org
tez.apache.org
主要的工具包:
Cloudera: cloudera.com/content/cloudera/en/products- and-services/cdh.html
MapR: mapr.com/products/mapr-editions
Hortonworks: hortonworks.com/hadoop/
本文由GetInData的創始人兼大數據顧問彼得亞·雷克魯斯基(PiotrKrewski)與GetInData首席執行官兼創始人亞當·卡瓦(Adam Kawa)撰寫
彼得亞(Piotr)在編寫運行於Hadoop集群上的應用程序以及維護、管理和擴展Hadoop集群方面具有豐富的實踐經驗。他是GetInData的聯合創始人之一,幫助公司構建可伸縮的分佈式體系結構,用於存儲和處理大數據。Piotr還擔任Hadoop講師,為管理員、開發人員和使用大數據解決方案的分析師提供GetInData專業培訓。
亞當(Adam)於2010找到他在 Hadoop的首份工作後,成為了大數據的粉絲。自那以後,他一直在Spotify(他自豪地經營著歐洲最大和發展最快的Hadoop集群之一)、Truecaller、華沙大學、Cloudera培訓合作伙伴等大數據公司工作。三年前,他創立了GetinData:一家幫助客戶運用數據驅動的公司,並提出了創新的大數據解決方案。亞當也是一位博主,華沙Hadoop用戶組的聯合組織者,並經常在大型數據會議上發言。
譯者簡介
陳之炎,北京交通大學通信與控制工程專業畢業,獲得工學碩士學位,歷任長城計算機軟件與系統公司工程師,大唐微電子公司工程師,現任北京吾譯超群科技有限公司技術支持。目前從事智能化翻譯教學系統的運營和維護,在人工智能深度學習和自然語言處理(NLP)方面積累有一定的經驗。業餘時間喜愛翻譯創作,翻譯作品主要有:IEC-ISO 7816、伊拉克石油工程項目、新財稅主義宣言等等,其中中譯英作品“新財稅主義宣言”在GLOBAL TIMES正式發表。能夠利用業餘時間加入到THU 數據派平臺的翻譯志願者小組,希望能和大家一起交流分享,共同進步
閱讀更多 數據派THU 的文章