還是先極簡(jiǎn)介紹一下EMR是什么,Amazon EMR 基于 Hadoop 的開(kāi)源框架將您的數(shù)據(jù)分布在可重新調(diào)整大小的 Amazon EC2 實(shí)例集群中并進(jìn)行處理。Amazon EMR 可用于各種應(yīng)用程序中,包括日志分析、Web 索引、數(shù)據(jù)倉(cāng)庫(kù)、機(jī)器學(xué)習(xí)、財(cái)務(wù)分析、科學(xué)模擬和生物信息學(xué)。具體的功能特性可以直接到官網(wǎng)查閱。直接上實(shí)驗(yàn):
實(shí)驗(yàn)包括:
1. 使用EMR創(chuàng)建Hadoop集群
2. 定義schema,創(chuàng)建示例表。
3. 通過(guò)HiveQL分析數(shù)據(jù),并將分析結(jié)果保存到S3上
4. 下載已經(jīng)分析結(jié)果數(shù)據(jù)。
Task1:創(chuàng)建一個(gè)S3 桶
創(chuàng)建一個(gè)存儲(chǔ)桶比如hadoop202006…
Task2:創(chuàng)建EMR集群
這里我解釋一下Hadoop集群中的一些組件,了解大數(shù)據(jù)的同學(xué)直接忽略就好。
- Apache Hadoop:在分布式服務(wù)器集群上存儲(chǔ)海量數(shù)據(jù)并運(yùn)行分布式分析應(yīng)用的開(kāi)源框架,其核心部件是HDFS與MapReduce。
- Ganglia:分布式監(jiān)控系統(tǒng)
- Apache Tez:支持 DAG 作業(yè)的開(kāi)源計(jì)算框架,它可以將多個(gè)有依賴(lài)的作業(yè)轉(zhuǎn)換為一個(gè)作業(yè)從而大幅提升DAG作業(yè)的性能。比如Hive或Pig可以將Tez作為執(zhí)行引擎。
- Hive:可以通過(guò)類(lèi)似SQL語(yǔ)句實(shí)現(xiàn)快速M(fèi)apReduce統(tǒng)計(jì)
- Hue:通過(guò)使用Hue我們可以通過(guò)瀏覽器方式操縱Hadoop集群。例如put、get、執(zhí)行MapReduce Job等等。
- Pig:它提供的SQL-LIKE語(yǔ)言叫Pig Latin,該語(yǔ)言的編譯器會(huì)把類(lèi)SQL的數(shù)據(jù)分析請(qǐng)求轉(zhuǎn)換為一系列經(jīng)過(guò)優(yōu)化處理的MapReduce運(yùn)算。Pig為復(fù)雜的海量數(shù)據(jù)并行計(jì)算提供了一個(gè)簡(jiǎn)單的操作和編程接口。
解釋一下,Master、Core、Task。
- Master Node:主節(jié)點(diǎn)集群管理,通常運(yùn)行分布式應(yīng)用程序的Master組件,例如,YARN ResourceManager,HDFS NameNode。
- Core Node:會(huì)運(yùn)行 HDFS的 DataNode, 運(yùn)行YARN守護(hù)程序,MR任務(wù)等。
- Task Node:任務(wù)節(jié)點(diǎn)是可選的,做為可擴(kuò)展的算力。不運(yùn)行HDFS的DataNode守護(hù)程序,不做HDFS的存儲(chǔ)。
MasterNode至少有一個(gè)CoreNode 至少一個(gè)TaskNode 可以有一個(gè)(可選)
當(dāng)Cluster狀態(tài)為Waiting時(shí),執(zhí)行Task3.
Task3:使用Hive腳本處理數(shù)據(jù)
在處理數(shù)據(jù)之前肯定要明確兩件事情:
- 處理什么數(shù)據(jù)
- 如何處理數(shù)據(jù)
- 處理什么數(shù)據(jù):
這里以CDN的log日志為例,其中一條數(shù)據(jù)的格式為:
2017-07-05 20:05:47 SEA4 4261 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-2.jpeg 200 - Mozilla/5.0%20(MacOS;%20U;%20Windows%20NT%205.1;%20en-US;%20rv:1.9.0.9)%20Gecko/2009040821%20Chrome/3.0.9
- 如何處理數(shù)據(jù)
在EMR集群中,添加STEP,
- Step類(lèi)型選擇:Hive progran。
多說(shuō)一句:目前有4中Task類(lèi)型,自定義JAR,Streaming program來(lái)處理流數(shù)據(jù),Hive/Pig執(zhí)行類(lèi)SQL。
- Name:Process logs
- Script S3 location:s3://us-west-2.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q
(一會(huì)兒分析一個(gè)這個(gè)腳本都執(zhí)行了什么)
- Input S3 location: s3://us-west-2.elasticmapreduce.samples(這個(gè)就是CDN的log日志)
- Output S3 Location:選擇我創(chuàng)建的hadoop202006(這個(gè)就是我們處理后的文件存放的位置)
- Arguments:-hiveconf hive.support.sql11.reserved.keywords=false
腳本都干了啥?(你可以SSH到Cluster上直接執(zhí)行HiveQL)
- 創(chuàng)建一個(gè)叫cloudfront_logs的Hive table
CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (DateObject Date,Time STRING,Location STRING,Bytes INT,RequestIP STRING,Method STRING,Host STRING,Uri STRING,Status INT,Referrer STRING,OS String,Browser String,BrowserVersion String)
- 對(duì)log的格式進(jìn)行序列化/反序列化 RegEx SerDe 并寫(xiě)入CDN的log數(shù)據(jù)到Hive表中
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'WITH SERDEPROPERTIES ( "input.regex" = "^(?!#)([^ ]+)s+([^ ]+)s+([^ ]+)s+([^ ]+)s+([^ ]+)s+([^ ]+)s+([^ ]+)s+([^ ]+)s+([^ ]+)s+([^ ]+)s+[^(]+(.%20([^/]+)[/](https://s3-us-west-2.amazonaws.com/us-west-2-aws-training/awsu-spl/spl-166/1.0.7.prod/instructions/en_us/.)$") LOCATION '${INPUT}/cloudfront/data/';
- 查詢(xún)?nèi)罩蠧lient端使用的OS數(shù)量by日期并把查詢(xún)結(jié)果寫(xiě)入S3
INSERT OVERWRITE DIRECTORY '${OUTPUT}/os_requests/'SELECT os, COUNT(*) countFROM cloudfront_logsWHERE dateobjectBETWEEN '2014-07-05' AND '2014-08-05'GROUP BY os;
- 創(chuàng)建一個(gè)叫cloudfront_logs的Hive table