导读:从0开始搭建spark环境,了解spark里的RDD和DataFrame,并用python编写spark程序,实现分布式数据读取,ML训练。
一、从0搭建spark
- 从官网下载spark包,并解压到自定义目录,配置环境变量。
- mater启动:进入到spark解压目录,输入命令:./sbin/start-master.sh -h master_ip
- slave启动:./sbin/start-slave.sh spark://master_ip:7077
二、RDD和DataFrame
了解RDD和DataFrame关系时,不放从Spark的两个机器学习的库ML和MLlib来接入原文链接
- 目前常用的机器学习功能2个库都能满足需求;
- spark官方推荐使用ML, 因为在spark3.0之后,将会废弃MLlib,全面的基于ML。因为ml操作的对象是DataFrame,操作起来会比RDD方便很多。所以,建议新接触spark的同学可以直接用ml 的方式;
- ML主要操作的是DataFrame, 而MLlib操作的是RDD,也就是说二者面向的数据集不一样。相比于MLlib在RDD提供的基础操作,ML在DataFrame上的抽象级别更高,数据和操作耦合度更低;
- DataFrame和RDD什么关系?DataFrame是Dataset的子集,也就是Dataset[Row], 而DataSet是对RDD的封装,对SQL之类的操作做了很多优化;
- 相比于MLlib在RDD提供的基础操作,ML在DataFrame上的抽象级别更高,数据和操作耦合度更低;
- ML中的操作可以使用pipeline, 跟sklearn一样,可以把很多操作(算法/特征提取/特征转换)以管道的形式串起来,然后让数据在这个管道中流动。大家可以脑补一下Linux管道在做任务组合时有多么方便;
- ML中无论是什么模型,都提供了统一的算法操作接口,比如模型训练都是fit;不像MLlib中不同模型会有各种各样的train;
- MLlib在spark2.0之后进入维护状态, 这个状态通常只修复BUG不增加新功能;
- ML中的随机森林支持更多的功能:包括重要度、预测概率输出等,而MLlib不支持。
三、python操作spark
1、 什么是PySpark
Apache Spark是用Scala编程语言编写的。为了用Spark支持Python,Apache Spark社区发布了一个工具PySpark。使用PySpark,您也可以使用Python编程语言处理RDD。正是由于一个名为Py4j的库,他们才能实现这一目标。
2 、PySpark实现随机森林
# -*- coding:utf-8 -*-
from pyspark import SparkConf
from pyspark.sql import SparkSession
import os
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml.classification import RandomForestClassifier
os.environ["PYSPARK_PYTHON"]="/usr/bin/python3"
# 设置master地址,worker使用的内存及cpu
appname = "test1"
master = "spark://192.168.255.168:7077"
conf = SparkConf().setAppName(appname).setMaster(master) # spark资源配置
conf.set('spark.driver.maxResultSize', '182g')
conf.set('spark.executor.memory', '60g')
conf.set('spark.cores.max', 30)
conf.set("spark.executor.cores", '8')
#SparkSession为用户提供了统一的切入点,来让用户学习spark的各项功能。
spark = SparkSession.builder.config(conf=conf).getOrCreate()
#SparkContext是spark的主要切入点,由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。
sc = spark.sparkContext
# 对于每个其他的API,我们需要使用不同的context,例如,例如:Streming
# ssc = StreamingContext(sc, 1)
# 将csv文件读入rdd,并转成spark中的dataframe
file = "/Ipynb/Gum/loop/demo20191204_1.csv"
lines = sc.textFile(file)
df0=spark.read.csv(lines, header=True, encoding="utf-8",maxColumns=50000,inferSchema=True)
print("读取完成")
# 处理特征,第一列为target,第二列及后面数据为feature
old_columns_names = df0.columns
df0 = df0.withColumnRenamed(old_columns_names[0], 'label')
vecAss = VectorAssembler(inputCols=old_columns_names[1:],handleInvalid="keep", outputCol='features')
df0 = vecAss.transform(df0)
dfi = df0.select(['label', 'features'])
print(dfi.show(3))
# 进行随机森林训练
blor = RandomForestClassifier(numTrees=3, maxDepth=2, featuresCol="features", labelCol="label", seed=42)
blorModel = blor.fit(dfi)
print("训练完成")
result = blorModel.transform(dfi)
result.filter(result.label == result.prediction).count()/result.count()
sc.stop()
print(result.show(3))
- ui界面
输入以下命令,开始运行:
spark-submit demo.py
查看ui界面,可以发现两个worker,同时运行,cpu核和内存是对应的,在代码中可以配置。