本文主要是關于大數據開發的相關介紹,并著重對大數據開發的算法運算進行了詳盡的闡述。
大數據
大數據(big data),指無法在一定時間范圍內用常規軟件工具進行捕捉、管理和處理的數據集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信息資產。 [1]
在維克托·邁爾-舍恩伯格及肯尼斯·庫克耶編寫的《大數據時代》 [2] 中大數據指不用隨機分析法(抽樣調查)這樣捷徑,而采用所有數據進行分析處理。大數據的5V特點(IBM提出):Volume(大量)、Velocity(高速)、Variety(多樣)、Value(低價值密度)、Veracity(真實性)。
大數據(big data),指無法在一定時間范圍內用常規軟件工具進行捕捉、管理和處理的數據集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信息資產。 [1]
在維克托·邁爾-舍恩伯格及肯尼斯·庫克耶編寫的《大數據時代》 [2] 中大數據指不用隨機分析法(抽樣調查)這樣捷徑,而采用所有數據進行分析處理。大數據的5V特點(IBM提出):Volume(大量)、Velocity(高速)、Variety(多樣)、Value(低價值密度)、Veracity(真實性)。
對于“大數據”(Big data)研究機構Gartner給出了這樣的定義。“大數據”是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力來適應海量、高增長率和多樣化的信息資產。 [1]
麥肯錫全球研究所給出的定義是:一種規模大到在獲取、存儲、管理、分析方面大大超出了傳統數據庫軟件工具能力范圍的數據集合,具有海量的數據規模、快速的數據流轉、多樣的數據類型和價值密度低四大特征。 [4]
大數據技術的戰略意義不在于掌握龐大的數據信息,而在于對這些含有意義的數據進行專業化處理。換而言之,如果把大數據比作一種產業,那么這種產業實現盈利的關鍵,在于提高對數據的“加工能力”,通過“加工”實現數據的“增值”。 [5]
從技術上看,大數據與云計算的關系就像一枚硬幣的正反面一樣密不可分。大數據必然無法用單臺的計算機進行處理,必須采用分布式架構。它的特色在于對海量數據進行分布式數據挖掘。但它必須依托云計算的分布式處理、分布式數據庫和云存儲、虛擬化技術。 [2]
隨著云時代的來臨,大數據(Big data)也吸引了越來越多的關注。分析師團隊認為,大數據(Big data)通常用來形容一個公司創造的大量非結構化數據和半結構化數據,這些數據在下載到關系型數據庫用于分析時會花費過多時間和金錢。大數據分析常和云計算聯系到一起,因為實時的大型數據集分析需要像MapReduce一樣的框架來向數十、數百或甚至數千的電腦分配工作。
大數據需要特殊的技術,以有效地處理大量的容忍經過時間內的數據。適用于大數據的技術,包括大規模并行處理(MPP)數據庫、數據挖掘、分布式文件系統、分布式數據庫、云計算平臺、互聯網和可擴展的存儲系統。
最小的基本單位是bit,按順序給出所有單位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。
它們按照進率1024(2的十次方)來計算:
1 Byte =8 bit
1 KB = 1,024 Bytes = 8192 bit
1 MB = 1,024 KB = 1,048,576 Bytes
1 GB = 1,024 MB = 1,048,576 KB
1 TB = 1,024 GB = 1,048,576 MB
1 PB = 1,024 TB = 1,048,576 GB
1 EB = 1,024 PB = 1,048,576 TB
1 ZB = 1,024 EB = 1,048,576 PB
1 YB = 1,024 ZB = 1,048,576 EB
1 BB = 1,024 YB = 1,048,576 ZB
1 NB = 1,024 BB = 1,048,576 YB
1 DB = 1,024 NB = 1,048,576 BB
全稱:
1 Bit(比特) =Binary Digit
8Bits = 1 Byte(字節)
1,000 Bytes = 1 Kilobyte
1,000Kilobytes = 1 Megabyte
1,000 Megabytes = 1 Gigabyte
1,000 Gigabytes = 1Terabyte
1,000 Terabytes = 1 Petabyte
1,000 Petabytes = 1 Exabyte
1,000Exabytes = 1 Zettabyte
1,000 Zettabytes = 1 Yottabyte
1,000 Yottabytes = 1Brontobyte
1,000 Brontobytes = 1 Geopbyte
特征
容量(Volume):數據的大小決定所考慮的數據的價值和潛在的信息; [6]
種類(Variety):數據類型的多樣性; [6]
速度(Velocity):指獲得數據的速度; [6]
可變性(Variability):妨礙了處理和有效地管理數據的過程。 [6]
真實性(Veracity):數據的質量 [6]
復雜性(Complexity):數據量巨大,來源多渠道 [6]
價值(value):合理運用大數據,以低成本創造高價值
大數據開發常用算法
奧地利符號計算研究所(Research Institute for Symbolic Computation,簡稱RISC)的Christoph Koutschan博士在自己的頁面上發布了一篇文章,提到他做了一個調查,參與者大多數是計算機科學家,他請這些科學家投票選出最重要的算法,以下是這次調查的結果,按照英文名稱字母順序排序。
1、A* 搜索算法——圖形搜索算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的最佳路徑,并以之為各個地點排定次序。算法以得到的次序訪問這些節點。因此,A*搜索算法是最佳優先搜索的范例。
2、集束搜索(又名定向搜索,Beam Search)——最佳優先搜索算法的優化。使用啟發式函數評估它檢查的每個節點的能力。不過,集束搜索只能在每個深度中發現最前面的m個最符合條件的節點,m是固定數字——集束的寬度。
3、二分查找(Binary Search)——在線性數組中找特定值的算法,每個步驟去掉一半不符合要求的數據。
4、分支界定算法(Branch and Bound)——在多種最優化問題中尋找特定最優化解決方案的算法,特別是針對離散、組合的最優化。
5、Buchberger算法——一種數學算法,可將其視為針對單變量最大公約數求解的歐幾里得算法和線性系統中高斯消元法的泛化。
6、數據壓縮——采取特定編碼方案,使用更少的字節數(或是其他信息承載單元)對信息編碼的過程,又叫來源編碼。
7、Diffie-Hellman密鑰交換算法——一種加密協議,允許雙方在事先不了解對方的情況下,在不安全的通信信道中,共同建立共享密鑰。該密鑰以后可與一個對稱密碼一起,加密后續通訊。
8、Dijkstra算法——針對沒有負值權重邊的有向圖,計算其中的單一起點最短算法。
9、離散微分算法(Discrete differentiation)。
10、動態規劃算法(Dynamic Programming)——展示互相覆蓋的子問題和最優子架構算法
11、歐幾里得算法(Euclidean algorithm)——計算兩個整數的最大公約數。最古老的算法之一,出現在公元前300前歐幾里得的《幾何原本》。
12、期望-最大算法(Expectation-maximization algorithm,又名EM-Training)——在統計計算中,期望-最大算法在概率模型中尋找可能性最大的參數估算值,其中模型依賴于未發現的潛在變量。EM在兩個步驟中交替計算,第一步是計算期望,利用對隱藏變量的現有估計值,計算其最大可能估計值;第二步是最大化,最大化在第一步上求得的最大可能值來計算參數的值。
13、快速傅里葉變換(Fast Fourier transform,FFT)——計算離散的傅里葉變換(DFT)及其反轉。該算法應用范圍很廣,從數字信號處理到解決偏微分方程,到快速計算大整數乘積。
14、梯度下降(Gradient descent)——一種數學上的最優化算法。
15、哈希算法(Hashing)。
16、堆排序(Heaps)。
17、Karatsuba乘法——需要完成上千位整數的乘法的系統中使用,比如計算機代數系統和大數程序庫,如果使用長乘法,速度太慢。該算法發現于1962年。
18、LLL算法(Lenstra-Lenstra-Lovasz lattice reduction)——以格規約(lattice)基數為輸入,輸出短正交向量基數。LLL算法在以下公共密鑰加密方法中有大量使用:背包加密系統(knapsack)、有特定設置的RSA加密等等。
19、最大流量算法(Maximum flow)——該算法試圖從一個流量網絡中找到最大的流。它優勢被定義為找到這樣一個流的值。最大流問題可以看作更復雜的網絡流問題的特定情況。最大流與網絡中的界面有關,這就是最大流-最小截定理(Max-flow min-cut theorem)。Ford-Fulkerson 能找到一個流網絡中的最大流。
20、合并排序(Merge Sort)。
21、牛頓法(Newton‘s method)——求非線性方程(組)零點的一種重要的迭代法。
22、Q-learning學習算法——這是一種通過學習動作值函數(action-value function)完成的強化學習算法,函數采取在給定狀態的給定動作,并計算出期望的效用價值,在此后遵循固定的策略。Q-leanring的優勢是,在不需要環境模型的情況下,可以對比可采納行動的期望效用。
23、兩次篩法(Quadratic Sieve)——現代整數因子分解算法,在實踐中,是目前已知第二快的此類算法(僅次于數域篩法Number Field Sieve)。對于110位以下的十位整數,它仍是最快的,而且都認為它比數域篩法更簡單。
24、RANSAC——是“RANdom SAmple Consensus”的縮寫。該算法根據一系列觀察得到的數據,數據中包含異常值,估算一個數學模型的參數值。其基本假設是:數據包含非異化值,也就是能夠通過某些模型參數解釋的值,異化值就是那些不符合模型的數據點。
25、RSA——公鑰加密算法。首個適用于以簽名作為加密的算法。RSA在電商行業中仍大規模使用,大家也相信它有足夠安全長度的公鑰。
26、Sch?nhage-Strassen算法——在數學中,Sch?nhage-Strassen算法是用來完成大整數的乘法的快速漸近算法。其算法復雜度為:O(N log(N) log(log(N))),該算法使用了傅里葉變換。
27、單純型算法(Simplex Algorithm)——在數學的優化理論中,單純型算法是常用的技術,用來找到線性規劃問題的數值解。線性規劃問題包括在一組實變量上的一系列線性不等式組,以及一個等待最大化(或最小化)的固定線性函數。
28、奇異值分解(Singular value decomposition,簡稱SVD)——在線性代數中,SVD是重要的實數或復數矩陣的分解方法,在信號處理和統計中有多種應用,比如計算矩陣的偽逆矩陣(以求解最小二乘法問題)、解決超定線性系統(overdetermined linear systems)、矩陣逼近、數值天氣預報等等。
29、求解線性方程組(Solving a system of linear equations)——線性方程組是數學中最古老的問題,它們有很多應用,比如在數字信號處理、線性規劃中的估算和預測、數值分析中的非線性問題逼近等等。求解線性方程組,可以使用高斯—約當消去法(Gauss-Jordan elimination),或是柯列斯基分解( Cholesky decomposition)。
30、Strukturtensor算法——應用于模式識別領域,為所有像素找出一種計算方法,看看該像素是否處于同質區域( homogenous region),看看它是否屬于邊緣,還是是一個頂點。
31、合并查找算法(Union-find)——給定一組元素,該算法常常用來把這些元素分為多個分離的、彼此不重合的組。不相交集(disjoint-set)的數據結構可以跟蹤這樣的切分方法。合并查找算法可以在此種數據結構上完成兩個有用的操作:
查找:判斷某特定元素屬于哪個組。
合并:聯合或合并兩個組為一個組。
32、維特比算法(Viterbi algorithm)——尋找隱藏狀態最有可能序列的動態規劃算法,這種序列被稱為維特比路徑,其結果是一系列可以觀察到的事件,特別是在隱藏的Markov模型中。
大數據開發初學者學習路線
1.1 學會百度與Google
不論遇到什么問題,先試試搜索并自己解決。
Google首選,翻不過去的,就用百度吧。
1.2 參考資料首選官方文檔
特別是對于入門來說,官方文檔永遠是首選文檔。
相信搞這塊的大多是文化人,英文湊合就行,實在看不下去的,請參考第一步。
1.3 先讓Hadoop跑起來
Hadoop可以算是大數據存儲和計算的開山鼻祖,現在大多開源的大數據框架都依賴Hadoop或者與它能很好的兼容。
關于Hadoop,你至少需要搞清楚以下是什么:
Hadoop 1.0、Hadoop 2.0
MapReduce、HDFS
NameNode、DataNode
JobTracker、TaskTracker
Yarn、ResourceManager、NodeManager
自己搭建Hadoop,請使用第一步和第二步,能讓它跑起來就行。
建議先使用安裝包命令行安裝,不要使用管理工具安裝。
另外:Hadoop1.0知道它就行了,現在都用Hadoop 2.0.
1.4 試試使用Hadoop
HDFS目錄操作命令;
上傳、下載文件命令;
提交運行MapReduce示例程序;
打開Hadoop WEB界面,查看Job運行狀態,查看Job運行日志。
知道Hadoop的系統日志在哪里。
1.5 你該了解它們的原理了
MapReduce:如何分而治之;
HDFS:數據到底在哪里,什么是副本;
Yarn到底是什么,它能干什么;
NameNode到底在干些什么;
ResourceManager到底在干些什么;
1.6 自己寫一個MapReduce程序
請仿照WordCount例子,自己寫一個(照抄也行)WordCount程序,
打包并提交到Hadoop運行。
你不會Java?Shell、Python都可以,有個東西叫Hadoop Streaming。
如果你認真完成了以上幾步,恭喜你,你的一只腳已經進來了。
第二章:更高效的WordCount
2.1 學點SQL吧
你知道數據庫嗎?你會寫SQL嗎?
如果不會,請學點SQL吧。
2.2 SQL版WordCount
在1.6中,你寫(或者抄)的WordCount一共有幾行代碼?
給你看看我的:
SELECT word,COUNT(1) FROM wordcount GROUP BY word;
這便是SQL的魅力,編程需要幾十行,甚至上百行代碼,我這一句就搞定;使用SQL處理分析Hadoop上的數據,方便、高效、易上手、更是趨勢。不論是離線計算還是實時計算,越來越多的大數據處理框架都在積極提供SQL接口。
2.3 SQL On Hadoop之Hive
什么是Hive?官方給的解釋是:
The Apache Hive data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage and queried using SQL syntax.
為什么說Hive是數據倉庫工具,而不是數據庫工具呢?有的朋友可能不知道數據倉庫,數據倉庫是邏輯上的概念,底層使用的是數據庫,數據倉庫中的數據有這兩個特點:最全的歷史數據(海量)、相對穩定的;所謂相對穩定,指的是數據倉庫不同于業務系統數據庫,數據經常會被更新,數據一旦進入數據倉庫,很少會被更新和刪除,只會被大量查詢。而Hive,也是具備這兩個特點,因此,Hive適合做海量數據的數據倉庫工具,而不是數據庫工具。
2.4 安裝配置Hive
請參考1.1 和 1.2 完成Hive的安裝配置。可以正常進入Hive命令行。
2.5 試試使用Hive
請參考1.1 和 1.2 ,在Hive中創建wordcount表,并運行2.2中的SQL語句。
在Hadoop WEB界面中找到剛才運行的SQL任務。
看SQL查詢結果是否和1.4中MapReduce中的結果一致。
2.6 Hive是怎么工作的
明明寫的是SQL,為什么Hadoop WEB界面中看到的是MapReduce任務?
2.7 學會Hive的基本命令
創建、刪除表;
加載數據到表;
下載Hive表的數據;
請參考1.2,學習更多關于Hive的語法和命令。
如果你已經按照《寫給大數據開發初學者的話》中第一章和第二章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識點:
0和Hadoop2.0的區別;
MapReduce的原理(還是那個經典的題目,一個10G大小的文件,給定1G大小的內存,如何使用Java程序統計出現次數最多的10個單詞及次數);
HDFS讀寫數據的流程;向HDFS中PUT數據;從HDFS中下載數據;
自己會寫簡單的MapReduce程序,運行出現問題,知道在哪里查看日志;
會寫簡單的SELECT、WHERE、GROUP BY等SQL語句;
Hive SQL轉換成MapReduce的大致流程;
Hive中常見的語句:創建表、刪除表、往表中加載數據、分區、將表中數據下載到本地;
從上面的學習,你已經了解到,HDFS是Hadoop提供的分布式存儲框架,它可以用來存儲海量數據,MapReduce是Hadoop提供的分布式計算框架,它可以用來統計和分析HDFS上的海量數據,而Hive則是SQL On Hadoop,Hive提供了SQL接口,開發人員只需要編寫簡單易上手的SQL語句,Hive負責把SQL翻譯成MapReduce,提交運行。
此時,你的”大數據平臺”是這樣的:
那么問題來了,海量數據如何到HDFS上呢?
第三章:把別處的數據搞到Hadoop上
此處也可以叫做數據采集,把各個數據源的數據采集到Hadoop上。
3.1 HDFS PUT命令
這個在前面你應該已經使用過了。
put命令在實際環境中也比較常用,通常配合shell、python等腳本語言來使用。
建議熟練掌握。
3.2 HDFS API
HDFS提供了寫數據的API,自己用編程語言將數據寫入HDFS,put命令本身也是使用API。
實際環境中一般自己較少編寫程序使用API來寫數據到HDFS,通常都是使用其他框架封裝好的方法。比如:Hive中的INSERT語句,Spark中的saveAsTextfile等。
建議了解原理,會寫Demo。
3.3 Sqoop
Sqoop是一個主要用于Hadoop/Hive與傳統關系型數據庫
Oracle/MySQL/SQLServer等之間進行數據交換的開源框架。
就像Hive把SQL翻譯成MapReduce一樣,Sqoop把你指定的參數翻譯成MapReduce,提交到Hadoop運行,完成Hadoop與其他數據庫之間的數據交換。
自己下載和配置Sqoop(建議先使用Sqoop1,Sqoop2比較復雜)。
了解Sqoop常用的配置參數和方法。
使用Sqoop完成從MySQL同步數據到HDFS;
使用Sqoop完成從MySQL同步數據到Hive表;
PS:如果后續選型確定使用Sqoop作為數據交換工具,那么建議熟練掌握,否則,了解和會用Demo即可。
3.4 Flume
Flume是一個分布式的海量日志采集和傳輸框架,因為“采集和傳輸框架”,所以它并不適合關系型數據庫的數據采集和傳輸。
Flume可以實時的從網絡協議、消息系統、文件系統采集日志,并傳輸到HDFS上。
因此,如果你的業務有這些數據源的數據,并且需要實時的采集,那么就應該考慮使用Flume。
下載和配置Flume。
使用Flume監控一個不斷追加數據的文件,并將數據傳輸到HDFS;
PS:Flume的配置和使用較為復雜,如果你沒有足夠的興趣和耐心,可以先跳過Flume。
3.5 阿里開源的DataX
之所以介紹這個,是因為我們公司目前使用的Hadoop與關系型數據庫數據交換的工具,就是之前基于DataX開發的,非常好用。
可以參考我的博文《異構數據源海量數據交換工具-Taobao DataX 下載和使用》。
現在DataX已經是3.0版本,支持很多數據源。
你也可以在其之上做二次開發。
PS:有興趣的可以研究和使用一下,對比一下它與Sqoop。
如果你認真完成了上面的學習和實踐,此時,你的”大數據平臺”應該是這樣的:
第四章:把Hadoop上的數據搞到別處去
前面介紹了如何把數據源的數據采集到Hadoop上,數據到Hadoop上之后,便可以使用Hive和MapReduce進行分析了。那么接下來的問題是,分析完的結果如何從Hadoop上同步到其他系統和應用中去呢?
其實,此處的方法和第三章基本一致的。
4.1 HDFS GET命令
把HDFS上的文件GET到本地。需要熟練掌握。
4.2 HDFS API
同3.2.
4.3 Sqoop
同3.3.
使用Sqoop完成將HDFS上的文件同步到MySQL;
使用Sqoop完成將Hive表中的數據同步到MySQL;
4.4 DataX
同3.5.
如果你認真完成了上面的學習和實踐,此時,你的”大數據平臺”應該是這樣的:
如果你已經按照《寫給大數據開發初學者的話2》中第三章和第四章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識點:
知道如何把已有的數據采集到HDFS上,包括離線采集和實時采集;
你已經知道sqoop(或者還有DataX)是HDFS和其他數據源之間的數據交換工具;
你已經知道flume可以用作實時的日志采集。
從前面的學習,對于大數據平臺,你已經掌握的不少的知識和技能,搭建Hadoop集群,把數據采集到Hadoop上,使用Hive和MapReduce來分析數據,把分析結果同步到其他數據源。
接下來的問題來了,Hive使用的越來越多,你會發現很多不爽的地方,特別是速度慢,大多情況下,明明我的數據量很小,它都要申請資源,啟動MapReduce來執行。
第五章:快一點吧,我的SQL
其實大家都已經發現Hive后臺使用MapReduce作為執行引擎,實在是有點慢。
因此SQL On Hadoop的框架越來越多,按我的了解,最常用的按照流行度依次為SparkSQL、Impala和Presto.
這三種框架基于半內存或者全內存,提供了SQL接口來快速查詢分析Hadoop上的數據。關于三者的比較,請參考1.1.
我們目前使用的是SparkSQL,至于為什么用SparkSQL,原因大概有以下吧:
使用Spark還做了其他事情,不想引入過多的框架;
Impala對內存的需求太大,沒有過多資源部署;
5.1 關于Spark和SparkSQL
什么是Spark,什么是SparkSQL。
Spark有的核心概念及名詞解釋。
SparkSQL和Spark是什么關系,SparkSQL和Hive是什么關系。
SparkSQL為什么比Hive跑的快。
5.2 如何部署和運行SparkSQL
Spark有哪些部署模式?
如何在Yarn上運行SparkSQL?
使用SparkSQL查詢Hive中的表。
PS: Spark不是一門短時間內就能掌握的技術,因此建議在了解了Spark之后,可以先從SparkSQL入手,循序漸進。
關于Spark和SparkSQL,可參考
http://lxw1234.com/archives/category/spark
如果你認真完成了上面的學習和實踐,此時,你的”大數據平臺”應該是這樣的:
第六章:一夫多妻制
請不要被這個名字所誘惑。其實我想說的是數據的一次采集、多次消費。
在實際業務場景下,特別是對于一些監控日志,想即時的從日志中了解一些指標(關于實時計算,后面章節會有介紹),這時候,從HDFS上分析就太慢了,盡管是通過Flume采集的,但Flume也不能間隔很短就往HDFS上滾動文件,這樣會導致小文件特別多。
為了滿足數據的一次采集、多次消費的需求,這里要說的便是Kafka。
6.1 關于Kafka
什么是Kafka?
Kafka的核心概念及名詞解釋。
6.2 如何部署和使用Kafka
使用單機部署Kafka,并成功運行自帶的生產者和消費者例子。
使用Java程序自己編寫并運行生產者和消費者程序。
Flume和Kafka的集成,使用Flume監控日志,并將日志數據實時發送至Kafka。
如果你認真完成了上面的學習和實踐,此時,你的”大數據平臺”應該是這樣的:
這時,使用Flume采集的數據,不是直接到HDFS上,而是先到Kafka,Kafka中的數據可以由多個消費者同時消費,其中一個消費者,就是將數據同步到HDFS。
如果你已經按照《寫給大數據開發初學者的話3》中第五章和第六章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識點:
為什么Spark比MapReduce快。
使用SparkSQL代替Hive,更快的運行SQL。
使用Kafka完成數據的一次收集,多次消費架構。
自己可以寫程序完成Kafka的生產者和消費者。
從前面的學習,你已經掌握了大數據平臺中的數據采集、數據存儲和計算、數據交換等大部分技能,而這其中的每一步,都需要一個任務(程序)來完成,各個任務之間又存在一定的依賴性,比如,必須等數據采集任務成功完成后,數據計算任務才能開始運行。如果一個任務執行失敗,需要給開發運維人員發送告警,同時需要提供完整的日志來方便查錯。
結語
關于大數據開發的相關介紹就到這了,如有不足之處歡迎指正。
-
SQL
+關注
關注
1文章
773瀏覽量
44224 -
大數據
+關注
關注
64文章
8908瀏覽量
137692
發布評論請先 登錄
相關推薦
評論