一.环境准备
jdk 1.8.0
hadoop2.7.3 伪分布式部署
scala 2.11.8 支持spark2.0.1及以上版本
spark2.1.1
二.Spark安装模式(本文伪分布式)
spark有以下几种安装模式,每种安装模式都有自己不同的优点和长处。
local(本地模式):
常用于本地开发测试,本地还分为local单线程和local-cluster多线程;
standalone(集群模式):
典型的Mater/slave模式,Master可能有单点故障的;Spark支持ZooKeeper来实现 HA。
on yarn(集群模式):
运行在 yarn 资源管理器框架之上,由 yarn 负责资源管理,Spark 负责任务调度和计算。
on mesos(集群模式):
运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算。
on cloud(集群模式):
比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon的 S3;Spark 支持多种分布式存储系统:HDFS 和 S3。
目前Apache Spark支持三种分布式部署方式,分别是standalone、Spark on mesos和 spark on YARN,其中,第一种类似于MapReduce 1.0所采用的模式,内部实现了容错性和资源管理,后两种则是未来发展的趋势,部分容错性和资源管理交由统一的资源管理系统完成:让Spark运行在一个通用的资源管理系统之上,这样可以与其他计算框架,比如MapReduce,公用一个集群资源,最大的好处是降低运维成本和提高资源利用率(资源按需分配)。
三.安装scala
1.上传scala包,解压缩
2.配置环境变量SCALA_HOME
3.source /etc/profile使得生效
4.验证scala安装情况
scala -version
及上scala 安装完成
四.伪分布式Spark安装部署
1 解压spark安装包spark-2.1.1-bin-hadoop2.7.tgz,并配置SPARK_HOME环境变量,最后用 source使之生效。
export SCALA_HOME=/opt/hadoop/scala-2.11.8
export PATH=$PATH:$SCALA_HOME/bin
export SPARK_HOME=/opt/hadoop/spark-2.1.1-bin-hadoop2.7
export PATH=$PATH:SPARK_HOME/bin
注意:$SPARK_HOME/sbin中的启动spark指令与hadoop相同,因此本例中PATH只配置了$SPARK_HOME/bin目录
2 更改配置 在/usr/local/spark-2.0.1/conf 下
(1)cp slaves.template slaves
localhost(或者主机名)
(2)cp spark-env.sh.template spark-env.sh
vim spark-env.sh
进行以下配置
export JAVA_HOME=/opt/Java/jdk1.8.0_151
export SCALA_HOME=/opt/hadoop/scala-2.11.8
export SPARK_WORKER_MEMORY=1G
export HADOOP_HOME=/opt/hadoop/hadoop-2.7.3
export HADOOP_CONF_DIR=/opt/hadoop/hadoop-2.7.3/etc/hadoop
export SPARK_MASTER_IP=hadoop
注意:如果注释掉HADOOP_HOME,HADOOP_CONF_DIR这两行,则spark不依赖hadoop环境,可以单独使用!
(3)spark-defaults.conf文件用于设定一些默认的Spark环境变量,本次设定了master的地址,和spark shuffer文件的保存路径。
spark.master spark://hadoop:7077
3 启动spark
(1)先启动hadoop 环境
/usr/local/hadoop/sbin# start-all.sh
注意:启动之后要执行命令 hadoop dfsadmin -safemode leave,否则报错Cannot create directory /tmp/hive/hadoop/ee766399-e2f4-4edd-b977-4658fe14f9e3. Name node is in safe mode.
(2)启动spark环境
/usr/local/spark-2.0.1/sbin# ./start-all.sh
[注] 如果使用start-all.sh时候会重复启动hadoop配置,需要./在当前工作目录下执行脚本文件。
jps 观察进程 多出 worker 和 mater 两个进程
查看spark的web控制页面
http://hadoop:8080/
显示spark的端口是7070
启动shell界面:spark-shell
4.运行示例
scala>val rdd=sc.textFile("/user/hadoop/testdata/core-site.xml")//注意,此处为hadoop文件系统
scala>rdd.cache()
scala>val wordcount=rdd.flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+_)
scala>wordcount.take(10)
5.提交jar包执行程序
spark-submit --master spark://hadoop:7077 --class com.enn.click.UserClickCountAnalytics ~/HadoopDemo.jar spark://hadoop:7077
注意:最后一个“spark://hadoop:7077”是传入参数,多个参数用空格分割
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/kafka/common/serialization/StringDeserializer at com.sparkstreaming.SparkStreamKaflaWordCount$.main(SparkStreamKaflaWordCount.scala:25) at com.sparkstreaming.SparkStreamKaflaWordCount.main(SparkStreamKaflaWordCount.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
------------------------------------------------------------------------ Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/kafka010/KafkaUtils$ at com.sparkstreaming.SparkStreamKaflaWordCount$.main(SparkStreamKaflaWordCount.scala:33) at com.sparkstreaming.SparkStreamKaflaWordCount.main(SparkStreamKaflaWordCount.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)