Spark是一个通用的大规模数据快速处理引擎,一个大数据分布式处理框架。Spark之所以能被迅速的应用到各种大数据处理场景下,与其为Batching processing,Streaming Processing,Ad-hoc Query等三大大数据处理问题提供了近乎完美的解决方案息息相关。在Spark中,使用Spark SQL,Spark Streaming,MLlib,Graphx很好的解决了上述提及的三大大数据处理核心问题。本文主要介绍spark单节点伪集群的安装与简单使用。
安装
1.JDK环境
Spark最初使用Scala开发,运行在Java虚拟机(JVM)上。需要安装jdk环境,本文的环境如下(jdk的安装在此不再累述):
# echo $JAVA_HOME
/home/jdk1.8.0_121
# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
2.SSH服务以及免密码登录
对于单个节点的伪集群,需要确保ssh localhost 是成功的,否则,需要通过ssh-keygen创建相关的密钥。如下,可以创建口令为空的密钥:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa //生成口令为空的ssh密钥
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys //将公钥加入已认证的密钥中
3.scala
scala的安装主要步骤是解压,配置环境变量,(安装包为scala-2.12.1.tgz,安装于home目录下)
# tar -zxvf scala-2.12.1
# ln -sf scala-2.12.1 scala
# vim ~/.bash_profile
SCALA_HOME=/home/scala
PATH=$PATH:$HOME/bin:/usr/local/bin:$SCALA_HOME/bin
export PATH SCALA_HOME
# source ~/.bash_profile
验证scala的安装
# scala
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_121).
Type in expressions for evaluation. Or try :help.
scala> 9*9
res0: Int = 81
4.spark
尽管spark并不是必须依赖于Hadoop,但是结合Hadoop的分布式文件系统(HDFS)提供的海量存储,spark可以充分发挥其在大数据领域的处理的卓越性能。主要步骤:解压安装包,修改环境变量,修改spark配置。
# tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz
# ln -sf spark-2.2.0-bin-hadoop2.7 spark
# vim ~/.bash_profile
SPARK_HOME=/home/spark
PATH=$PATH:$HOME/bin:/usr/local/bin:$SPARK_HOME/bin
export PATH SPARK_HOME
# source ~/.bash_profile
配置spark
# pwd
/home/spark/conf
# cp spark-env.sh.template spark-env.sh
# vim spark-env.sh
export JAVA_HOME=/home/jdk1.8.0_121 #java安装目录
export SCALA_HOME=/home/scala #scala安装目录
export SPARK_MASTER_IP=192.168.94.200 #master节点的IP
export SPARK_MASTER_PORT=7077 #master服务端口,默认为7077
export SCALA_MASTER_WEBUI_PORT=8080 #master节点对应web服务的端口,默认为8080
export SPARK_WORKER_MEMORY=1g #限制worker节点能够分配给executor的内存大小
export HADOOP_CONF_DIR=/home/hadoop/etc/hadoop #hadoop集群配置文件路径
在spark主机列表中加入当前主机(当前主机名为master)
# cp slaves.template slaves
# echo $HOSTNAME
master
# vim slaves
master
使用
1.测试:使用spark计算HDFS上的数据
启动HDFS,并上传测试数据
# start-dfs.sh
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop-2.7.3/logs/hadoop-root-namenode-master.out
localhost: starting datanode, logging to /home/hadoop-2.7.3/logs/hadoop-root-datanode-master.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/hadoop-2.7.3/logs/hadoop-root-secondarynamenode-master.out
# jps
2993 NameNode
3121 DataNode
3396 Jps
3287 SecondaryNameNode
# hadoop fs -mkdir -p /test
# hadoop fs -copyFromLocal /home/spark/README.md /test
# hadoop fs -ls /test
Found 1 items
-rw-r--r-- 1 root supergroup 3809 2017-09-11 21:06 /test/README.md
启动spark
# pwd
/home/spark/sbin
# ./start-all.sh //进入spark目录下执行该命令,因为Hadoop的bin目录下也有一个start-all.sh;如果直接执行start-all.sh,具体是执行spark中的还是hadoop中,取决于PATH变量中的位置#
使用spark的Python shell进行及时数据分析
# pwd
/home/spark/bin
# ./pyspark
Using Python version 2.7.3 (default, Mar 7 2016 10:43:13)
SparkSession available as 'spark'.
>>> lines = sc.textFile("/test/README.md")
>>> lines.count()
103
>>> lines.first()
u'# Apache Spark'
>>>
对象sc是shell启动时自动创建的一个SparkContext对象,它包含了当前spark的环境变量。sc.textFile()从给定路径的文件中创建一个RDD(Resilient distributed dataset),其后分别调用RDD的行动操作count()和first()对数据进行分析。”/test/README.md”的完整路径为”hdfs://localhost:9000/test/README.md”,因为之前已经在spark-env.sh脚本中导出了hadoop的环境配置,故spark可以使用hdfs相对路径访问文件。
2.测试:使用spark shell计算本地磁盘上的数据
前面提及spark并不是绝对依赖于HDFS,spark也可以访问本地文件系统。在此停掉HDFS进程,并使用spark shell计算本地文件。
# ./stop-dfs.sh
# pwd
/home/spark/sbin
# ./stop-all.sh
修改spark-env.sh,注释掉HADOOP_CONF_DIR配置,再次使用Python shell进行数据分析。
# pwd
/home/spark/bin
# ./pyspark
Using Python version 2.7.3 (default, Mar 7 2016 10:43:13)
SparkSession available as 'spark'.
>>> lines = sc.textFile("/home/spark/README.md")
>>> lines.count()
103
>>> lines.first()
u'# Apache Spark'
>>>