您的位置:首頁>科技>正文

手把手教你入門Hadoop(附代碼&資源)

作者: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過程的高可用性。

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

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

在Hive中創建一個指向HDFS資料的表(請注意,我們需要指定檔的分隔符號和位置,以便Hive可以將原始資料表示為表):

使用Beeline開始會話後,您創建的所有表都將位於“預設”資料庫下。您可以通過提供特定的資料庫名稱作為表名的首碼,或者鍵入“use;”命令來更改它。

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 We bUI 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 資料派平臺的翻譯志願者小組,希望能和大家一起交流分享,共同進步

圖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

在Hive中創建一個指向HDFS資料的表(請注意,我們需要指定檔的分隔符號和位置,以便Hive可以將原始資料表示為表):

使用Beeline開始會話後,您創建的所有表都將位於“預設”資料庫下。您可以通過提供特定的資料庫名稱作為表名的首碼,或者鍵入“use;”命令來更改它。

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 We bUI 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 資料派平臺的翻譯志願者小組,希望能和大家一起交流分享,共同進步

Next Article
喜欢就按个赞吧!!!
点击关闭提示