一、大数据平台组件搭建。
要求在Hadoop集群上搭建1.6.3版本的Spark分布式集群。(提示如下,注意每一步骤的代码与结果需截图在报告中体现)
1.Spark安装包处理,解压到/usr/local目录下,在master节点通过命令“wget -P /opt http://datasrc.tipdm.net:81/bigdata/spark/software/spark-1.6.3-bin-hadoop2.6.tgz”进行获取。
2.Spark配置文件修改(spark-env.sh、slaves、spark-default.conf),配置要求为:以master为主节点,Spark Master端口号为7077,Worker使用计算资源为单核512m,Executor使用计算资源为单核512m,限制每台机器只能有一个worker,spark日志相关信息与事件日志的保存路径均设置为HDFS文件系统上的/spark-logs。
3.子节点同步。
4.创建spark-default.conf配置文件中指定的Spark日志存放目录。
5.修改环境变量,并使其生效。
6.确保Hadoop集群已开启。
7.启动Spark集群。
8.查看Spark监控界面,确认集群部署状态无误。
【答案】
(1)解压安装包到/usr/local下。
tar -zxf /opt/spark-1.6.3-bin-hadoop2.6.tgz -C /usr/local
(2)进入/usr/local/spark-1.6.3-bin-hadoop2.6/conf。
cd /usr/local/spark-1.6.3-bin-hadoop2.6/conf
(3)配置spark-env.sh文件,复制spark-env.sh.template文件,重命名为spark-env.sh。
cp spark-env.sh.template spark-env.sh
在文件末尾配置如下内容:
export JAVA_HOME=/usr/lib/jvm/java
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop/
export SPARK_MASTER_IP=master
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_MEMORY=512m
export SPARK_WORKER_CORES=1
export SPARK_EXECUTOR_MEMORY=512m
export SPARK_EXECUTOR_CORES=1
export SPARK_WORKER_INSTANCES=1
(4)配置slaves文件,复制slaves.template文件,重命名为slaves。
cp slaves.template slaves
在文件中配置如下内容:
slave1
slave2
(5)配置spark-defaults.conf文件,复制spark-defaults.conf.template文件,重命名为spark-defaults.conf。
cp spark-defaults.conf.template spark-defaults.conf
在配置文件中添加如下内容:
spark.master spark://master:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:8020/spark-logs
spark.history.fs.logDirectory hdfs://master:8020/spark-logs
(6)将配置好的Spark目录同步到子节点。
scp -r /usr/local/spark-1.6.3-bin-hadoop2.6/ slave1:/usr/local
scp -r /usr/local/spark-1.6.3-bin-hadoop2.6/ slave2:/usr/local
(7)创建spark-logs目录
hdfs dfs -mkdir /spark-logs
(8)修改环境变量,在各节点的/etc/profile下添加Spark对应路径。
export SPARK_HOME=/usr/local/spark-1.6.3-bin-hadoop2.6
export PATH=
P
A
T
H
:
PATH:
PATH:SPARK_HOME/bin
运行“source /etc/profile”使配置生效。D
(9)jps检查三个节点是否已开启Hadoop集群,未开启则在master通过命令开启。
$HADOOP_HOME/sbin/start-all.sh
(10)启动Spark集群
/usr/local/spark-1.6.3-bin-hadoop2.6/sbin/start-all.sh
(11)在浏览器查看,检查能否正常监控,两个子节点状态是否与要求一致。
http://master:8080
二、编程学习网站题目爬取。
1.访问菜鸟教程(https://www.runoob.com),爬取其Python3实例模块的题目内容,要求输出格式如下图所示。
【答案】
import requests
from lxml import etree
import time
获取题目链接
url = ‘https://www.runoob.com/python3/python3-examples.html’
web_data = requests.get(url)
dom = etree.HTML(web_data.text, etree.HTMLParser(encoding=‘utf-8’)) # 网页解析
exerciseList= dom.xpath(’//div[@id=“content”]/ul/li/a/text()’) # 练习题名称
urlList= dom.xpath(’//div[@id=“content”]/ul/li/a/@href’) # 练习题超链接
urlList = [’/python3/’+i if ‘/python3/’ not in i else i for i in urlList ]
urlList = [‘https://www.runoob.com’ + i if ‘www.runoob.com/’ not in i else ‘https:’+i for i in urlList]
exerciseString = ‘\n’.join(exerciseList) # 将练习题名称拼接成一个字符串
with open(‘exercisePython.txt’, ‘w’) as f:
f.write(exerciseString)
#爬取题目数据及整理写出
resultList = []
for url in urlList:
web_data = requests.get(url)
dom = etree.HTML(web_data.text, etree.HTMLParser(encoding=‘utf-8’)) # 网页源码解析
# 获取题目及答案
title = dom.xpath(‘string(//div[@id=“content”]/h1)’) # 练习题名称
content = dom.xpath(‘string(//div[@id=“content”]/p[2])’) # 练习题描述内容
code = dom.xpath(‘string(//div[@id=“content”]//div[@class=“example”]//div[@class=“hl-main”])’) # 练习题答案
result = dom.xpath(‘string(//div[@id=“content”]/p[3])’) # 结果描述
output = dom.xpath(‘string(//div[@id=“content”]/pre)’) # 目标输出
res = title + ‘\n’ + content+ ‘\n’ # 将内容进行拼接
resultList.append(res)
time.sleep(1)
print(url, ‘\n’, res)
mid = resultList.copy()
for i in range(len(mid)):
mid[i] = str(i+1)+’、’+ mid[i] # 加入题目序号
with open(‘Python编程基础上机题库1.txt’, ‘w’, encoding=‘utf-8’) as f:
f.write(’\n’.join(mid)) # 将数据写出
三、电力数据分析与挖掘。数据data_etr.csv为用户用电量数据,数据中有编号为1-200的200位电力用户,DATA_DATE表示时间,如2015/1/1表示2015年1月1日,KWH为用电量。请完成以下工作:
(1) 将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。
(2) 对数据中的异常数据进行识别并处理。
(3) 统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和、方差、偏度、峰度。
(4) 每个用户用电数据按日差分,并求取差分结果的基本统计量,统计量同3。
(5) 求取每个用户的5%分位数。
(6) 每个用户按周求和并差分(一周7天,年度分开),并求取差分结果的基本统计量,统计量同3。
(7) 统计每个用户的日用电量在其最大值0.9倍以上的次数。
(8) 求取每个用户日为最大值/最小值的索引月份,若最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份。如1号用户的最小值为0,12个月每个月都有0,则看哪个月的0最多。
(9) 合并上述特征。
【答案】
1.将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。
import numpy as np
import pandas as pd
import os
#将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。
data=pd.read_csv(‘data_etr.csv’,parse_dates=[‘DATA_DATE’],encoding=‘gbk’)
data.head()
#透视表
data_new=pd.pivot_table(data=data,values=‘KWH’,index=‘CONS_NO’,columns=‘DATA_DATE’)
2.对数据中的异常数据进行识别并处理。
def clear_(x=None):
QL=x.quantile(0.25)#下四分位数
QU=x.quantile(0.75)#上四分位数
IQR=QU-QL
x[((x>QU+1.5IQR)|(x<QL-1.5IQR))]=None
return x
data_new.apply(clear_,axis=0)#对每一行操作
3.统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和、方差、偏度、峰度。
feature1=data_new.T.agg([‘max’,‘min’,‘mean’,‘median’,‘sum’,‘var’,‘skew’,‘kurt’],axis=0).T
4.每个用户用电数据按日差分,并求取差分结果的基本统计量,统计量同3。
feature2=data_new.T.diff(axis=1).agg([‘max’,‘min’,‘mean’,‘median’,‘sum’,‘var’,‘skew’,‘kurt’],axis=0).T
5.求取每个用户的5%分位数。
feature3=data_new.quantile(0.05,axis=1)
6.每个用户按周求和并差分(一周7天,年度分开),并求取差分结果的基本统计量,统计量同3。
data_new.columns.week
feature4=(data_new.T.resample(‘W’).sum()).T.diff(axis=1).T.agg([‘max’,‘min’,‘mean’,‘median’,‘sum’,‘var’,‘skew’,‘kurt’],axis=0).T
7.统计每个用户的日用电量在其最大值0.9倍以上的次数。
feature5=data_new.apply(lambda x:sum(x>x.max()*0.9),axis=1)
8.求取每个用户日为最大值/最小值的索引月份,若最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份。如1号用户的最小值为0,12个月每个月都有0,则看哪个月的0最多。
feature6=data_new.apply(lambda x: x==x.min(),axis=1).groupby(by=data_new.columns.month,axis=1).sum().idxmax(axis=1) #最小值
feature7=data_new.apply(lambda x: x==x.max(),axis=1).groupby(by=data_new.columns.month,axis=1).sum().idxmax(axis=1) #最大值
9.合并上述特征。
pd.concat([feature1,feature2,feature3,feature4,feature5,feature6,feature7],axis=0)
四、股票数据可视化,完成以下问题:
1.文件读取及数据查看;
2.提取股票代号600000在2017年1月3日至2017年1月20日的收盘价格数据,并绘制股票价格走势图进行分析;
3.提取股票代号600000在2017年1月3日至2017年1月24日的交易量数据,并绘制交易量分布柱状图进行分析;
4.提取股票代号600000在2017年1月至11月的交易量统计数据,并绘制月交易量分布饼图进行分析;
5.绘制以上图形组成的3×1子图。
【答案】
1.文件读取及查看
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data=pd.read_excel(’/data/trd.xlsx’,engine=“openpyxl”)
#查看列名和数据
print(data.columns)
print(data.iloc[:5])
- 提取股票代号600000在2017年1月3日至2017年1月20日的收盘价格数据,并绘制股票价格走势图
dt=data.loc[data[‘股票代码’]==600000,[‘交易日期’,‘收盘价’,‘交易量’]]
I1=dt[‘交易日期’].values>=‘2017-01-03’
I2=dt[‘交易日期’].values<=‘2017-01-20’
dta=dt.iloc[I1&I2,:]
y1=dta[‘收盘价’]
x1=range(len(y1))
plt.figure(1)
plt.plot(x1,y1)
plt.xlabel(u’ date ‘,fontproperties=‘SimHei’)
plt.ylabel(u’ Closing_Price ‘,fontproperties=‘SimHei’)
plt.title(u’ Closing_Price_State ',fontproperties=‘SimHei’)
plt.savefig(‘1.png’)
- 提取股票代号600000在2017年1月3日至2017年1月24日的交易量数据,并绘制交易量分布柱状图
I3=dt[‘交易日期’].values>=‘2017-01-03’
I4=dt[‘交易日期’].values<=‘2017-01-24’
dta=dt.iloc[I3&I4,:]
y2=dta[‘交易量’]
x2=range(len(y2))
plt.figure(2)
plt.bar(x2,y2)
plt.xlabel(u’ date ‘,fontproperties=‘SimHei’)
plt.ylabel(u’ Volume ‘,fontproperties=‘SimHei’)
plt.title(u’ Volume_State ',fontproperties=‘SimHei’)
plt.savefig(‘2.png’)
- 提取股票代号600000在2017年1月至11月的交易量统计数据,并绘制月交易量分布饼图
D=np.zeros((11))
list1=list()
for m in range(11):
m=m+1
if m<10:
m1=‘2017-0’+str(m)+’-01’
m2=‘2017-0’+str(m)+’-31’
mon=‘0’+str(m)
else:
m1=‘2017-’+str(m)+’-01’
m2=‘2017-’+str(m)+’-31’
mon=str(m)
I1=dt[‘交易日期’].values>=m1
I2=dt[‘交易日期’].values<=m2
D[m-1]=dt.iloc[I1&I2,[2]].sum()[0]
list1.append(mon)
plt.figure(3)
plt.pie(D,labels=list1,autopct=’%1.2f%%’) # 保留小数点后两位
plt.title(u’Month_Volume_State’,fontproperties=‘SimHei’)
plt.savefig(‘3.png’)
- 绘制以上图形组成的3×1子图
plt.figure(4)
plt.figure(figsize=(14,6))
plt.subplot(1,3,1)
plt.plot(x1,y1)
plt.xlabel(u’ date ‘,fontproperties=‘SimHei’)
plt.ylabel(u’ Closing_Price ‘,fontproperties=‘SimHei’)
plt.title(u’ Closing_Price_State ‘,fontproperties=‘SimHei’)
plt.subplot(1,3,2)
plt.bar(x2,y2)
plt.xlabel(u’ date ‘,fontproperties=‘SimHei’)
plt.ylabel(u’ Volume ‘,fontproperties=‘SimHei’)
plt.title(u’ Volume_State ‘,fontproperties=‘SimHei’)
plt.subplot(1,3,3)
plt.pie(D,labels=list1,autopct=’%1.2f%%’) # 保留小数点后两位
plt.title(u’ Month_Volume_State ',fontproperties=‘SimHei’)
plt.savefig(‘4.png’)