【Python3实战Spark大数据分析及调度】第13章 项目实战

企业级大数据开发流程

【Python3实战Spark大数据分析及调度】第13章 项目实战_第1张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第2张图片

企业级大数据应用

【Python3实战Spark大数据分析及调度】第13章 项目实战_第3张图片

企业级大数据分析平台

目的和分析

获得数据价值

离线和实时

1)商业
2)自研

数据量预估及集群规划

一条日志300~500字节,一天1000w访问量,一个人访问5次,每天访问5个页面
【Python3实战Spark大数据分析及调度】第13章 项目实战_第4张图片
DN:DataNode数量
NN:NameNode数量
RM:ResourceManager数量
NM:NodeManager数量
ZK:ZooKeeper数量
GATEWAY:提交作业到集群

在这里插入图片描述
资源设置:
cpu:32core
memory:250g
disk:几十个T
network:万兆网卡
【Python3实战Spark大数据分析及调度】第13章 项目实战_第5张图片

项目需求

使用PySpark分析空气质量
在这里插入图片描述
数据样例:

空气质量指标
【Python3实战Spark大数据分析及调度】第13章 项目实战_第6张图片
数据分析后健康与否的结果写入es中,最后使用kibana展示

功能实现

【Python3实战Spark大数据分析及调度】第13章 项目实战_第7张图片
发现出了问题,在列名上
【Python3实战Spark大数据分析及调度】第13章 项目实战_第8张图片
设置头部信息为true
【Python3实战Spark大数据分析及调度】第13章 项目实战_第9张图片
又有了问题,将我们所有的数据类型都设置成了String
【Python3实战Spark大数据分析及调度】第13章 项目实战_第10张图片
添加自动推导数据类型
【Python3实战Spark大数据分析及调度】第13章 项目实战_第11张图片
已经自动转换了数据类型
【Python3实战Spark大数据分析及调度】第13章 项目实战_第12张图片
只使用部分的列
【Python3实战Spark大数据分析及调度】第13章 项目实战_第13张图片
写一个空气指数转换健康程度的函数
【Python3实战Spark大数据分析及调度】第13章 项目实战_第14张图片
尝试增加一个列表示空气质量的好坏
在这里插入图片描述
报错
【Python3实战Spark大数据分析及调度】第13章 项目实战_第15张图片
需要使用udf函数进行转换
导入udf
在这里插入图片描述
使用udf对get_grade进行封装
【Python3实战Spark大数据分析及调度】第13章 项目实战_第16张图片
结果如下:
【Python3实战Spark大数据分析及调度】第13章 项目实战_第17张图片
groupby + count 统计各个类型的次数
在这里插入图片描述
【Python3实战Spark大数据分析及调度】第13章 项目实战_第18张图片
查看各个类型在全年中的占比情况
【Python3实战Spark大数据分析及调度】第13章 项目实战_第19张图片
下面需要把分析得到的数据导入es后用kibana展示出来

ElasticSearch & Kibana

向es中添加数据
在这里插入图片描述
在这里插入图片描述
添加一名学生
【Python3实战Spark大数据分析及调度】第13章 项目实战_第20张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第21张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第22张图片
Kibana部分
在配置文件中可以直接配置连接的es
在这里插入图片描述
【Python3实战Spark大数据分析及调度】第13章 项目实战_第23张图片
可以直接在es中进行查询
【Python3实战Spark大数据分析及调度】第13章 项目实战_第24张图片
使用kibana查询es中的数据需要添加es索引
【Python3实战Spark大数据分析及调度】第13章 项目实战_第25张图片

【Python3实战Spark大数据分析及调度】第13章 项目实战_第26张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第27张图片
在Discover中就可以看到索引下的数据

【Python3实战Spark大数据分析及调度】第13章 项目实战_第28张图片
进行查询试验
【Python3实战Spark大数据分析及调度】第13章 项目实战_第29张图片
sparkyarn.py

from pyspark.sql import SparkSession
from pyspark.sql.types import *
from pyspark.sql.functions import udf


def get_grade(value):
    if value <= 50 and value >= 0:
        return "健康"
    elif value <= 100:
        return "中等"
    elif value <= 150:
        return "对敏感人群不健康"
    elif value <= 200:
        return "不健康"
    elif value <= 300:
        return "非常不健康"
    elif value <= 500:
        return "危险"
    elif value > 500:
        return "爆表"
    else:
        return None

if __name__ == '__main__':
    spark = SparkSession.builder.appName("project").getOrCreate()

    df = spark.read.format("csv").option("header","true").option("inferSchema","true").load("file:///home/hadoop/data/Beijing_2017_HourlyPM25_created20170803.csv")
    df.select("Year","Month","Day","Hour","Value","QC Name").show()

    data2017 = spark.read.format("csv").option("header","true").option("inferSchema","true").load("file:///home/hadoop/data/Beijing_2017_HourlyPM25_created20170803.csv").select("Year","Month","Day","Hour","Value","QC Name")
    data2016 = spark.read.format("csv").option("header","true").option("inferSchema","true").load("file:///home/hadoop/data/Beijing_2016_HourlyPM25_created20170201.csv").select("Year","Month","Day","Hour","Value","QC Name")
    data2015 = spark.read.format("csv").option("header","true").option("inferSchema","true").load("file:///home/hadoop/data/Beijing_2015_HourlyPM25_created20160201.csv").select("Year","Month","Day","Hour","Value","QC Name")

    data2017.show()
    data2016.show()
    data2015.show()

    grade_function_udf = udf(get_grade(),StringType())

    # 进来一个Value,出去一个Grade
    group2017 = data2017.withColumn("Grade",grade_function_udf(data2017['Value'])).groupBy("Grade").count()
    group2016 = data2016.withColumn("Grade",grade_function_udf(data2016['Value'])).groupBy("Grade").count()
    group2015 = data2015.withColumn("Grade",grade_function_udf(data2015['Value'])).groupBy("Grade").count()

    group2015.select("Grade", "count", group2015['count'] / data2015.count()).show()
    group2016.select("Grade", "count", group2016['count'] / data2016.count()).show()
    group2017.select("Grade", "count", group2017['count'] / data2017.count()).show()

    group2017.show()
    group2016.show()
    group2015.show()

    df.show()
    spark.stop()

将脚本跑在YARN上,通过spark-submit提交

使用Spark SQL 将统计结果写入到ES中
需要使用jar包
【Python3实战Spark大数据分析及调度】第13章 项目实战_第30张图片
这里列名会有这种问题
【Python3实战Spark大数据分析及调度】第13章 项目实战_第31张图片
将数据写入到Spark SQL中
在这里插入图片描述
结果,这个列名不方便查看
【Python3实战Spark大数据分析及调度】第13章 项目实战_第32张图片

使用withColumn改一下列的名字
在这里插入图片描述
改好了
【Python3实战Spark大数据分析及调度】第13章 项目实战_第33张图片
但是Grade我想要grade,改一下大小写
【Python3实战Spark大数据分析及调度】第13章 项目实战_第34张图片
重新导入es,在kibana中展示
【Python3实战Spark大数据分析及调度】第13章 项目实战_第35张图片
将 precent改成百分比重新导入
【Python3实战Spark大数据分析及调度】第13章 项目实战_第36张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第37张图片
全部代码 wea.py

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *


def get_grade(value):
    if value <= 50:
        return "健康"
    elif value <= 100:
        return "中等"
    elif value <= 150:
        return "对敏感人群不健康"
    elif value <= 200:
        return "不健康"
    elif value <= 300:
        return "非常不健康"
    elif value <= 500:
        return "危险"
    elif value > 500:
        return "爆表"
    else:
        return None


if __name__ == '__main__':
    spark = SparkSession.builder.appName("project").getOrCreate()

    data2017 = spark.read.format("csv").option("header","true").option("inferSchema","true").load("/data/Beijing_2017_HourlyPM25_created20170803.csv").select("Year","Month","Day","Hour","Value","QC Name")
    data2016 = spark.read.format("csv").option("header","true").option("inferSchema","true").load("/data/Beijing_2016_HourlyPM25_created20170201.csv").select("Year","Month","Day","Hour","Value","QC Name")
    data2015 = spark.read.format("csv").option("header","true").option("inferSchema","true").load("/data/Beijing_2015_HourlyPM25_created20160201.csv").select("Year","Month","Day","Hour","Value","QC Name")

    grade_function_udf = udf(get_grade, StringType())

    group2017 = data2017.withColumn("Grade", grade_function_udf(data2017['Value'])).groupBy("Grade").count()
    group2016 = data2016.withColumn("Grade", grade_function_udf(data2016['Value'])).groupBy("Grade").count()
    group2015 = data2015.withColumn("Grade", grade_function_udf(data2015['Value'])).groupBy("Grade").count()

    result2017 = group2017.select("Grade", "count").withColumn("precent",group2017['count'] / data2017.count()*100)
    result2016 = group2016.select("Grade", "count").withColumn("precent",group2016['count'] / data2016.count()*100)
    result2015 = group2015.select("Grade", "count").withColumn("precent",group2015['count'] / data2015.count()*100)

    result2017.selectExpr("Grade as grade", "count", "precent").write.format("org.elasticsearch.spark.sql").option("es.nodes","192.168.199.102:9200").mode("overwrite").save("weather2017/pm")
    result2016.selectExpr("Grade as grade", "count", "precent").write.format("org.elasticsearch.spark.sql").option("es.nodes","192.168.199.102:9200").mode("overwrite").save("weather2016/pm")
    result2015.selectExpr("Grade as grade", "count", "precent").write.format("org.elasticsearch.spark.sql").option("es.nodes","192.168.199.102:9200").mode("overwrite").save("weather2015/pm")

    spark.stop()

这回提交到local就可以,还是注意要加上jar

已经全部导入
【Python3实战Spark大数据分析及调度】第13章 项目实战_第38张图片
使用kibana进行可视化

【Python3实战Spark大数据分析及调度】第13章 项目实战_第39张图片
选择一个柱状图
【Python3实战Spark大数据分析及调度】第13章 项目实战_第40张图片
点进去选择索引

【Python3实战Spark大数据分析及调度】第13章 项目实战_第41张图片
添加y轴

【Python3实战Spark大数据分析及调度】第13章 项目实战_第42张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第43张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第44张图片

【Python3实战Spark大数据分析及调度】第13章 项目实战_第45张图片
选择x轴
【Python3实战Spark大数据分析及调度】第13章 项目实战_第46张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第47张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第48张图片

生成图像
【Python3实战Spark大数据分析及调度】第13章 项目实战_第49张图片
添加子图
【Python3实战Spark大数据分析及调度】第13章 项目实战_第50张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第51张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第52张图片
发现多了一个不想要的index,想要进行删除
【Python3实战Spark大数据分析及调度】第13章 项目实战_第53张图片
对索引进行删除
【Python3实战Spark大数据分析及调度】第13章 项目实战_第54张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第55张图片
还需要对格式进行调整,变成横向的
【Python3实战Spark大数据分析及调度】第13章 项目实战_第56张图片
【Python3实战Spark大数据分析及调度】第13章 项目实战_第57张图片
可以看出健康值在逐年递增
保存图像
【Python3实战Spark大数据分析及调度】第13章 项目实战_第58张图片

通过Azkaban进行调度

在es将三个索引删除,使用Azkaban进行调度测试
【Python3实战Spark大数据分析及调度】第13章 项目实战_第59张图片
weather.job文件
【Python3实战Spark大数据分析及调度】第13章 项目实战_第60张图片
wea.sh 就是上面写过的spark-submit指令,注意还是要指定spark-submit 的详细位置
【Python3实战Spark大数据分析及调度】第13章 项目实战_第61张图片
再加上wea.py文件,打成zip包
上传至Azkaban
【Python3实战Spark大数据分析及调度】第13章 项目实战_第62张图片
正在执行
【Python3实战Spark大数据分析及调度】第13章 项目实战_第63张图片
执行成功
【Python3实战Spark大数据分析及调度】第13章 项目实战_第64张图片
在kibana中又可以看到图了

【Python3实战Spark大数据分析及调度】第13章 项目实战_第65张图片

你可能感兴趣的:(spark)