Spark

一、核心概念

  1. 每个spark 应用都由一个驱动器程序(driver program)来发起集群上的各种并行操作

    • driver program 包含了应用的main 函数,并且定义了集群上的分布式数据集,还对这些分布式数据集应用了相关操作
    • driver program 通过一个SparkContext 对象来访问spark
    • driver program 一般要管理多个执行器(executor) 节点
  2. SparkContext:该对象代表了对计算集群的一个连接

    • pyspark shell 中,当shell 启动时,已经自动创建了一个SparkContext 对象,它叫做sc
    • 通常可以用它来创建RDD

二、安装和使用

  1. 安装步骤:

    • http://spark.apache.org/downloads.html 下载Pre-built Apache Hadoop xx and later 的版本
    • 解压即可
  2. pycharm 中使用pyspark

    • File->Settings->Project->Project Structure,选择右侧的Add Content Root

    • 添加spark 目录下的python目录

    • 注意,如果pycharm 使用了python3,则需要在脚本中添加语句:

      1. import os
      2. os.environ["PYSPARK_PYTHON"]="python3"

三、 pyspark shell

  1. spark 带有交互式的 shell,可以用于即时数据分析

    • spark shell 可以与分布式存储在许多机器的内存或者硬盘上的数据进行交互,处理过程由spark 自动控制
    • pyspark shellspark shellpython 版本
  2. 使用pyspark shell:进入spark 的安装目录,然后执行bin/pyspark

    • ubuntu16.04 中默认使用python2.7

    • 如果需要使用python3,则使用export PYSPARK_PYTHON=python3 来导出环境变量

      • 或者在代码中使用os.environ["PYSPARK_PYTHON"]="python3"
    • 退出pyspark shellCTRL+D
  3. 修改pyspark 日志:在conf 目录下创建一个log4j.proerties 的文件。

    • 可以直接使用模板log4j.properties.template,将log4j.rootCategory=INFO,console 修改为log4j.rootCategory=WARN,console

四、独立应用

  1. 独立应用与pyspark shell 的主要区别在于:你需要自行初始化SparkContext,除此之外二者使用的API 完全相同。

  2. python 中,你需要把独立应用写成python 脚本,然后使用Spark 自带的bin/spark-submit 脚本来运行:

    1. bin/spark-submit my_script.py

    spark-submit 会帮助我们引入python程序的spark 依赖

  3. 在独立应用中,通常使用下面方法初始化SparkContext

    1. from pyspark import SparkConf, SparkContext
    2. conf = SparkConf().setMaster('local').setAppName('My App')
    3. sc = SparkContext(conf = conf)

    首先创建一个SparkConf 对象来配置应用,然后基于该SparkConf 来创建一个SparkContext 对象。

    • .setMaster() 给出了集群的URL,告诉spark 如何连接到集群上。这里'local' 表示让spark 运行在单机单线程上。
    • .setAppName() 给出了应用的名字。当连接到一个集群上时,这个值可以帮助你在集群管理器的用户界面上找到你的应用。
  4. 关闭spark 可以调用SparkContext.stop() 方法,或者直接退出应用(如调用System.exit(0) 或者sys.exit()

  5. 如果需要使用python3,则使用export PYSPARK_PYTHON=python3 来导出环境变量。

    • 或者在代码中使用os.environ["PYSPARK_PYTHON"]="python3"