• windows下Idea结合maven开发spark和本地调试


    本人的开发环境:
    1.虚拟机centos 6.5
    2.jdk 1.8
    3.spark2.2.0
    4.scala 2.11.8
    5.maven 3.5.2
        在开发和搭环境时必须注意版本兼容的问题,不然会出现很多莫名其妙的问题
     
    1.启动master进程
    ./sbin/start-master.sh
     
    2.启动worker进程
    ./bin/spark-class org.apache.spark.deploy.worker.Worker spark://hadoop000:7077
    【注意,spark://hadoop000:7077,是在启动master进程后,通过localhost:8080登陆到spark WebUI上查看的。】
     
    第一第二点是运行环境的前提条件,下面是开发环境。
     
    1.idea结合maven开发spark,下面以NetWorldCount为例子
    package com.spark
     
    import org.apache.spark.SparkConf
    import org.apache.spark.streaming.{Seconds, StreamingContext}
     
    /**
      * Spark Streaming处理Socket数据
      * 测试: nc
      */
    object NetworkWordCount {
     
      def main(args: Array[String]): Unit = {
     
        val sparkConf = new SparkConf().setMaster("local").setAppName("NetworkWordCount")
     
        /**
          * 创建StreamingContext需要两个参数:SparkConf和batch interval
          */
        val ssc = new StreamingContext(sparkConf, Seconds(5))
     
        val lines = ssc.socketTextStream("localhost", 6789)
     
        val result = lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
     
        result.print()
     
        ssc.start()
        ssc.awaitTermination()
      }
    }

    2.生成jar包

     

     3.上传jar包

     

    4.提交任务前先启动监听端口,在终端输入以下命令
    nc -lk 6789
     
     
    5.提交任务
    ./spark-submit  --master local[2] --class com.spark.NetworkWordCount --name NetworkWordCount  /home/hadoop/tmp/spark.jar

    运行程序,出现下面的错误:

    a.local这里出错。原因简单来说,local模式下只开启一条线程,reciver占用一条线程后,没有资源用来计算处理数据了。
    解决办法:local--->local[2]
     
    b.缺少com.fasterxml.jackson.scala这个方法
    解决办法:
    1.查看这个类的版本:view--->maven project--->--->.然后在pom.xml增加对应的dependency
    <dependency>
      <groupId>com.fasterxml.jackson.module</groupId>
      <artifactId>jackson-module-scala_2.11</artifactId>
      <version>2.6.5</version>
    </dependency>
    重新reimport,再次运行。出现以下错误

     去maven reposition查找对应的依赖: 

    在这里,使用1.3.0版本的。 

    在pom.xml添加以下的 dependency
    <dependency>
      <groupId>net.jpountz.lz4</groupId>
      <artifactId>lz4</artifactId>
      <version>1.3.0</version>
    </dependency>
     
    重新reimport,再次运行。这次程序正常运行。
     
    输入数据:

     

    接受数据:

     

    至此,windows下,idea结合maven开发spark+调试过程 完整跑了一遍。
    下面分析 
     val sparkConf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount") 

     在本地调试中,输入源除了 fileStream外,必须local[n], n >= 2 。
     在spark中,输入源除了 fileStream ,其他的都继承自 ReceiverInputDStream ,因此其他都需要至少两条线程(针对local模式)以上来供程序使用。
    def fileStream[
      K: ClassTag,
      V: ClassTag,
      F <: NewInputFormat[K, V]: ClassTag
    ] (directory: String): InputDStream[(K, V)] = {
      new FileInputDStream[K, V, F](this, directory)
    }
     
    例如本例子中使用的 socketTextStream
    def socketTextStream(
        hostname: String,
        port: Int,
        storageLevel: StorageLevel = StorageLevel.MEMORY_AND_DISK_SER_2
      ): ReceiverInputDStream[String] = withNamedScope("socket text stream") {
      socketStream[String](hostname, port, SocketReceiver.bytesToLines, storageLevel)
    }
  • 相关阅读:
    福大软工 · 第十次作业
    Summary #ToBeContinue......
    福大软工 · 第十二次作业
    Beta 冲刺(7/7)
    Beta 冲刺(6/7)
    Beta 冲刺(5/7)
    Beta 冲刺(4/7)
    Beta 冲刺(3/7)
    Beta 冲刺(2/7)
    福大软工 · 第十次作业
  • 原文地址:https://www.cnblogs.com/liangjf/p/7899282.html
Copyright © 2020-2023  润新知