实验8: Hive/Spark作业调参优化

请跳转至以下blog按照指导手册进行实验

https://aws.amazon.com/cn/blogs/china/spark-job-ptimization-practice-on-emr/

下载测试数据

首先,我们使用一台Amazon EC2从FreddieMac下载测试数据,FreddieMac提供了美国单亲家庭购房贷款的近20年的历史数据,可免费用于非商业的学术/研究性工作,原始数据包含50多个属性近250亿条数据,经过我们处理的数据还可以进行机器学习等其他尝试。我准备了简单的Python遍历脚本去自动下载并解压数据集,这里我们使用1999年至2019年20年的数据测试,代码如下,在main方法中需要我们在FreddieMac注册并在代码中填入您的账号,也可以在这里依据需要测试的数据大小定义历史数据起始年份。

#!/usr/bin/env python
# coding: utf-8

from urllib.request import urlopen
from bs4 import BeautifulSoup
from zipfile import ZipFile
from io import BytesIO
import requests
import os

def payloadCreation(user, password):
    creds={'username': user,'password': password }
    return creds
def getFilesFromFreddieMac(payload, startY, endY):
    # 定义要遍历URL.
    url='https://freddiemac.embs.com/FLoan/secure/auth.php'
    postUrl='https://freddiemac.embs.com/FLoan/Data/download.php'
    # 定义本地下载到本地文件夹.
    target_folder = 'TestData'
    # 定义session,进行登录.
    s = requests.Session()
    preUrl = s.post(url, data=payload)
    payload2={'accept': 'Yes','acceptSubmit':'Continue','action':'acceptTandC'}
    finalUrl=s.post(postUrl,payload2)
    # 定义遍历目标压缩包.
    linkhtml =finalUrl.text
    allzipfiles=BeautifulSoup(linkhtml, "html.parser>)
    ziplist=allzipfiles.find_all('a')
    # 定义年份变量.
    year_list = []
    start_year = startY
    end_year = endY
    for i in range(int(start_year),int(end_year)+1):
        year_list.append(str(i))
    # 拼出最终下载链接.
    historicaldata_links=[]
    local_path=str(os.getcwd())+"/" + target_folder
    for year in year_list:
        for li in ziplist:
            if year in li.text and 'historical' in li.text:
                final_link ='https://freddiemac.embs.com/FLoan/Data/' + li.get('href')
                print(final_link)
                historicaldata_links.append(final_link)
    # 循环下载和解压.
    for lin in historicaldata_links:
        r = s.get(lin)
        z = ZipFile(BytesIO(r.content))
        z.extractall(local_path)
        print('.’)
def main():
    print("Starting")
    start_year = '1999'
    end_year = '2019'
    user = 'xxxx@xxxx.com'
    password = 'xxxxxx'
    payload=payloadCreation(user,password)
    getFilesFromFreddieMac(payload, start_year, end_year)
if __name__ == '__main__':
    main()

下载完成后,我们顺序使用以下命令将数据移动到S3:

sudo aws s3 mv /home/<-your path->/TestData/ s3://<-your backet->/aquisition/ --recursive --exclude "*" --include "historical_data1_Q*"
sudo aws s3 mv /home/<-your path->/TestData/ s3://<-your backet->/performance/ --recursive --exclude "*" --include "historical_data1_time_*"

启动测试环境

现在我们去启动EMR,测试环境在AWS美国东部(弗吉尼亚北部)区域。众所周知,Apache Spark 是一个开源、快速、通用的集群计算框架,广泛应用于大数据的分布式处理。Apache Spark有别于MapReduce,Spark作业在集群内跨节点内存中执行并行计算,以减少任务与磁盘的 I/O ,大大缩短了执行时间。AWS提供了诸多针对内存进行了优化的内存优化型实例可供我们选择。EMR还提供了多种实例采购方式供我们不同的作业类型选择。合适的选择将大大帮助我们节省集群成本,例如,选择Spot实例的成本将可能是按需类实例成本的10%。在这里可以查看更多EMR on EC2 Spot的信息。本实践中,我们选择5台r5.4xlarge实例进行测试,同时使用Spot计费方式搭建集群以节省成本。下图可以看出,我们的实例类型Spot计费类型目前可以节省近80%成本。

https://aws.amazon.com/cn/blogs/china/spark-job-ptimization-practice-on-emr/