13.4 Spark

Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架,基于Scala开发。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。

13.4 Spark - 图1

与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark支持更灵活的函数定义,可以将应用处理速度提升一到两个数量级,并且提供了众多方便的实用工具,包括SQL查询、流处理、机器学习和图处理等:

Spark体系架构包括如下三个主要组件:数据存储、API、管理框架,如图13-3所示。

13.4 Spark - 图2

图13-3 Spark体系架构

目前Spark推出了2.0版本,性能大幅度提升,并在数据流方面退推出了很多新功能。

13.4.1 使用官方镜像

用户可以使用sequenceiq/spark镜像,版本方面支持Hadoop 2.6.0,Apache Spark v1.6.0(CentOS)。同时此镜像还包含Dockerfile,用户可以基于它构建自定义的Apache Spark镜像。

用户使用docker pull指令直接获取镜像:


  1. $ docker pull sequenceiq/spark:1.6.0
  2. 1.6.0: Pulling from sequenceiq/spark
  3. ...
  4. 9d406b080497: Pull complete
  5. Digest: sha256:64fbdd1a9ffb6076362359c3895d089afc65a533c0ef021ad4ae6da3f8b2a413
  6. Status: Downloaded newer image for sequenceiq/spark:1.6.0

也可以使用docker build指令构建spark镜像:


  1. $ docker build --rm -t sequenceiq/spark:1.6.0 .

另外,用户在运行容器时,需要映射YARN UI需要的端口:


  1. $ docker run -it -p 8088:8088 -p 8042:8042 -h sandbox sequenceiq/spark:1.6.0 bash
  2. bash-4.1#

启动后,可以使用bash命令行来查看namenode日志等信息:


  1. bash-4.1# cat /usr/local/hadoop/logs/hadoop-root-namenode-sandbox.out
  2. ulimit -a for user root
  3. core file size (blocks, -c) 0
  4. data seg size (kbytes, -d) unlimited
  5. scheduling priority (-e) 0
  6. file size (blocks, -f) unlimited
  7. pending signals (-i) 7758
  8. max locked memory (kbytes, -l) 64
  9. max memory size (kbytes, -m) unlimited
  10. open files (-n) 1048576
  11. pipe size (512 bytes, -p) 8
  12. POSIX message queues (bytes, -q) 819200
  13. real-time priority (-r) 0
  14. stack size (kbytes, -s) 8192
  15. cpu time (seconds, -t) unlimited
  16. max user processes (-u) unlimited
  17. virtual memory (kbytes, -v) unlimited
  18. file locks (-x) unlimited

13.4.2 验证

基于YARN部署Spark系统时,用户有两种部署方式可选:YARN客户端模式和YARN集群模式。下面分别论述两种部署方式。

1.YARN客户端模式

在YARN客户端模式中,SparkContext(或称为驱动程序,driver program)运行在客户端进程中,应用的master仅处理来自YARN的资源管理请求:


  1. # 运行spark shell
  2. spark-shell \
  3. --master yarn-client \
  4. --driver-memory 1g \
  5. --executor-memory 1g \
  6. --executor-cores 1
  7. # 执行以下指令,若返回1000则符合预期
  8. scala> sc.parallelize(1 to 1000).count()

2.YARN集群模式

在YARN集群模式中,Spark driver驱动程序运行于应用master的进程中,即由YARN从集群层面进行管理。下面,用户以Pi值计算为例子,展现两种模式的区别:

Pi计算(YARN集群模式):


  1. # 执行以下指令,成功后,日志中会新增记录"Pi is roughly 3.1418"
  2. # 集群模式下用户必须制定--files参数,以开启metrics
  3. spark-submit \
  4. --class org.apache.spark.examples.SparkPi \
  5. --files $SPARK_HOME/conf/metrics.properties \
  6. --master yarn-cluster \
  7. --driver-memory 1g \
  8. --executor-memory 1g \
  9. --executor-cores 1 \
  10. $SPARK_HOME/lib/spark-examples-1.6.0-hadoop2.6.0.jar

Pi计算(YARN客户端模式):


  1. # 执行以下指令,成功后,命令行将显示"Pi is roughly 3.1418"
  2. spark-submit \
  3. --class org.apache.spark.examples.SparkPi \
  4. --master yarn-client \
  5. --driver-memory 1g \
  6. --executor-memory 1g \
  7. --executor-cores 1 \
  8. $SPARK_HOME/lib/spark-examples-1.6.0-hadoop2.6.0.jar

3.容器外访问Spark

如果需要从容器外访问Spark环境,则需要设置YARN_CONF_DIR环境变量。yarn-remote-client文件夹内置远程访问的配置信息:


  1. export YARN_CONF_DIR="`pwd`/yarn-remote-client"

只能使用根用户访问Docker的HDFS环境。当用户从容器集群外部,使用非根用户访问Spark环境时,则需要配置HADOOP_USER_NAME环境变量:


  1. export HADOOP_USER_NAME=root