大數據處理流程
上圖是一個簡化的大數據處理流程圖,大數據處理的主要流程包括數據收集、數據存儲、數據處理、數據應用等主要環節。下面我們逐一對各個環節所需要的技術棧進行講解:
數據收集
大數據處理的第一步是數據的收集。現在的中大型項目通常采用微服務架構進行分布式部署,所以數據的采集需要在多台服務器上進行,且采集過程不能影響正常業務的開展。基於這種需求,就衍生了多種日志收集工具,如 Flume 、Logstash、Kibana 等,它們都能通過簡單的配置完成復雜的數據收集和數據聚合。
數據存儲
收集到數據后,下一個問題就是:數據該如何進行存儲?通常大家最為熟知是 MySQL、Oracle 等傳統的關系型數據庫,它們的優點是能夠快速存儲結構化的數據,並支持隨機訪問。但大數據的數據結構通常是半結構化(如日志數據)、甚至是非結構化的(如視頻、音頻數據),為了解決海量半結構化和非結構化數據的存儲,衍生了 Hadoop HDFS 、KFS、GFS 等分布式文件系統,它們都能夠支持結構化、半結構和非結構化數據的存儲,並可以通過增加機器進行橫向擴展。
分布式文件系統完美地解決了海量數據存儲的問題,但是一個優秀的數據存儲系統需要同時考慮數據存儲和訪問兩方面的問題,比如你希望能夠對數據進行隨機訪問,這是傳統的關系型數據庫所擅長的,但卻不是分布式文件系統所擅長的,那么有沒有一種存儲方案能夠同時兼具分布式文件系統和關系型數據庫的優點,基於這種需求,就產生了 HBase、MongoDB。
數據分析
大數據處理最重要的環節就是數據分析,數據分析通常分為兩種:批處理和流處理。
- 批處理:對一段時間內海量的離線數據進行統一的處理,對應的處理框架有 Hadoop MapReduce、Spark、Flink 等;
- 流處理:對運動中的數據進行處理,即在接收數據的同時就對其進行處理,對應的處理框架有 Storm、Spark Streaming、Flink Streaming 等。
批處理和流處理各有其適用的場景,時間不敏感或者硬件資源有限,可以采用批處理;時間敏感和及時性要求高就可以采用流處理。隨着服務器硬件的價格越來越低和大家對及時性的要求越來越高,流處理越來越普遍,如股票價格預測和電商運營數據分析等。
上面的框架都是需要通過編程來進行數據分析,那么如果你不是一個后台工程師,是不是就不能進行數據的分析了?當然不是,大數據是一個非常完善的生態圈,有需求就有解決方案。為了能夠讓熟悉 SQL 的人員也能夠進行數據的分析,查詢分析框架應運而生,常用的有 Hive 、Spark SQL 、Flink SQL、 Pig、Phoenix 等。這些框架都能夠使用標准的 SQL 或者 類 SQL 語法靈活地進行數據的查詢分析。這些 SQL 經過解析優化后轉換為對應的作業程序來運行,如 Hive 本質上就是將 SQL 轉換為 MapReduce 作業,Spark SQL 將 SQL 轉換為一系列的 RDDs 和轉換關系(transformations),Phoenix 將 SQL 查詢轉換為一個或多個 HBase Scan。
其他框架
上面是一個標准的大數據處理流程所用到的技術框架。但是實際的大數據處理流程比上面復雜很多,針對大數據處理中的各種復雜問題分別衍生了各類框架:
- 單機的處理能力都是存在瓶頸的,所以大數據框架都是采用集群模式進行部署,為了更方便的進行集群的部署、監控和管理,衍生了 Ambari、Cloudera Manager 等集群管理工具;
- 想要保證集群高可用,需要用到 ZooKeeper ,ZooKeeper 是最常用的分布式協調服務,它能夠解決大多數集群問題,包括首領選舉、失敗恢復、元數據存儲及其一致性保證。同時針對集群資源管理的需求,又衍生了 Hadoop YARN ;
- 復雜大數據處理的另外一個顯著的問題是,如何調度多個復雜的並且彼此之間存在依賴關系的作業?基於這種需求,產生了 Azkaban 和 Oozie 等工作流調度框架;
- 大數據流處理中使用的比較多的另外一個框架是 Kafka,它可以用於消峰,避免在秒殺等場景下並發數據對流處理程序造成沖擊;
- 另一個常用的框架是 Sqoop ,主要是解決了數據遷移的問題,它能夠通過簡單的命令將關系型數據庫中的數據導入到 HDFS 、Hive 或 HBase 中,或者從 HDFS 、Hive 導出到關系型數據庫上。