spark踩坑记——windows环境下spark安装和运行

一,安装篇

这部分介绍常规spark本地运行的必要软件安装。而如果你使用的是Maven构建工具,那么下面的步骤3,4,5都可以略过(由maven根据配置文件自动构建),我们只用安装最基本的1,2以及6环境变量中与JAVA相关的部分。maven安装见本节7。

本地安装部分更详细的可以参考:Spark在Windows下的环境搭建_xuweimdm的博客-CSDN博客_spark windows

1,安装jdk,需要是jdk8(也被称为jdk1.8)

Java Downloads | Oracle

环境变量:

创建JAVA_HOME:C:\Program Files\Java\jdk1.8.0_181

创建CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(前面有个点号)

Path添加:%JAVA_HOME%\bin;

测试是否安装成功:打开cmd命令行,输入java -version

2,安装intelj IDEA并配置scala插件

IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrains

IDEA安装完成后,安装scala插件:启动intelj -> 点击启动页configuration -> Plugins,或者file->setting->Plugins,搜索scala并安装插件。如果搜不到,可能是需要代理:Install JetBrains plugin... -> HTTP Proxy Settings设置代理。

安装完成后要重启IDEA。

3,安装spark

下载后解压到指定目录即可,这里我们选择2.2.0版本

Downloads | Apache Spark

环境变量:

创建SPARK_HOME:D:\spark-2.2.0-bin-hadoop2.7

Path添加:%SPARK_HOME%\bin

测试是否安装成功:打开cmd命令行,输入spark-shell

spark-shell时报错:error not found:value sqlContext。参考:https://www.liyang.site/2017/04/19/20170419-spark-error-01/

4,安装Hadoop

说明:如果你只是玩Spark On Standalone的话,就不需要安装hadoop,如果你想玩Spark On Yarn或者是需要去hdfs取数据的话,就应该先装hadoop。关于spark和hadoop的关系,强烈推荐这篇博客:Spark是否会替代Hadoop?

安装上面spark对应版本的hadoop 2.7:Apache Download Mirrors

解压到指定目录即可。

环境变量:

创建HADOOP_HOME:D:\hadoop-2.7.7

Path添加:%HADOOP_HOME%\bin

测试是否安装成功:打开cmd命令行,输入hadoop

hadoop测试时报错:Error: JAVA_HOME is incorrectly set。参考:Error: JAVA_HOME is incorrectly set. Please update F:\hadoop\conf\hadoop-env.cmd解决方法_天生要强注定要凉的博客-CSDN博客

5,安装scala SDK

其版本应与上面spark/jars/中scala版本一致,2.2.0版本spark对应的scala版本位2.11.8,Scala 2.11.8 | The Scala Programming Language

上面链接中提到了多种scala的安装方式,比较省事的是通过已经安装好scala插件的intelj IDEA安装scala SDK(注意区分插件和SDK):File => New => Project,选择scala,输入工程名,如果是第一次新建scala工程,会有一个scala SDK的Create按钮,然后选择需要的版本安装。

而我使用的是安装包安装方式:

环境变量:

创建SCALA_HOME: C:\Program Files (x86)\scala

Path添加:;%SCALA_HOME%\bin; %JAVA_HOME%\bin;;%HADOOP_HOME%\bin

测试是否安装成功:打开cmd命令行,输入scala

7,maven构建工具安装(如果不用maven构建工具,不用装)

Maven – Download Apache Maven

也是下载后解压即可。

环境变量:

MAVEN_HOME = D:\apache-maven-3.5.4

MAVEN_OPTS = -Xms128m -Xmx512m

path添加:%MAVEN_HOME%\bin

测试是否安装成功:打开cmd,输入mvn help:system

二,开发篇

下面介绍本地spark开发的示例,虽然spark是处理大数据的,常常在大型计算机集群上运行,但本地spark方便调试,可以帮助我们学习相关的语法。maven构建工具的开发流程可以参看spark开发环境搭建(基于idea 和maven)_双斜杠少年的博客-CSDN博客_idea spark

打开idea, file=>new=>project=>选择scala工程,选择IDEA=>输入工程名(如test),路径,JDK选刚刚安装的1.8,scala SDK选刚刚安装的scala-sdk-2.11.8(或者点右边的create,选择你想要的版本下载)=>finish

再src上右键=>new=>scala class=>选下拉框scala object,输入类名。

输入测试代码,这是一段分组排序的代码:


   
   
  1. import org.apache.spark.{SparkContext,SparkConf}
  2. object Sort {
  3. def main (args: Array[String]): Unit = {
  4. val conf = new SparkConf().setAppName( "GroupSort")
  5. val sc = new SparkContext(conf)
  6. val test =List(( "key1", "123", 12, 2, 0.13),( "key1", "123", 12, 3, 0.18),( "key2", "234", 12, 1, 0.09),( "key1", "345", 12, 8, 0.75),( "key2", "456", 12, 5, 0.45))
  7. val rdd = sc.parallelize(test)
  8. val rdd1= rdd.map(l => (l._1, (l._2, l._3, l._4, l._5))).groupByKey()
  9. .flatMap(line => {
  10. val topItem = line._2.toArray.sortBy(_._4)(Ordering[Double].reverse)
  11. topItem.map(f=>(line._1,f._1,f._4)).toList
  12. })
  13. rdd1.foreach(println)
  14. sc.stop()
  15. }
  16. }

设置本地模式:run=>edit configrations=>Application=>选择我们应用,VM options上添加-Dspark.master=local -Dspark.app.name=test

(更新:新版的Intellij IDEA在Application配置可定制化,如果没有找到上面VM options等选项,可以点击“Modify options”添加相关配置项)

包含spark和scala sdk: 工程目录右键=>open module settings=> project settings=> libraries=>"+"=>java=>选择spark安装目录下的jars文件夹=>确认。同样地,“+”=>scala sdk =>选择需要的scala sdk(与spark版本对应的sdk)=>确认。

运行代码:

三,问题集锦

1, import org.apache.spark.SparkContext引入了包,但下面代码connot resolve symbol SparkContext.(IDEA环境下,maven工程)

问题检查:工程目录右键->open module setting->project setting->libraries,发现左侧没有包含任何依赖库。

解决方法:如果是maven工程,则工程目录右键->maven->reimport。这个时候会自动下载相关依赖。相关依赖在.m2的repository文件夹下。如果是普通scala工程,按前面“开发篇”介绍的:工程目录右键=>open module settings=> project settings=> libraries=>"+"=>java=>选择spark安装目录下的jars文件夹=>确认。同样地,“+”=>scala sdk =>选择需要的scala sdk(与spark版本对应的sdk)=>确认。

思考:maven真的很强大,比如安装了scala插件后,不许要安装scala JDK,直接利用maven pom.xml配置好scala的版本,自动下载相应的scala的包。这样做有利于大型工程协助,同一个pom.xml文件可以保证大家都在同样的依赖库环境下开发。

2, 全局变量要谨慎,尤其是Buffer类型,因为你不知道它可能被塞进多少东西,除非你真的需要。

例如:

val data_set: RDD[(String, String, Int, Int)] = raw_rdd.map(generate_instance_per_line(_, configure)) 

其中generate_instance_per_line函数里对一个globalListBuffer全局变量进行了append操作,那么每一个map都会执行一次append.

3, SparkException: An application name must be set in your configuration

解决方法:

进入:Run > Edit Configurations... > Application > "My project name" > Configuraton,

设置VM options项为-Dspark.master=local.

-Dspark.master=local:表示设置我的spark程序以local模式运行

4,java.lang.NoClassDefFoundError: org/apache/spark/SparkContext

import  org.apache.spark.SparkConf没有报错,但运行时报上面NoClassDefFoundError错误。

解决办法:maven工程build的包有provided和compile两种模式,provided用于:运行环境已经有了相应的包,所以没有必要在build时把相关的包打包进来,减少jar包的体积。本地运行时,需要把provide改成complie。或者IDEA提供了更方便的做法:

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览 146576 人正在系统学习中
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spark streaming 是基于 spark 引擎的实时数据处理框架,可以通过集成 kafka 来进行数据流的处理。然而,在使用 spark streaming 进行 kafka 数据流处理时,可能会遇到一些坑。 首先,要注意 spark streaming 和 kafka 版本的兼容性。不同版本的 spark streaming 和 kafka 可能存在一些不兼容的问题,所以在选择版本时要特别留意。建议使用相同版本的 spark streaming 和 kafka,以避免兼容性问题。 其次,要注意 spark streaming 的并行度设置。默认情况下,spark streaming 的并行度是根据 kafka 分区数来决定的,可以通过设置 spark streaming 的参数来调整并行度。如果并行度设置得过高,可能会导致任务处理过慢,甚至出现 OOM 的情况;而设置得过低,则可能无法充分利用集群资源。因此,需要根据实际情况进行合理的并行度设置。 另外,要注意 spark streaming 和 kafka 的性能调优。可以通过调整 spark streaming 缓冲区的大小、批处理时间间隔、kafka 的参数等来提高性能。同时,还可以使用 spark streaming 的 checkpoint 机制来保证数据的一致性和容错性。但是,使用 checkpoint 机制可能会对性能产生一定的影响,所以需要权衡利弊。 最后,要注意处理 kafka 的消息丢失和重复消费的问题。由于网络或其他原因,可能会导致 kafka 的消息丢失;而 spark streaming 在处理数据时可能会出现重试导致消息重复消费的情况。可以通过配置合适的参数来解决这些问题,例如设置 KafkaUtils.createDirectStream 方法的参数 enable.auto.commit,并设置适当的自动提交间隔。 总之,在使用 spark streaming 进行 kafka 数据流处理时,需要留意版本兼容性、并行度设置、性能调优和消息丢失重复消费等问题,以免坑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值