使用EMR做大數(shù)據(jù)分析

| 2022-09-15 admin

還是先極簡(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ù)之前肯定要明確兩件事情:

    1. 處理什么數(shù)據(jù)
    2. 如何處理數(shù)據(jù)
    3. 處理什么數(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

    4. 如何處理數(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)

    1. 創(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)

    2. 對(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/';

    3. 查詢(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;