# 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.