本文做者:foochane 本文連接:foochane.cn/article/201…html
大數據是這個時代最熱門的話題之一。可是什麼是大數據呢?它描述了一個龐大的數據集,而且正在以驚人的速度增加。大數據除了體積(Volume)和速度(velocity)外,數據的多樣性(variety)和準確性(veracity)也是大數據的一大特色。讓咱們詳細討論體積、速度、多樣性和準確性。這些也被稱爲大數據的4V特徵。node
數據體積(Volume)指定要處理的數據量。對於大量數據,咱們須要大型機器或分佈式系統。計算時間隨數據量的增長而增長。因此若是咱們能並行化計算,最好使用分佈式系統。數據能夠是結構化數據、非結構化數據或介於二者之間的數據。若是咱們有非結構化數據,那麼狀況就會變得更加複雜和計算密集型。你可能會想,大數據到底有多大?這是一個有爭議的問題。但通常來講,咱們能夠說,咱們沒法使用傳統系統處理的數據量被定義爲大數據。如今讓咱們討論一下數據的速度。c++
愈來愈多的組織機構開始重視數據。每時每刻都在收集大量的數據。這意味着數據的速度在增長。一個系統如何處理這個速度?當必須實時分析大量流入的數據時,問題就變得複雜了。許多系統正在開發,以處理這種巨大的數據流入。將傳統數據與大數據區別開來的另外一個因素是數據的多樣性。程序員
數據的多樣性使得它很是複雜,傳統的數據分析系統沒法正確地分析它。咱們說的是哪種?數據不就是數據嗎?圖像數據不一樣於表格數據,由於它的組織和保存方式不一樣。可使用無限數量的文件系統。每一個文件系統都須要一種不一樣的方法來處理它。讀取和寫入JSON文件與處理CSV文件的方式不一樣。如今,數據科學家必須處理數據類型的組合。您將要處理的數據多是圖片、視頻、文本等的組合。大數據的多樣性使得分析變得更加複雜。算法
你能想象一個邏輯錯誤的計算機程序產生正確的輸出嗎?一樣,不許確的數據將提供誤導的結果。準確性,或數據正確性,是一個重要的問題。對於大數據,咱們必須考慮數據的異常。sql
Hadoop是一個解決大數據問題的分佈式、可伸縮的框架。Hadoop是由Doug Cutting和Mark Cafarella開發的。Hadoop是用Java編寫的。它能夠安裝在一組商用硬件上,而且能夠在分佈式系統上水平擴展。mongodb
在商品硬件上工做使它很是高效。若是咱們的工做是在商品硬件,故障是一個不可避免的問題。可是Hadoop爲數據存儲和計算提供了一個容錯系統。這種容錯能力使得Hadoop很是流行。shell
Hadoop有兩個組件:第一個組件是HDFS(Hadoop Distributed File System),它是一個分佈式文件系統。第二個組件是MapReduce。HDFS用於分佈式數據存儲,MapReduce用於對存儲在HDFS中的數據執行計算。數據庫
HDFS用於以分佈式和容錯的方式存儲大量數據。HDFS是用Java編寫的,在普通硬件上運行。它的靈感來自於谷歌文件系統(GFS)的谷歌研究論文。它是一個寫一次讀屢次的系統,對大量的數據是有效的。HDFS有兩個組件NameNode和DataNode。apache
這兩個組件是Java守護進程。NameNode負責維護分佈在集羣上的文件的元數據,它是許多datanode的主節點。HDFS將大文件分紅小塊,並將這些塊保存在不一樣的datanode上。實際的文件數據塊駐留在datanode上。HDFS提供了一組類unix-shell的命令。可是,咱們可使用HDFS提供的Java filesystem API在更細的級別上處理大型文件。容錯是經過複製數據塊來實現的。
咱們可使用並行的單線程進程訪問HDFS文件。HDFS提供了一個很是有用的實用程序,稱爲distcp,它一般用於以並行方式將數據從一個HDFS系統傳輸到另外一個HDFS系統。它使用並行映射任務複製數據。
計算的MapReduce模型最先出如今谷歌的一篇研究論文中。Hadoop的MapReduce是Hadoop框架的計算引擎,它在HDFS中對分佈式數據進行計算。MapReduce已被發現能夠在商品硬件的分佈式系統上進行水平伸縮。它也適用於大問題。在MapReduce中,問題的解決分爲Map階段和Reduce階段。在Map階段,處理數據塊,在Reduce階段,對Map階段的結果運行聚合或縮減操做。Hadoop的MapReduce框架也是用Java編寫的。
MapReduce是一個主從模型。在Hadoop 1中,這個MapReduce計算由兩個守護進程Jobtracker和Tasktracker管理。Jobtracker是處理許多任務跟蹤器的主進程。Tasktracker是Jobtracker的從節點。但在Hadoop 2中,Jobtracker和Tasktracker被YARN取代。
咱們可使用框架提供的API和Java編寫MapReduce代碼。Hadoop streaming體模塊使具備Python和Ruby知識的程序員可以編寫MapReduce程序。
MapReduce算法有不少用途。如許多機器學習算法都被Apache Mahout實現,它能夠在Hadoop上經過Pig和Hive運行。
可是MapReduce並不適合迭代算法。在每一個Hadoop做業結束時,MapReduce將數據保存到HDFS併爲下一個做業再次讀取數據。咱們知道,將數據讀入和寫入文件是代價高昂的活動。Apache Spark經過提供內存中的數據持久性和計算,減輕了MapReduce的缺點。
更多關於Mapreduce 和 Mahout 能夠查看以下網頁:
計算機科學是一個抽象的世界。每一個人都知道數據是以位的形式出現的信息。像C這樣的編程語言提供了對機器和彙編語言的抽象。其餘高級語言提供了更多的抽象。結構化查詢語言(Structured Query Language, SQL)就是這些抽象之一。世界各地的許多數據建模專家都在使用SQL。Hadoop很是適合大數據分析。那麼,瞭解SQL的廣大用戶如何利用Hadoop在大數據上的計算能力呢?爲了編寫Hadoop的MapReduce程序,用戶必須知道能夠用來編寫Hadoop的MapReduce程序的編程語言。
現實世界中的平常問題遵循必定的模式。一些問題在平常生活中很常見,好比數據操做、處理缺失值、數據轉換和數據彙總。爲這些平常問題編寫MapReduce代碼對於非程序員來講是一項使人頭暈目眩的工做。編寫代碼來解決問題不是一件很聰明的事情。可是編寫具備性能可伸縮性和可擴展性的高效代碼是有價值的。考慮到這個問題,Apache Hive就在Facebook開發出來,它能夠解決平常問題,而不須要爲通常問題編寫MapReduce代碼。
根據Hive wiki的語言,Hive是一個基於Apache Hadoop的數據倉庫基礎設施。Hive有本身的SQL方言,稱爲Hive查詢語言。它被稱爲HiveQL,有時也稱爲HQL。使用HiveQL, Hive查詢HDFS中的數據。Hive不只運行在HDFS上,還運行在Spark和其餘大數據框架上,好比Apache Tez。
Hive爲HDFS中的結構化數據向用戶提供了相似關係數據庫管理系統的抽象。您能夠建立表並在其上運行相似sql的查詢。Hive將表模式保存在一些RDBMS中。Apache Derby是Apache Hive發行版附帶的默認RDBMS。Apache Derby徹底是用Java編寫的,是Apache License Version 2.0附帶的開源RDBMS。
HiveQL命令被轉換成Hadoop的MapReduce代碼,而後在Hadoop集羣上運行。
瞭解SQL的人能夠輕鬆學習Apache Hive和HiveQL,而且能夠在平常的大數據數據分析工做中使用Hadoop的存儲和計算能力。PySpark SQL也支持HiveQL。您能夠在PySpark SQL中運行HiveQL命令。除了執行HiveQL查詢,您還能夠直接從Hive讀取數據到PySpark SQL並將結果寫入Hive
相關連接:
Apache Pig是一個數據流框架,用於對大量數據執行數據分析。它是由雅虎開發的,並向Apache軟件基金會開放源代碼。它如今能夠在Apache許可2.0版本下使用。Pig編程語言是一種Pig拉丁腳本語言。Pig鬆散地鏈接到Hadoop,這意味着咱們能夠將它鏈接到Hadoop並執行許多分析。可是Pig能夠與Apache Tez和Apache Spark等其餘工具一塊兒使用。
Apache Hive用做報告工具,其中Apache Pig用於提取、轉換和加載(ETL)。咱們可使用用戶定義函數(UDF)擴展Pig的功能。用戶定義函數能夠用多種語言編寫,包括Java、Python、Ruby、JavaScript、Groovy和Jython。
Apache Pig使用HDFS讀取和存儲數據,Hadoop的MapReduce執行算法。Apache Pig在使用Hadoop集羣方面相似於Apache Hive。在Hadoop上,Pig命令首先轉換爲Hadoop的MapReduce代碼。而後將它們轉換爲MapReduce代碼,該代碼運行在Hadoop集羣上。
Pig最好的部分是對代碼進行優化和測試,以處理平常問題。因此用戶能夠直接安裝Pig並開始使用它。Pig提供了Grunt shell來運行交互式的Pig命令。所以,任何瞭解Pig Latin的人均可以享受HDFS和MapReduce的好處,而不須要了解Java或Python等高級編程語言。
相關連接
Apache Kafka是一個發佈-訂閱的分佈式消息傳遞平臺。它由LinkedIn開發,並進一步開源給Apache基金會。它是容錯的、可伸縮的和快速的。Kafka術語中的消息(數據的最小單位)經過Kafka服務器從生產者流向消費者,而且能夠在稍後的時間被持久化和使用。
Kafka提供了一個內置的API,開發人員可使用它來構建他們的應用程序。接下來咱們討論Apache Kafka的三個主要組件。
Kafka Producer 將消息生成到Kafka主題,它能夠將數據發佈到多個主題。
這是運行在專用機器上的Kafka服務器,消息由Producer推送到Broker。Broker將主題保存在不一樣的分區中,這些分區被複制到不一樣的Broker以處理錯誤。它本質上是無狀態的,所以使用者必須跟蹤它所消費的消息。
Consumer從Kafka代理獲取消息。記住,它獲取消息。Kafka Broker不會將消息推送給Consumer;相反,Consumer從Kafka Broker中提取數據。Consumer訂閱Kafka Broker上的一個或多個主題,並讀取消息。Broker還跟蹤它所使用的全部消息。數據將在Broker中保存指定的時間。若是使用者失敗,它能夠在從新啓動後獲取數據。
相關連接:
Apache Spark是一個通用的分佈式編程框架。它被認爲很是適合迭代和批處理數據。它是在AMP實驗室開發的,它提供了一個內存計算框架。它是開源軟件。一方面,它最適合批量處理,另外一方面,它對實時或接近實時的數據很是有效。機器學習和圖形算法本質上是迭代的,這就是Spark的神奇之處。根據它的研究論文,它比它的同行Hadoop快得多。數據能夠緩存在內存中。在迭代算法中緩存中間數據提供了驚人的快速處理。Spark可使用Java、Scala、Python和R進行編程。
若是您認爲Spark是通過改進的Hadoop,在某種程度上,確實是能夠這麼認爲的。由於咱們能夠在Spark中實現MapReduce算法,因此Spark使用了HDFS的優勢。這意味着它能夠從HDFS讀取數據並將數據存儲到HDFS,並且它能夠有效地處理迭代計算,由於數據能夠保存在內存中。除了內存計算外,它還適用於交互式數據分析。
還有許多其餘庫也位於PySpark之上,以便更容易地使用PySpark。下面咱們將討論一些:
數據科學家處理的大多數數據在本質上要麼是結構化的,要麼是半結構化的。爲了處理結構化和半結構化數據集,PySpark SQL模塊是該PySpark核心之上的更高級別抽象。咱們將在整本書中學習PySpark SQL。它內置在PySpark中,這意味着它不須要任何額外的安裝。
使用PySpark SQL,您能夠從許多源讀取數據。PySpark SQL支持從許多文件格式系統讀取,包括文本文件、CSV、ORC、Parquet、JSON等。您能夠從關係數據庫管理系統(RDBMS)讀取數據,如MySQL和PostgreSQL。您還能夠將分析報告保存到許多系統和文件格式。
DataFrames是一種抽象,相似於關係數據庫系統中的表。它們由指定的列組成。DataFrames是行對象的集合,這些對象在PySpark SQL中定義。DataFrames也由指定的列對象組成。用戶知道表格形式的模式,所以很容易對數據流進行操做。
DataFrame 列中的元素將具備相同的數據類型。DataFrame 中的行可能由不一樣數據類型的元素組成。基本數據結構稱爲彈性分佈式數據集(RDD)。數據流是RDD上的包裝器。它們是RDD或row對象。
相關連接:
SparkSession對象是替換SQLContext和HiveContext的入口點。爲了使PySpark SQL代碼與之前的版本兼容,SQLContext和HiveContext將繼續在PySpark中運行。在PySpark控制檯中,咱們得到了SparkSession對象。咱們可使用如下代碼建立SparkSession對象。
爲了建立SparkSession對象,咱們必須導入SparkSession,以下所示。
from pyspark.sql import SparkSession
複製代碼
導入SparkSession後,咱們可使用SparkSession.builder進行操做:
spark = SparkSession.builder.appName("PythonSQLAPP") .getOrCreate()
複製代碼
appName函數將設置應用程序的名稱。函數的做用是:返回一個現有的SparkSession對象。若是不存在SparkSession對象,getOrCreate()函數將建立一個新對象並返回它。
咱們可使用結構化流框架(PySpark SQL的包裝器)進行流數據分析。咱們可使用結構化流以相似的方式對流數據執行分析,就像咱們使用PySpark SQL對靜態數據執行批處理分析同樣。正如Spark流模塊對小批執行流操做同樣,結構化流引擎也對小批執行流操做。結構化流最好的部分是它使用了相似於PySpark SQL的API。所以,學習曲線很高。對數據流的操做進行優化,並以相似的方式在性能上下文中優化結構化流API。
SQL是一種聲明性語言。使用SQL,咱們告訴SQL引擎要作什麼。咱們不告訴它如何執行任務。相似地,PySpark SQL命令不會告訴它如何執行任務。這些命令只告訴它要執行什麼。所以,PySpark SQL查詢在執行任務時須要優化。catalyst優化器在PySpark SQL中執行查詢優化。PySpark SQL查詢被轉換爲低級的彈性分佈式數據集(RDD)操做。catalyst優化器首先將PySpark SQL查詢轉換爲邏輯計劃,而後將此邏輯計劃轉換爲優化的邏輯計劃。從這個優化的邏輯計劃建立一個物理計劃。建立多個物理計劃。使用成本分析儀,選擇最優的物理方案。最後,建立低層RDD操做代碼。
在分佈式系統中,做業或應用程序被分紅不一樣的任務,這些任務能夠在集羣中的不一樣機器上並行運行。若是機器發生故障,您必須在另外一臺機器上從新安排任務。
因爲資源管理不善,分佈式系統一般面臨可伸縮性問題。考慮一個已經在集羣上運行的做業。另外一我的想作另外一份工做。第二項工做必須等到第一項工做完成。可是這樣咱們並無最優地利用資源。資源管理很容易解釋,可是很難在分佈式系統上實現。開發集羣管理器是爲了優化集羣資源的管理。有三個集羣管理器可用於Spark單機、Apache Mesos和YARN。這些集羣管理器最好的部分是,它們在用戶和集羣之間提供了一個抽象層。因爲集羣管理器提供的抽象,用戶體驗就像在一臺機器上工做,儘管他們在集羣上工做。集羣管理器將集羣資源調度到正在運行的應用程序。
Apache Spark附帶一個單機集羣管理器。它提供了一個主從架構來激發集羣。它是一個只使用spark的集羣管理器。您只能使用這個獨立的集羣管理器運行Spark應用程序。它的組件是主組件和工做組件。工人是主過程的奴隸,它是最簡單的集羣管理器。可使用Spark的sbin目錄中的腳本配置Spark獨立集羣管理器。
Apache Mesos是一個通用的集羣管理器。它是在加州大學伯克利分校的AMP實驗室開發的。Apache Mesos幫助分佈式解決方案有效地擴展。您可使用Mesos在同一個集羣上使用不一樣的框架運行不一樣的應用程序。來自不一樣框架的不一樣應用程序的含義是什麼?這意味着您能夠在Mesos上同時運行Hadoop應用程序和Spark應用程序。當多個應用程序在Mesos上運行時,它們共享集羣的資源。Apache Mesos有兩個重要組件:主組件和從組件。這種主從架構相似於Spark獨立集羣管理器。運行在Mesos上的應用程序稱爲框架。奴隸告訴主人做爲資源提供的可用資源。從機按期提供資源。主服務器的分配模塊決定哪一個框架獲取資源。
YARN表明着另外一個資源談判者(Resource Negotiator)。在Hadoop 2中引入了YARN來擴展Hadoop。資源管理與做業管理分離。分離這兩個組件使Hadoop的伸縮性更好。YARN的主要成分是資源管理器(Resource Manager)、應用程序管理器(Application Master)和節點管理器(Node Manager)。有一個全局資源管理器,每一個集羣將運行許多節點管理器。節點管理器是資源管理器的奴隸。調度程序是ResourceManager的組件,它爲集羣上的不一樣應用程序分配資源。最棒的部分是,您能夠在YARN管理的集羣上同時運行Spark應用程序和任何其餘應用程序,如Hadoop或MPI。每一個應用程序有一個application master,它處理在分佈式系統上並行運行的任務。另外,Hadoop和Spark有它們本身的ApplicationMaster。
相關連接:
關係數據庫管理系統在許多組織中仍然很是常見。這裏的關係是什麼意思?關係表。PostgreSQL是一個關係數據庫管理系統。它能夠運行在全部主要的操做系統上,好比Microsoft Windows、基於unix的操做系統、MacOS X等等。它是一個開源程序,代碼在PostgreSQL許可下可用。所以,您能夠自由地使用它,並根據您的需求進行修改。
PostgreSQL數據庫能夠經過其餘編程語言(如Java、Perl、Python、C和c++)和許多其餘語言(經過不一樣的編程接口)鏈接。還可使用與PL/SQL相似的過程編程語言PL/pgSQL(過程語言/PostgreSQL)對其進行編程。您能夠向該數據庫添加自定義函數。您能夠用C/ c++和其餘編程語言編寫自定義函數。您還可使用JDBC鏈接器從PySpark SQL中讀取PostgreSQL中的數據。
PostgreSQL遵循ACID(Atomicity, Consistency, Isolation and Durability/原子性、一致性、隔離性和持久性)原則。它具備許多特性,其中一些是PostgreSQL獨有的。它支持可更新視圖、事務完整性、複雜查詢、觸發器等。PostgreSQL使用多版本併發控制模型進行併發管理。
PostgreSQL獲得了普遍的社區支持。PostgreSQL被設計和開發爲可擴展的。
相關連接:
MongoDB是一個基於文檔的NoSQL數據庫。它是一個開放源碼的分佈式數據庫,由MongoDB公司開發。MongoDB是用c++編寫的,它是水平伸縮的。許多組織將其用於後端數據庫和許多其餘用途。
MongoDB附帶一個mongo shell,這是一個到MongoDB服務器的JavaScript接口。mongo shell能夠用來運行查詢以及執行管理任務。在mongo shell上,咱們也能夠運行JavaScript代碼。
使用PySpark SQL,咱們能夠從MongoDB讀取數據並執行分析。咱們也能夠寫出結果。
相關連接:
Cassandra是開放源碼的分佈式數據庫,附帶Apache許可證。這是一個由Facebook開發的NoSQL數據庫。它是水平可伸縮的,最適合處理結構化數據。它提供了高水平的一致性,而且具備可調的一致性。它沒有一個單一的故障點。它使用對等的分佈式體系結構在不一樣的節點上覆制數據。節點使用閒話協議交換信息。
相關連接: