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/