spark的介绍和pyspark的使用

从这个名字pyspark就可以看出来,它是由python和spark组合使用的.

相信你此时已经电脑上已经装载了hadoop,spark,python3.

那么我们现在开始对pyspark进行了解一番(当然如果你不想了解直接往下翻找pyspark的使用):

1. 背景:

    产生与加州大学伯克利分校AMP实验室,2013年6月称为Apache成为孵化项目,使用Scala语言进行实现的,而Scala建立在JAVA之上,

    为什么要设计这么一个东西?

    为了改善Hadoop的MAP REDUCE的弱点:

          1. 交互式和迭代式

          2. 在集群多点内存中运行的分布式计算

          3. 容错数据集合

    为什么要用SPARK?

          1. 先进的大数据分布式编程和计算框架

          2. 视图替代Hadoop(Spark可以独立与Hadoop,但是他不能替代Hadoop,因为Hadoop现在依然很重要)

          3. 内存分布式计算:运行数度快

          4. 可以使用不同的语言编程(java,scala,r 和python)

          5. 可以从不同的数据源获取数据

            可以从HDFS,Cassandea,HBase等等

            同时可以支持很多的文件格式:text Seq AVRO Parquet 

          6. 实现不同的大数据功能:Spark Core,Sparc SQL等等

2. 主要部件

    1.spark core :包含spark的主要基本功能,所有和Rdd有关的API都出自于spark core

    2.spark sql :spark中用于结构话处理的软件包,用户可以在soark环境下使用sql语言处理数据

    等等(其他先不介绍)

3. 介绍一下spark core

    1.它是spark生态圈的核心:

        负责读取数据

        完成分布式计算

    2.包含俩个重要部件

        有向无环图(DAG)的分布式并行计算框架

        容错分布式数据RDD(Resilient Distributed Dataset)

    3.总体来说就是spark功能调度管理中心,用来定义和管理RDD,RDD代表了一系列数据集合分布在基质的内存中,spark core 的任务就是对这些数据进行分布式计算

4.RDD(重点):

    弹性分布式数据集分布在不同的集群节点的内存中,可以理解为一大数组,数组的每一个元素就是RDD的一个分区,一个RDD可以分布并被运算在多态计算机节点的内存以及硬盘中,

    RDD数据块可以放在磁盘上也可以放在内存中(取决于你的设置),如果出现缓冲失效或丢失,RDD分区可以重新计算刷新,RDD是不能被修改的但是可以通过API被变换生成新的RDD.

 

    有俩类对RDD的操作(也成算子):

 

        1.变换(懒执行): 有 map flatMap groupByKey reduceByKey 等

            他们只是将一些指令集而不会马上执行,需要有操作的时候才会真正计算出结果

 

        2.操作(立即执行): 有 count take collect 等

            他们会返回结果,或者把RDD数据输出

 

        这些操作实现了MapReduce的基本函数map,reduce及计算模型,还提供了filter,join,groupBYKey等,另外spark sql 可以用来操作有数据结构的RDD即SPARK DATA FRAME

    它的运行原理和mapreduce是一样的,只是他们的运行方式不同,mr的运算是内存磁盘交互读写,不能在内存中共享数据,而RDD可以被共享和持久化.因为大数据运算经常是交互式和迭代式的,所以数据的重用性很重要,而mr的磁盘交互读写带来的I/O开销导致数度减慢

 

 

废话这么多了开始表演了!!

 

首先我们需要启动hadoop和spark

接下来在命令行输入:

jupyter-notebook --ip 192.168.50.129

 

--ip 后面跟的是你此时的ip,这样我们就会得到一个网址:

接下来我们复制它在浏览器上打开,就会进入jupyter的页面,我们通过点击new,python3来创建一个文件

首先我们需要导入py4j:

    其实就是在python3里面导入了spark和sc模块

要注意了:下图红框里面的要对应你spark/python/lib里面的文件

  1. import os

  2. import sys

  3. spark_name = os.environ.get('SPARK_HOME',None)

  4. if not spark_name:

  5. raise ValueErrorError('spark环境没有配置好')

  6. sys.path.insert(0,os.path.join(spark_name,'python'))

  7. sys.path.insert(0,os.path.join(spark_name,'python/lib/py4j-0.10.4-src.zip'))

  8. exec(open(os.path.join(spark_name,'python/pyspark/shell.py')).read())

 

现在我们就可以使用pyspark了:

 

    请注意,spark在交互式shell下运行时候,这里的sc即SparkContext 的一个实例已经自动生成了,这是因为pyspark shell本身就是spark应用的driver程序,而driver程序包含应用的main函数定义RDD并在计算机集群上进行各种操作,所以一旦获得SparkContext object 即sc ,driver就可以访问spark了,因此sc可以看成是driver对计算机集群的连接.

    spark里面的core里面的RDD有俩个组织,一个为driver另一个为worker,有点像hadoop里面的namenode和datanode,所以driver只能有一个而worker可以为多个.driver负责获取数据,管理worker,所以worker就负责工作.

  

 

有俩种类型的RDD:

       1. 并行集合:来自与分布式化的数据对象,比如我们上面的代码,python里面的list对象,再比如用户自己键入的数据

        并行化RDD就是通过调用sc的parallelize方法,在一个已经存在的数据集合上创建的(一个Seq对象),集合的对象将会被拷贝,创建出一个可以被并行操作的分布式数据集,比如上面的代码,演示了如何python中的list创建一个并行集合,并进行分行

       2. 文件系统数据集读取数据

 

        spark可以将任何hadoop所支持的存储资源转换称RDD,如本地文件(语言网络文件系统),索引的节点都必须能访问到,HDFS,mongodb,HBase,等

 

下面我们开始使用文件系统集读取数据,首先在hello里面上传一个文件,比如:

 

开始写代码:

lines = sc.textFile("hdfs://python2:9000/hello/data.csv")

既然我们已经获取了数据那就开始操作:

1.map()

    他的参数是一个函数(支持lambda函数),函数应用于RDD的每一个元素,函数的参数只能有一个,返回值是一个新的RDD

2.flatMap() 

    参数是一个函数,函数应用为RDD的每一个元素,参数只有1个,将数据进行拆分,变成迭代器,返回值是一个新的RDD   

如上图,可以进一步的将数据拆分出来,也可以进行添加一些别的操作,比如:

3.filter()

    参数是一个函数,与python里面的filter一样,函数会过滤掉不符号和条件的元素,返回值是一个新的RDD

4.reduce()

    并行汇总所有RDD元素,参数是一个函数,函数的参数有2个

5.countByValue()

    各RDD元素在RDD中出现的次数

也可以像reduceByKey()变换每一组内汇总

6.reduceByKey()

    在每一键组内汇总变换,查看每一个数据在文件里面出现的次数

7.sortByKey()

    未完待续...

附链接:


猜你喜欢

转载自blog.51cto.com/14193448/2530847