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是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過程的高可用性。
DataNodes:安裝在負責存儲和服務資料的叢集中的每個工作節點上的從程序。
圖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 (另一個資源協商器)負責管理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僅僅是一個資料總管,它知道如何将分布式計算資源配置設定給運作在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上實作分布式應用程式的過程。在本節中,我們将重點介紹最流行的幾種: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>
在Hive中建立一個指向HDFS資料的表(請注意,我們需要指定檔案的分隔符和位置,以便Hive可以将原始資料表示為表):
使用Beeline開始會話後,您建立的所有表都将位于“預設”資料庫下。您可以通過提供特定的資料庫名稱作為表名的字首,或者鍵入“use<database_name>;”指令來更改它。
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:從關系資料存儲區和HDFS/HFE及其他方式遷移資料的不可缺少的工具。
您可以使用指令行與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使用者組的聯合組織者,并經常在大型資料會議上發言。
原文釋出時間為:2018-04-30
本文作者:Piot&Adam
本文來自雲栖社群合作夥伴“
資料派THU”,了解相關資訊可以關注“
”。