我們的數據從哪來?
互聯網行業:網站、APP、系統(交互系統)。
傳統行業:電信、上網、打電話、發短信等等。
數據源:網站、APP。
等等,這些用戶行為都回向我們的后台發送請求各種各樣的請求,和進行各種邏輯交互、交易和結賬等等。
請求轉發
網站/APP會發送請求到后台服務器,通常會有Nginx接受請求,然后進行轉發。
后台服務器,例如Tomcat、Jetty
通常在面向大量用戶和高並發(每秒請求量過萬)時,都不是直接使用Tomcat來接收請求。而是使用Nginx來接收請求,並且后端介入Tomcat集群/jetty集群,來進行高並發下的負載均衡。
比如說,Nginx/Tomcat,經過適當配置之后,所有的請求數據都會以log的形式存儲起來;或者接收請求的后台,也可以按照自己制定的的規范,沒接收一個請求或者沒執行一個邏輯,就往日志里發一條log。
到此為止,我們的后台每天就可以至少產生一份日志文件。
日志文件
日志文件(按照我們預先設定的格式)通常每天一份,當然也可以多分日志,因為有多個web服務器。
一個日志轉移的工具,比如自己用Linux的crontab定時調度一個shell腳本/python腳本;或者自己用java開發一個后台服務,用quartz這樣的架構進行定時調度。這個工具負責當天的所有日志的數據都采集起來,進行合並和處理等操作 ,然后整合成一份日志文件,轉移到flume agent正在監控的文件夾中。
flume 監控日志文件
flume agent啟動之后,可以實時的監控某個指定的文件,看是否有新的文件進來。只要發現有新的日志文件進來時,那么flume就會走后續的channel和sink。通常來說,sink都會配置為HDFS。
flume負責講每天的日志傳輸到HDFS。
日志文件存儲在HDFS之中
因為HDFS可以用來存儲大數據。
數據清洗
HDFS中的原始日志數據會經過清洗,因為原始數據中可能很多是不符合預期的臟數據。
使用MapReduce開發自己的MR作業,可以用crontab來定時執行,也可以用Ooize或者bat京東美團自己開發的復雜、大型、分布式的調度系統,來承擔全公司所有MapReduce/Hive作業的調度(對於大公司來說,可能每天除了負責數據清洗的MR作業之外,后續的建立數據倉庫、進行數據的統計分析的Hive ETL可能高達上萬個,上十萬個,上百萬等),針對HDFS中的原始日志數據清洗之后,寫入HDFS的另外一個文件之中。
Hive
把HDFS清洗后的數據導入到Hive的某個表中,Hive可以使用動態分區,Hive使用分區表,每個份去放一天的數據。
Hive底層也是基於HDFS,作為一個大數據的數據倉庫。數據倉庫內部,再往后,其實就是一些數據倉庫建模的ETL。ETL會將原始日志所在的一個表轉化為幾十個、幾百個表,這些表就是我們的數據倉庫。然后公司的統計分析人員就會根據數據倉庫中的表,執行臨時的或者每天定時的 Hive SQL ETL作業進行大數據的統計分析。
Spark/Hadoop/Storm,大數據平台/系統可能都會采用Hive中的數據倉庫內部的表。
大數據平台/系統
我們的大數據平台/系統,其實通常來說,都會針對Hive中的數據進行開發。數據源都是來自Hive中的表,這些表都是經過大量的Hive SQL ETL以后建立起來的數據倉庫,然后進行特殊的、符合業務需求的大數據平台。通過大數據平台來給公司的用戶使用,來提供大數據的支持,推動公司的發展。
