最近尝试搭建spark开发环境,简单记录一下过程,后期有时间再完善。
spark是一个快速通用的大规模数据处理引擎。
快速:spark在内存中的运行速度比Hadoop MapReduce快100倍,比在 磁盘上的处理速度快10倍;
易于使用:支持Java,Python,Scala和R语言。
普遍性:apache spark 提供了 spark sql、spark streaming、mlib 和 graph等多种形式进行操作;
多平台运行:spark可以运行在hadoop、mesos、standalone或者cloud上。spark可以访问不同的数据源,如hdfs、cassandra、hbase和S3.
作为一个开源的框架,Spark在使用之前需要自己进行编译,spark maven工程下载地址为 https://github.com/apache/spark。Spark打包有多种方式,其中之一是使用工程中自带的shell脚本 make-distribution.sh 。
针对Apache版本的Hadoop(Hadoop2.x版本)编译
. make-distribution.sh -Pyarn -Phadoop-2.4 -Dhadoop.version=2.5.0 -Phive -Phive-thriftserver
针对CDH5.x版本的Hadoop编译
.make-distribution.sh --tgz -Pyarn -Phadoop-2.4 -Dhadoop.version=2.5.0-cdh5.3.6 -Phive -Phive-thriftserver
编译成功后会在当前路径下生成名为spark-1.3.0-bin-2.5.0的tar包。
由于spark是scala编写的,所以安装spark之前需要先安装scala,版本为2.10.4。 解压后在/etc/profile文件中配置scala_home环境变量,然后 source /etc/profile,使用scala -version查看成功结果。
[zpl@zpl-hadoop zookeeper-3.4.5]$ echo ${SCALA_HOME}
/home/zpl/software/scala-2.10.4
spark的常用运行模式有 local、standalone和yarn 。
解压完成后修改配置文件
1,将log4j.properties.template重命名为log4j.properties;
2,在 spark-env.sh 中配置 JAVA_HOME、SCALA_HOME以及hadoop配置路径:
JAVA_HOME=/home/zpl/Downloads/jdk1.7.0_67
SCALA_HOME=/home/zpl/software/scala-2.10.4
HADOOP_CONF_DIR=/home/zpl/software/hadoop-2.5.0/etc/hadoop
进入spark安装目录,运行命令
bin/spark-shell
spark context作为spark命令行的入口,初始时已经创建好实例,名称为sc,使用sc读取hdfs上的数据文件:
var rdd = sc.textFile("/wcinput/wc.input")
spark自动判断rdd为string类型,我们可以使用spark函数查看rdd信息,如:
rdd.count
rdd.first
rdd.take(2) //取前两条数据
rdd.collect //把所有的数据变成集合
rdd.filter(x=>x.contains("yarn")).collect //过滤
rdd.cache //将rdd加载到内存中去
对于每一个spark应用来说,都有一个web监控界面,端口号为4040,以后每个应用一次递加。
用函数将内容拆分成单个单词形式的数组,
rdd.flatMap(x=>x.splie(" ")).collect
将每个单词组装成key/value形式
rdd.flatMap(x=>x.split(" ")).map(x=>(x,1)).reduceByKey((x,y)=>(x+y)).collect
standalone模式运行时包括主节点 master和多个从节点 work,
在 spark-env.sh中增加以下配置:
SPARK_MASTER_IP=zpl-hadoop
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=2
SPARK_WORKER_MEMORY=2g
SPARK_WORKER_PORT=7078
SPARK_WORKER_WEBUI_PORT=8081
SPARK_WORKER_INSTANCES=1
修改slave配置文件,因为当前只有一个节点,所以只增加当前主机名即可。
启动时先启动master
sbin/start-master.sh
再启动 slaves,注意是slaves而不是slave,
sbin/start-slaves.sh
再次启动shell时,需要加参数 --master,表明运行在spark上,
bin/spark-shell.sh --master spark://zpl-hadoop:7070
一个spark应用由一个driver program和多个executor组成,当客户端请求时,driver program 创建spark context,由sc生成的cluster manager(集群管理器)向集群申请资源,创建RDD等。Executor进程存在于work节点上,用来运行任务,executor中又有很多task,每一个task就是一个线程,是work发送到executor运行的最小单位。