10. spark学习之旅之sbt(四)

1. 依赖jar包的查找地址 Maven Repository仓库

2. scala中的项目管理工具sbt

sbt是类似ANT、MAVEN的构建工具,全称为Simple build tool,是Scala事实上的标准构建工具

2.1.软件安装和配置

  • sbt官网

  • Scala sbt的下载及安装

  • Linux安装sbt,修改镜像参照windows平台的方法

  • 通过sbt管理项目,要在build.properties中的版本改成与本地安装一直,不然会用idea自己捆绑的
    在这里插入图片描述

  • windows下安装配置sbt (重要)

    • 安装软件到位置:D:\dev\sbt

    • sbt安装目录下的conf目录中添加了一个repo.properties文件

      [repositories]
        local
        maven-local:file://D:/apache-maven-3.5.4/local_repository
        nexus-aliyun: https://maven.aliyun.com/nexus/content/groups/public/
        nexus-aliyun-apache: https://maven.aliyun.com/nexus/content/repositories/apache-snapshots/
        mapr-public: https://maven.aliyun.com/repository/mapr-public/
        typesafe: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
        huaweicloud-maven: https://repo.huaweicloud.com/repository/maven/
        sbt-plugin-repo: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
      
      
    • sbtconfig.txt配置

      -Dsbt.ivy.home=d:/sbt/.ivy2
      -Dsbt.global.base=d:/sbt/.sbt
      -Dsbt.repository.config=d:/sbt/conf/repo.properties
      -Dsbt.boot.directory=d:/sbt/.sbt/boot/
      -Dsbt.override.build.repos=true
      
    • IDEA当中的配置
      在这里插入图片描述
      在这里插入图片描述

  • IDEA中创建maven工程后没有scala文件

    • 注意1:第一次输入sbt的时候需要准备一些东西,所以下载比较慢,主要下载内容已经放到了我的百度云盘:windows10平台,.ivy2和.sbt默认在c盘用的家目录下面,建议配置到自己的安装目录下面,方便管理
    • 注意2:遇到了一个错误There may be incompatibilities among your library dependencies; run 'evicted
      • 解决: 需要把C:\Users\59404\AppData\Local\Temp目录下的内容清理一下,由于安装了多个版本导致。
    • .ivy2和.sbt百度云链接;提取码 dxoj
      在这里插入图片描述

2.2. sbt官网案例

3. sbt进阶

3.1. 操作符

  • := 是给key分配一个初始表达式,覆盖原来的任何配置
  • += 是追加一个值到key
  • ++= 是追加一个队列,队列中放值,将值追加到key

3.2. task,里面可以定义task,task可以是执行外部的命令

  • 案例一

    // 定义了task的类型为Unit,Key值叫helloTask
    val helloTask = taskKey[Unit]("say hello")
    
    helloTask := {
      print("hello task!")
    }
    

    在这里插入图片描述

  • 案例二(task之间没有依赖关系

    val helloTask = taskKey[String]("say hello")
    val hiTask = taskKey[String]("say hi")
    val byeTask = taskKey[String]("say bye")
    
    val runAllTask = taskKey[Unit]("run all")
    
    runAllTask := {
      println(helloTask.value)
      println(hiTask.value)
      println(byeTask.value)
    }
    
    helloTask := {
      val hello = "hello"
      println(s"hello task run: $hello")
      Thread sleep 2000
      hello
    }
    
    hiTask := {
      val hi = "hi"
      println(s"hi task run: $hi")
      Thread sleep 2000
      hi
    }
    
    byeTask := {
      val bye = "bye"
      println(s"bye task run: $bye")
      Thread sleep 2000
      bye
    }
    

    在这里插入图片描述

  • 案例三(有依赖关系

    val helloTask = taskKey[String]("say hello")
    val hiTask = taskKey[String]("say hi")
    val byeTask = taskKey[String]("say bye")
    
    val runAllTask = taskKey[Unit]("run all")
    
    runAllTask := {
      println(helloTask.value)
      println(hiTask.value)
      println(byeTask.value)
    }
    
    helloTask := {
      val hello = "hello"
      println(s"hello task run: $hello")
      Thread sleep 2000
      hello
    }
    
    hiTask := {
      val hi = "hi"
      println(s"hi task run: $hi")
      Thread sleep 2000
      hi
    }
    
    byeTask := {
      val hi = hiTask.value
      val bye = "bye"
      println(s"hi task run: $hi")
      println(s"bye task run: $bye")
      Thread sleep 2000
      bye
    }
    

    在这里插入图片描述

  • 结论

    • 在没有依赖关系的时候是并行,但有依赖关系就是串行,如果我们再设置hi依赖hello,那么就是6s
    • 如果互相依赖可能造成死锁,比如a依赖b的value,b里面又依赖a的value,那么就是鸡生蛋和蛋生鸡的问题了
  • 详细链接

3.3. 待完善

4. spark之rdd小案例(sbt构建

4.1. PV计算

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

object PV {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("pv").setMaster("local[2]")
    val sc = new SparkContext(conf)

    val result: RDD[(String, Int)] = sc.textFile("D:\\access.log").map(x => ("pv", 1)).reduceByKey(_ + _)
    result.foreach(println)

  }
}


4.2. UV计算

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

object UV {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("pv").setMaster("local[2]")
    val sc = new SparkContext(conf)

    val result: RDD[(String, Int)] = sc.textFile("D:\\access.log").map(_.split(" ")).map(x => x(0)).distinct().map(x => ("uv", 1)).reduceByKey(_+_)
    result.foreach(println)

  }
}

4.3. TOPN

  • 数据格式
    在这里插入图片描述
import org.apache.spark.{SparkConf, SparkContext}

object TopN {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("pv").setMaster("local[2]")
    val sc = new SparkContext(conf)

    val result: Array[(String, Int)] = sc.textFile("access.log").map(_.split(" ")).map(x => x(10)).map((_, 1)).reduceByKey(_ + _).sortBy(_._2, false).take(3)
    println(result)
  }
}

5. 所有命运赠送的礼物,早已在暗中标着价格。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值