用spark写WordCount(本地运行,提交到yarn运行)

文章目录

      • idea中本地运行(local)
      • 提交到虚拟机集群去运行(yarn)

idea中本地运行(local)

本地idea中运行要导入spark,scala依赖

  		
            org.scala-lang</groupId>
            scala-library</artifactId>
            2.11.12</version>
  		</dependency>

        
            org.scala-lang</groupId>
            scala-compiler</artifactId>
            2.11.12</version>
        </dependency>

        
            org.scala-lang</groupId>
            scala-reflect</artifactId>
            2.11.12</version>
        </dependency>
		
            org.apache.spark</groupId>
            spark-core_2.11</artifactId>
            2.4.5</version>
        </dependency>

还要设置一个hadoop相关的东西,要不然会报和Hadoop相关的错
随便你在哪个盘创建一个hadoop目录,hadoop目录下在创建一个bin目录
然后下载这个winutils.exe东西
百度网盘链接
提取码:2777
下载完把winutils.exe放到/hadoop/bin/目录下
然后去配置环境变量
在这里插入图片描述
然后重启电脑,不然会不成功

import org.apache.spark.rdd.RDD
import org.apache.spark.{
     SparkConf, SparkContext}

object Demo1WordCount {
     
  def main(args: Array[String]): Unit = {
     

    // Spark配置文件对象
    val conf: SparkConf = new SparkConf()
    // 设置Spark程序的名字
    conf.setAppName("Demo1WordCount")
    // 设置运行模式为local模式 即在idea本地运行
    // local : 一个并行度
    // local[2] : 两个并行度
    // local[*] : 有多少用多少
    conf.setMaster("local[2]")

    // Spark的上下文环境,相当于Spark的入口
    val sc: SparkContext = new SparkContext(conf)

    // 词频统计
    // 1、读取文件
    /**
     * RDD : 弹性分布式数据集(可以先当成scala中的集合去使用)
     */
    val linesRDD: RDD[String] = sc.textFile("spark/data/words",4)

    // 2、将每一行的单词切分出来
    // flatMap: 在Spark中称为 算子
    // 算子一般情况下都会返回另外一个新的RDD
    val wordsRDD: RDD[String] = linesRDD.flatMap(line => line.split(","))

    // 3、按照单词分组
    val groupRDD: RDD[(String, Iterable[String])] = wordsRDD.groupBy(word => word)

    // 4、统计每个单词的数量
    val countRDD: RDD[String] = groupRDD.map(kv => {
     
      val word: String = kv._1
      val words: Iterable[String] = kv._2
      // words.size直接获取迭代器的大小
      // 因为相同分组的所有的单词都会到迭代器中
      // 所以迭代器的大小就是单词的数量
      word + "," + words.size
    })

    // 5、将结果进行保存
    countRDD.saveAsTextFile("spark/data/wordCount")


//  2,3,4步也可以用reduceBykey写成下面格式,就不拆开写了直接链式调用
//val wordsRDD = linesRDD
//      .flatMap(line=>line.split(","))
//      .map(word=>(word,1))
//      .reduceByKey(_+_)
//  }

}

提交到虚拟机集群去运行(yarn)

用spark写WordCount(本地运行,提交到yarn运行)_第1张图片

提交到yarn运行有两种:
1.yarn-client 适用于学习和测试时使用,会打印一堆日志
2.yarn-cluster 一般用于开发使用

object Demo2WordCountSubmit {
     
  /**
   * 1、去除setMaster("local")
   * 2、修改文件的输入输出路径(因为提交到集群默认是从HDFS获取数据,需要改成HDFS中的路径)
   * 3、在HDFS中创建目录
   * hdfs dfs -mkdir -p /spark/data/words/
   * 4、将数据上传至HDFS
   * hdfs dfs -put words.txt /spark/data/words/
   * 5、将程序打成jar包
   * 6、将jar包上传至虚拟机,然后通过spark-submit提交任务
   * 
   * 打印日志yarn-client
   * spark-submit --class com.shujia.Demo2WordCountSubmit --master yarn-client spark-1.0.jar
   * 
   * 不打印日志yarn-cluster(推荐)
   * spark-submit --class com.shujia.Demo2WordCountSubmit --master yarn-cluster spark-1.0.jar
   * 运行完了想查看日志命令
   * yarn logs -applicationId 你的进程id
   */
  def main(args: Array[String]): Unit = {
     

    // Spark配置文件对象
    val conf: SparkConf = new SparkConf()
    // 设置Spark程序的名字
    conf.setAppName("Demo2WordCountSubmit")


    // Spark的上下文环境,相当于Spark的入口
    val sc: SparkContext = new SparkContext(conf)

    // 词频统计
    // 1、读取文件
    /**
     * RDD : 弹性分布式数据集(可以先当成scala中的集合去使用)
     */
    val linesRDD: RDD[String] = sc.textFile("/spark/data/words")

    // 2、将每一行的单词切分出来
    // flatMap: 在Spark中称为 算子
    // 算子一般情况下都会返回另外一个新的RDD
    val wordsRDD: RDD[String] = linesRDD.flatMap(line => line.split(","))


    // 3、按照单词分组
    val groupRDD: RDD[(String, Iterable[String])] = wordsRDD.groupBy(word => word)

    // 4、统计每个单词的数量
    val countRDD: RDD[String] = groupRDD.map
    (kv => {
     
      val word: String = kv._1
      val words: Iterable[String] = kv._2
      // words.size直接获取迭代器的大小
      // 因为相同分组的所有的单词都会到迭代器中
      // 所以迭代器的大小就是单词的数量
      word + "," + words.size
    })
    //下面的注释内容可以代替groupRDD.map后内容即
//  val countRDD: RDD[String] = groupRDD.map
//    {
     
//      case(word:String, words)=>{
     
//        word+":"+words.size
//      }
//    }


    // 使用HDFS的JAVA API判断输出路径是否已经存在,存在即删除
    val hdfsConf: Configuration = new Configuration()
    hdfsConf.set("fs.defaultFS", "hdfs://master:9000")
    val fs: FileSystem = FileSystem.get(hdfsConf)
    // 判断输出路径是否存在
    if (fs.exists(new Path("/spark/data/wordCount"))) {
     
      fs.delete(new Path("/spark/data/wordCount"), true)
    }

    // 5、将结果进行保存
    countRDD.saveAsTextFile("/spark/data/wordCount")

  }

}

集群的standalone模式去公司一般用不到,公司有Hadoop集群了就会用yarn模式,没必要去部署两套集群

你可能感兴趣的:(spark,spark,yarn,scala)