# spark-abc
**Repository Path**: dongyanggl/spark-abc
## Basic Information
- **Project Name**: spark-abc
- **Description**: 初学 Spark
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2017-08-24
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# spark-abc
## 新建项目
使用 ItelliJ IDEA 创建
1. 新建选择 Maven - camel-archetype-scala
2. 为项目起个 GroupId 和 ArtifactId
3. 其他默认,一路 next
4. 创建完成后,IDEA 会自动下载一系列依赖的库,所以需要稍等一会
这样一个可以运行 scala 的项目就完成了。
## Hello Spark
1. 将以下代码写入到 hellospark.scala 中
```
package morefun;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
object helloSpark {
def main(args: Array[String]): Unit = {
//设置本机Spark配置
val conf = new SparkConf().setAppName("wordCount").setMaster("local")
//创建Spark上下
val sc = new SparkContext(conf)
//从文件中获取数据
val lines = sc.textFile("file:/Users/wdy/Downloads/daily.log") // fasterxml 版本不对,可能会导致这里出错
// val input = sc.textFile("file:/Users/wdy/dev/src/gitoschina/DanDanTV-Server/doc/配置文件/v1.0/data_config_domy.json")
val errors = lines.filter(_.contains("ERROR")) // errors is a org.apache.spark.rdd.FilteredRDD
var cache = errors.cache() // persist 到内存中,它的作用是在RDD的计算完成后,将结果cache起来,以供以后的计算使用,这样的话可以加快以后运算的速度
var count = errors.count() // 触发action,计算errors有多少个,即ERROR的多少行;hadoop 版本不对,可能会导致这里出错
println(" count = " + count);
var string = lines.toString;
//分析并排序输出统计结果
lines.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((x, y) => x + y).sortBy(_._2,false).foreach(println _)
}
}
```
2. 增加 org.apache.spark 的依赖
在 pom.xml 中增加
```
org.apache.spark
spark-core_2.11
2.2.0
```
3. 指定 jackson 的版本为 2.6.7
如果不指定版本,在运行时可能会报错误
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.mapred.FileInputFormat
在 pom.xml 中增加。
```
2.6.7
2.6.7.1
com.fasterxml.jackson.core
jackson-core
${fasterxml.jackson.version}
com.fasterxml.jackson.core
jackson-databind
${fasterxml.jackson.databind.version}
com.fasterxml.jackson.core
jackson-annotations
${fasterxml.jackson.version}
```
4. 指定 hadoop 的版本为 2.7.2
不指定版本可能会报错
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.mapred.FileInputFormat
网上有人有同样的问题,基本都是说 hadoop 与 hbase 中的 guava有冲突。有的说 hadoop 用 2.7.2 好用了,有的说要替换 hbase 中的 guava。
我这里是替换成了 2.7.2 好用了。
在 pom.xml 中增加
```
2.7.2
org.apache.hadoop
hadoop-common
${hadoopVersion}
org.apache.hadoop
hadoop-hdfs
${hadoopVersion}
org.apache.hadoop
hadoop-mapreduce-client-core
${hadoopVersion}
org.apache.hadoop
hadoop-client
${hadoopVersion}
```
5. 添加 mysql
在 pom.xml 中添加
mysql
mysql-connector-java
5.1.31
6. 为系统安装 scala
如果是在 idea 中 似乎不需要此步骤
下载: https://www.scala-lang.org/download/
设置环境变量:
SCALA_HOME=D:\scala
PATH=......;%SCALA_HOME%\bin
## 用 SBT 创建项目
1. 安装 SBT
brew install sbt
2. 使用 sbteclipse
1. 下载最新版: https://github.com/typesafehub/sbteclipse/releases
2. 在 ~/.sbt/0.13/plugins/plugins.sbt 中增加以下内容,其中版本号根据下载的来写
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.1")
未完成
## 打包
BUILD---->BUILD Artifact ----> BUILD
如果选择不了,请见下面的解决方案
最后打包的 Jar 在 out 目录下
## 运行
上传 jar 包到 spark 集群一台服务器,运行以下脚本
```
/usr/local/spark/bin/spark-submit \
--class morefun.helloSpark \
--num-executors 3 \
--executor-cores 3 \
/mnt/spark-study/scala/spark-wordcount-scala.jar
```
`注意:`上述脚本可能还是在服务器运行独立的模拟环境,没有真正提交到集群,如果要提交到集群,需要加参数 --master
如:
--master spark://172.21.0.6:7077
## 可能遇到的问题
1. 网上例子 scala 编译出错
网上例子类定义用的 class helloSpark 应该改成 object helloSpark
1. 运行发现 sc.textFile 出错,提示 Incompatible Jackson version: 2.8.8,应该是 Jackson 不兼容导致
解决方案:
尝试更新 org.apache.spark 到最新的 2.2.0 的版本也不行,最后将 Jackson 指定版本到 2.6.7 才通过。
2.6.7
2.6.7.1
com.fasterxml.jackson.core
jackson-core
${fasterxml.jackson.version}
com.fasterxml.jackson.core
jackson-databind
${fasterxml.jackson.databind.version}
com.fasterxml.jackson.core
jackson-annotations
${fasterxml.jackson.version}
2. Stopwatch 报错
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.mapred.FileInputFormat
解决方案:
网上有人有同样的问题,基本都是说 hadoop 与 hbase 中的 guava有冲突。有的说 hadoop 用 2.7.2 好用了,有的说要替换 hbase 中的 guava。
我这里是替换成了 2.7.2 好用了。
3. 编译报错 type mismatch found unit
应该是方法设置的返回值与实际返回的不一致导致
4. 使用 Intellij IDEA CE 即免费版重新导入了项目
1. 提示 scala 插件,翻墙后按照成功
2. 提示需要指定 scala sdk 在提示页面上选择 scala sdk 成功
需要注意,刚设置完 SDK 提示成功,其实再次编译就会出现以下错误。
3. 编译程序提示
```
org.jetbrains.jps.incremental.scala.remote.ServerException
找不到 main
```
4. 可能是 sdk 版本的问题,重新根据推荐,翻墙下载了指定的 scala sdk ,最后运行成功
5. BUILD Artifact 是灰的,无法选中
https://www.cnblogs.com/zlslch/p/8565551.html
File -> Project Structure -> Artifact -> 点击 + -> Jar -> Empty -> Output Layout -> + 选择 Module Output -> 选中 Spark_abc
注意下方有个 main class 最好保证与要打包的 main class 一致。
理论上再选择 Empty 的时候,应该也可以选择 From Modles,但尝试默认打包的 jar 包很大,而且执行的时候也找不到 main class
6.