小白学习Spark系列二:spark应用打包傻瓜式教程(IntelliJ+maven 和 pycharm+jar)
在做spark项目时,我们常常面临如何在本地将其打包,上传至装有spark服务器上运行的问题。下面是我在项目中尝试的两种方案,也踩了不少坑,两者相比,方案一比较简单,本博客提供的jar包适用于spark版本2.0以下的,如果jar包和版本不对应会出现找不到类或方法等错误提示信息,它主要借助于eclipse和现成的jar包进行打包应用,只能从官网上下载对应的jar包,局限很大。方案二是借助于IntelliJ + maven方式,它只要配置好pom.xml文件,在文件中写明自己的运行环境即可,通用(推荐),另外IntelliJ软件炒鸡好用,建议大家不要由于自己习惯哪款软件就先入为主。
1.准备工作
scala:在本机上装scala,下载链接 https://www.scala-lang.org/download/ ,如果是在windows下,请下载 msi 版本。

jdk:下载链接 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
如果是需要在本地打包后上传至装有spark的服务器上运行,则务必保证本地和服务器上版本保持一致,否则会导致找不到类或方法等错误。
2. 方案一:eclipse打jar包(适用于spark2.0以下)
(1)安装 eclipse和配置完java环境后,在工具栏 Help -> Install New Software,输入scala ,通过链接下载运行scala代码的插件。
(2)下载插件后,新建一个scala工程,测试Spark程序,统计单词个数。

(3)在工程下新建目录 lib,将两个jar包(hadoop-0.20.2-CDH3B4-core.jar,spark-assembly-1.6.3-SNAPSHOT-hadoop2.5.0-cdh5.3.2.jar)拷贝到 lib 下,选中这两个jar包右击 Build Path,加到Referenced Libraries中。
jar包下载链接:https://pan.baidu.com/s/1dQjJR8vtl01wp6JLEgRp3w 密码:20hh
(4)选中工程,右击,选中Export,选择JAR 文件->Next,只选择src文件,填写保存位置和名字。


(5)把jar包传到安装有spark的服务器目录下,写好submit脚本(如下图所示),这里我新建了Jar目录,把jar包放到该目录下,后面紧接着是传递给函数的一个参数(文件路径),执行该脚本。

(6)如果出现 找不到类等错误,一般就是版本出现了问题。我在eclipse中加载了hadoop和assmbly的jar包后也提示了该错误,当时没选择对scala的版本,可通过如下方式改变其版本,选中 scala library container后右击 properties,选择2.10.6版本。当然,你需要这些版本和服务器上装有的spark、scala、hadoop版本一致才可以。这种方式需要从网上找版本一致的jar包,体验很差,不推荐。

2. 方案二:IntelliJ + maven(推荐)
(1)安装IntelliJ
下载链接https://www.jetbrains.com/idea/download/#section=windows,选用右边的Community版本就ok。
(2)安装IntelliJ中的scala插件
如果在主界面可通过 File -> Settings -> Plugins -> Browse respositories 的方式安装scala插件,具体如下图所示。由于这里我已经安装完毕,所以没有显示 Install 按钮。如果刚装完 IntelliJ,进入初始界面,可选择右下方的Configure -> Plugins 来安装scala插件。



(3)新建maven项目
最新的IntelliJ中一般都会安装有maven,这里通过 File -> New -> Project -> Maven 新建maven项目,在配置maven页面需选中复选框,选择scala-archetype-simple:1.2 ,点击next,填写信息自己随意起名字就好,无碍。在配置maven环境这块需要勾选两个复选框,再选择合适的maven路径和setting files路径,一般是在安装IntelliJ目录下的plugins中可以找到。具体如下图所示:





(4)配置maven项目的pom.xml文件
注意:当你配置完xml信息后,右下角这里会提示import changes,点击它,等待页面最下面Running信息加载完就可以到下一步了。否则不能及时同步xml中的配置,会导致打包失败(亲测)。配置文件信息如下,方便大家自行粘贴。我这里配置的spark版本是 2.1.1, scala版本 2.11,hadoop 版本 2.7.3,这里需要和服务器上版本一致,如果不知道服务器上spark信息,可以输入命令行 spark-shell 查看。hadoop可通过 hadoop version 查看。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>Test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spark.version>2.1.1</spark.version>
<scala.version>2.11</scala.version>
<hadoop.version>2.7.3</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
</build> </project>
pom.xml


(5)在test目录下右键选择scala script新建scala类,如果没有scala script,则新建一个空白文件,名字和文件中的类名需一致,这里随意起个名字WordCount,用 .scala 作为后缀名。然后会提示没有Scala SDK,按照提示点击Setup Scala SDK安装即可。scala文件内容如下。


package com.test
import org.apache.spark.{SparkContext, SparkConf}
object WordCount {
def main(args: Array[String]) {
/**
* SparkContext 的初始化需要一个SparkConf对象
* SparkConf包含了Spark集群的配置的各种参数
*/
val conf = new SparkConf().setAppName("testRdd")//设置本程序名称
//.setMaster("local") 设置单线程模式
//Spark程序的编写都是从SparkContext开始的
val sc = new SparkContext(conf)
val data = sc.textFile("hdfs:///user/aisearch/user/zhengkaiyu001/graph_scala/conf/entity_params")//读取本地文件
data.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect().foreach(println)//循环打印
}
}
这里注意下目录结构,com和test是上下级目录,这样在下面打包过程中会出现些问题,同时我会说下是怎么解决的。
(6)开始打包
- File -> Project Structure -> Artifacts -> + -> JRE -> From modules with dependencies -> ok ,具体信息如下图所示。
- 在通过Search by Name选择主类的时候,会自动提供出项目中是主类的可选项,但是如果上一步骤中的目录结构是上下级时,就没有自动提示信息,打包会失败。那该如何解决呢?原因其实没有根据 pom.xml 配置文件及时更新,所以打开配置文件可以选择删除一行,右下方出现 import changes 后点击,等待加载完毕后再把那行粘贴上(也可以调出maven project (file->setting->appearance->show tool windows bar)->clean 后,再选中项目右击->maven->Reimport)。这样目录就变为com.test。再重复打包过程就会有自动提示主类的信息,选择主类后点击ok。
- 在进行打包设置时,只留下'Test' compile output 和Test.jar包,将其他jar包都删除,output directory是jar包的输出路径。
- Build:这里注意是 Build Artifacts,选择build 或者 rebuild,其实rebuild的作用是当你变动了代码,可直接rebuild重新打包,无须重新配置打包环境。
- 打包过程中会提示错误信息,把多余的文件test目录下的和main目录下的App删除即可。
,







(7)运行
把输出的jar包上传至装有spark的服务器,这里我是新建了个目录,把jar包传到Jars目录下,运行命令见如下所示的脚本文件:

注意踩坑:
- 当配置pom.xml后一定要import changes(在打包过程中才会默认有选择的主类),如果应用没有及时import changes,你可以调出maven project (file->setting->appearance->show tool windows bar)->clean 后,再选中项目右击->maven->Reimport

- pom.xml文件中的版本号需要和服务器上的各版本一一对应
参考博客:
https://blog.csdn.net/xingyx1990/article/details/80752041
小白学习Spark系列二:spark应用打包傻瓜式教程(IntelliJ+maven 和 pycharm+jar)的更多相关文章
- Telegram学习解析系列(二):这我怎么给后台传输数据?
写在前面: 在iOS开发的过程中,有很多时候我们都在和数据打交道,最基本的就是数据的下载和上传了,估计很多很多的小伙伴都在用AFNetworking与后台数据打交道,可有没有想过,哪天AFNetwor ...
- Socket学习总结系列(二) -- CocoaAsyncSocket
这是系列的第二篇 这是这个系列文章的第二篇,要是没有看第一篇的还是建议看看第一篇,以为这个是接着第一篇梳理的 先大概的总结一下在上篇的文章中说的些内容: 1. 整理了一下做IM我们有那些途径,以及我们 ...
- ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解
前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...
- Spark系列—02 Spark程序牛刀小试
一.执行第一个Spark程序 1.执行程序 我们执行一下Spark自带的一个例子,利用蒙特·卡罗算法求PI: 启动Spark集群后,可以在集群的任何一台机器上执行一下命令: /home/spark/s ...
- Spark系列—01 Spark集群的安装
一.概述 关于Spark是什么.为什么学习Spark等等,在这就不说了,直接看这个:http://spark.apache.org, 我就直接说一下Spark的一些优势: 1.快 与Hadoop的Ma ...
- spring boot 学习笔记(二)之打包
一.叙述 spring boot 在 pom 中可以配置成 packaging 为 jar ,这样打包出来的就是一个 jar 包,可以通过 Java 命令直接运行, Java 命令为: java - ...
- [纯小白学习OpenCV系列]官方例程00:世界观与方法论
2015-11-11 ----------------------------------------------------------------------------------- 其实,写博 ...
- 学习CNN系列二:训练过程
卷积神经网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间精确的数学表达式,只要用已知的模式对卷积神经网络加以训练,网络就具有输入.输出之间映射的 ...
- Dubbo源码学习总结系列二 dubbo-rpc远程调用模块
dubbo本质是一个RPC框架,我们首先讨论这个骨干中的骨干,dubbo-rpc模块. 主要讨论一下几部分内容: 一.此模块在dubbo整体框架中的作用: 二.此模块需要完成的需求功能点及接口定义: ...
随机推荐
- 修改电脑名称后,Oracle客户端连不上
有以下几个步骤可以尝试,帮助大家缩小错误范围. 1 命令窗口使用sqlplus查看数据库服务是否正常,如下图,没有出现“连接到:”表示数据库服务不正常. 2 在任务管理器中查看数据库的监听是否已经 ...
- Mongodb--切片
1.在3台服务器上分别运行 2717 , 27018,27109,互为副本集,形成3套replSet 2.在3台服务器上各配置config.server,运行在27020端口上,和配置mongod的命 ...
- owin-startup方法
owin在根目录下有这个startup.cs文件,里面有个startup方法,这个和global.asax有什么区别呢? 测试一下执行顺序,是先执行了global.asax文件,再执行了startup ...
- 反射常用API
反射所有功能都是通过class API来实现的 class常用API有: 1.class.GETINTERFACES():获得这个类实现的接口. 2.class.getMethods() Method ...
- spring boot使用外部tomcat部署
1:pom里面的packaging修改为war(<packaging>war</packaging>) 2:在pom依赖spring-boot-starter-web排除内置的 ...
- hdu - 4920 - Matrix multiplication(缓存优化+开挂)
题意:求两个n x n的矩阵相乘后模3的结果,n <= 800. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 -->>呀呀 ...
- Uva1335 二分+贪心
/* 奇数怎么搞呢 二分到答案怎么judge呢 贪心怎么贪呢 假设贪心方案是 前两个挨着取 后面的能靠前就靠前 这样子似乎保证了ans最min 但是不管贪的对不对 操作起来时间GG 而且 如果真的这样 ...
- Uva 11021(概率)
题意:有k只麻球,每只只能活一天,但临死之前可能产生新麻球,生出i个麻球的概率为pi,给定m,求m天后所有麻球都死亡的概率 输入格式 输入一行为测试数据的组数T,每组数据第一行为3个整数n,k,m;已 ...
- Head First 设计模式 —— 工厂模式与工厂方法
1. 实例化对象的方法 制造对象的方法不只 new 操作符一种.且实例化这个动作不应该总是公开地进行,还有初始化常常造成耦合问题.由此提出的工厂模式以进一步封装实例化的活动,且避免对象初始化时的可能产 ...
- NEU操作系统实验课4——线程同步
实验要求: 创建两个线程按数字顺序打印10以下自然数,其中一个线程打印1-3及8-10:另一个线程打印4-6.要求使用线程同步机制实现上述打印顺序. 看网上的资料学习了两种写法 C++11的,使用了s ...