之前由于工作的需要玩了快一年的hadoop,做了一些数据分析的基础工作。
自然,hadoop用做离线分析还是完全满足需求的,无论是自己写mapreduce代码开发
又或者使用hive来便利分析,但是面对实时计算,就需要跟高一层级的框架了,storm,spark
就是对应的技术了,于是自己开始学习spark,作为半路出家的选手自然选用了python作为开发语言
下面就是自己的spark学习笔记了,主要参考书籍:Spark快速大数据分析
spark支持多种开发语言,scala,java,python等
scala,java都不熟,于是乎采用了python,一种:一种方法解决所有问题的语言。
一句话总结:spark是一个基于内存的大数据计算框架,
上层包括了:Spark SQL类似HiveQL, Spark Streaming 实时数据流计算,MLlib 机器学习算法包,GraphX 图算法包
底层 SparkCore 实现了基本功能:任务调度,内存管理,错误恢复,存储交互等,SparkCore还包含了对RDD(弹性分布式数据集)的API定义
RDD是Spark对计算任务封装,现在不懂也没关系,后面会随着实例进一步理解RDD
一、Spark安装:
单机版本spark安装相当简单,从官网下载一个源码包,解压即可。http://spark.apache.org/downloads.html
解压,把bin目录加入环境变量,pyspark即可启动python shell
单机模式启动pyspark后
一个简单的demo:
>>>lines = sc.textFile(“1.txt”) //创建一个RDD,“1.txt为本地存在的文件
>>> lines
MapPartitionsRDD[4] at textFile at NativeMethodAccessorImpl.java:-2
>>> lines.count()
7
通过lines对象,可以调用基本的函数,统计单词数等
例子中sc是什么呢?SparkContext。
每一个spark应用都有一个驱动器程序()来发起集群上的各种并行操作,pyspark即驱动器程序,
驱动器程序通过一个SparkContext对象来访问Spark,sc代表对计算集群的一个连接。
驱动器程序一般要管理多个执行器节点,将计算任务分发给不同的节点计算。
下面继续完成大数据下的Helloword:word count 程序:
>>> words = lines.flatMap(lambda line: line.split(‘ ‘))
>>> words
PythonRDD[8] at RDD at PythonRDD.scala:43
>>> wc = words.map(lambda x:(x,1))
>>> wc
PythonRDD[9] at RDD at PythonRDD.scala:43
>>> from operator import add
>>> counts = wc.reduceByKey(add)
>>> counts
PythonRDD[14] at RDD at PythonRDD.scala:43
>>> counts.saveAsTextFile(“wc”)
示例中可以看出 lines,words,wc,counts都是RDD对象实例
每一步操作在Spark都是RDD的一个抽象
独立应用,不通过shell怎么写独立的脚本呢,
直接编写校本文件,然后通过spark-submit提交即可
eg:worldcount程序的py脚本如下:
########first.py############
from pyspark import SparkConf, SparkContext
from operator import add
conf = SparkConf().setMaster(“local”).setAppName(“My App”)
sc = SparkContext(conf=conf)
lines = sc.textFile(“/Users/xiabin/1.txt”)
words = lines.flatMap(lambda line: line.split(‘ ‘))
wc = words.map(lambda x:(x,1))
counts = wc.reduceByKey(add)
counts.saveAsTextFile(“wcres”)
########first.py############
测试中还发现,spark-submit可以智能的识别应用的一些py模块,比如import一个myconf.py文件
或者一个包都可以无需添加任何代码运行(只单机实验)。
第一次接触下来对比写hadoop的mapreduce代码,spark的封装调用相对来说简单了不少。