专栏首页麒思妙想傻白甜,约不约?

傻白甜,约不约?

首先来介绍下,今天的主角“傻白甜”(SBT:Simple Build Tools), 其功能与 Maven 和 Gradle 类似。其是由 Scala 编写,对于新手入门不是太友好,如果只是写纯 Java 的 Bug ,大可不必和自己过不去,但是如果你经常使用 Spark 等大数据工具,还是有点必要学学使用的。而且 Sbt 默认会从一些奇奇怪怪的地方下载依赖,相信大家的第一次,都不会很美好( Sbt 的项目构建异常缓慢,而且还经常会失败),笔者也不例外,所以有了这篇文章,希望对你有些帮助。

提要:本文首先会介绍如果要使用sbt,需要完成那些配置,然后使用sbt,构建2个helloworld,一个基于akka的,一个是基于delta的。

配置全局仓库

在用户目录下,修改文件 C:\Users\dafei\.sbt\repositories , 如果没有,可以自行创建目录及文件。

添加内容:

[repositories]
local
ali: https://maven.aliyun.com/repository/central/
huaweicloud-maven: https://repo.huaweicloud.com/repository/maven/
maven-central: https://repo1.maven.org/maven2/
sbt-plugin-repo: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]

IDEA 配置

File -> Settings -> Build,Execution,Deployment -> Build Tools -> sbt

添加Vm参数 -Dsbt.override.build.repos=true , 也可以通过设置环境变量 SBT_OPTS="-Dsbt.override.build.repos=true" 实现。这里需要说明,如果需要指定自己的 sbt ,并不能像其他软件,设置倒跟目录就行,这里需要指定倒 bin 目录下的 sbt-launch.jar

编译一下,会发现舒爽很多了。

sbt 项目依赖

在使用 scala 的时候,大家一定要注意自己的sdk版本以及配置的依赖包的版本要一致,如果不符,就会出现各种奇怪的问题

libraryDependencies += "org.apache.spark" %% "spark-core" % "3.0.1"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"
libraryDependencies += "org.apache.spark" %% "spark-catalyst" % "3.0.1"
libraryDependencies += "org.apache.spark" %% "spark-streaming" % "3.0.1"

libraryDependencies += "io.delta" %% "delta-core" % "0.7.0"


libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.6.10"
libraryDependencies += "com.typesafe.akka" %% "akka-remote" % "2.6.10"
libraryDependencies += "com.typesafe.akka" %% "akka-stream" % "2.6.10"

akka

Akka是JAVA虚拟机平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言编写,同时提供了Scala和Java的开发接口。Akka处理并发的方法基于Actor模型,Actor之间通信的唯一机制就是消息传递。

Akka特点:

  1. 对并发模型进行了更高的抽象
  2. 是异步、非阻塞、高性能的事件驱动编程模型
  3. 是轻量级事件处理(1GB内存可容纳百万级别个Actor)
  4. 它提供了一种称为Actor的并发模型,其粒度比线程更小,你可以在系统中启用大量的Actor。
  5. 它提供了一套容错机制,允许在Actor出现异常时进行一些恢复或重置操作。
  6. Akka既可以在单机上构建高并发程序,也可以在网络中构建分布式程序,并提供位置透明的Actor定位服务。

代码案例:

package cn.datahub

import akka.actor.{Actor, ActorSystem, Props}

import scala.io.StdIn

class HelloActor extends Actor{
  // 重写接受消息的偏函数,其功能是接受消息并处理
  override def receive: Receive = {
    case "你好帅" => println("竟说实话,我喜欢你这种人!")
    case "丑八怪" => println("滚犊子 !")
    case "stop" => {
      context.stop(self) // 停止自己的actorRef
      context.system.terminate() // 关闭ActorSystem,即关闭其内部的线程池(ExcutorService)
    }
  }
}

object HelloActor {
  /**
   * 创建线程池对象MyFactory,用来创建actor的对象的
   */
  private val MyFactory = ActorSystem("myFactory")    //里面的"myFactory"参数为线程池的名称
  /**
   *     通过MyFactory.actorOf方法来创建一个actor,注意,Props方法的第一个参数需要传递我们自定义的HelloActor类,
   * 第二个参数是给actor起个名字
   */
  private val helloActorRef = MyFactory.actorOf(Props[HelloActor], "helloActor")

  def main(args: Array[String]): Unit = {
    var flag = true
    while(flag){
      /**
       * 接受用户输入的字符串
       */
      print("请输入您想发送的消息:")
      val consoleLine:String = StdIn.readLine()
      /**
       * 使用helloActorRef来给自己发送消息,helloActorRef有一个叫做感叹号("!")的方法来发送消息
       */
      helloActorRef ! consoleLine
      if (consoleLine.equals("stop")){
        flag = false
        println("程序即将结束!")
      }
      /**
       * 为了不让while的运行速度在receive方法之上,我们可以让他休眠0.1秒
       */
      Thread.sleep(100)
    }
  }
}

执行效果:

Delta Lake

Delta Lake 是一个存储层,为 Apache Spark 和大数据 workloads 提供 ACID 事务能力,其通过写和快照隔离之间的乐观并发控制(optimistic concurrency control),在写入数据期间提供一致性的读取,从而为构建在 HDFS 和云存储上的数据湖(data lakes)带来可靠性。Delta Lake 还提供内置数据版本控制,以便轻松回滚。

代码案例:

package cn.datahub

import io.delta.tables.DeltaTable
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.expr

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

    System.setProperty("hadoop.home.dir", "E:\\devlop\\workspace\\wanwansbt3")

    val spark = SparkSession.builder.appName("MyApp").master("local")
      //      .config("spark.jars.packages", "io.delta:delta-core_2.12:0.7.0")
      .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
      .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")
      .getOrCreate()

    // create table
//    val data = spark.range(0, 50)
//    data.write.format("delta").save("./data/delta-table")

    // load table
    val deltaTable = DeltaTable.forPath(spark, "./data/delta-table")
    deltaTable.toDF.show();

    // update
    deltaTable.update(
      condition = expr("id % 2 == 0"),
      set = Map("id" -> expr("id + 100"))
    )
    deltaTable.toDF.show()

  }
}

执行效果:

代码仓库 https://github.com/dafei1288/wanwansbt3

本文分享自微信公众号 - 麒思妙想(qicai1612),作者:dafei1288

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spark君第一篇图文讲解Delta源码和实践的文章

    Delta 原本是在 Databricks Runtime 里面的一个增值功能,在 spark + AI Summit 2019 大会上,官方以 Apache ...

    麒思妙想
  • 实战|一群人齐心协力解决了一个spark问题

    首先感谢 spark君 细心的整理,下文是早些时候在群里关于一个SparkSQL条件下推问题的实录,由于刚刚发表了一篇文章(Flink SQL vs Spark...

    麒思妙想
  • 如何让两个线程“系鞋带"

    前两天转了马士兵老师的《没错,我就是厕所所长!》,正好有朋友和我讨论一个线程打印的问题,于是今天就趁着周末们睡觉,写了个简单的实现。

    麒思妙想
  • spark-1.3.0的编译及三种运行模式的配置

    最近安装spark1.3.0并与Hadoop2.5.0集成,在Spark的历史资源管理中心没有找到对应的版本,而且在网上也没有找到对应版本的编译教程,于是只能根...

    z小赵
  • 数字图像放大算法

    上一篇推送中,为大家介绍了几种图像处理算法总结的方法,在本次推送中,二白继续为大家介绍余下的方法。

    小白学视觉
  • Python中的文本替换

    对于习惯了Java中的replace,Python的replace用起来有些不适应,因为后者不支持直接使用正则表达式。要实现通过正则表达式的替换,可以配合Pyt...

    py3study
  • 腾讯云上线版权登记服务啦!

    网易云音乐又出圈了 ? 最近,由于评论区的“丧文化”盛行,评论中大量充斥着现编故事、卖惨情怀,被网友群嘲为“网抑云阴乐”,为此,网易云音乐连忙推出“云村评论治...

    腾讯云DNSPod团队
  • 智能合约中常见的漏洞总结复现#技术创作101训练营#

    一个小朋友,他可以数着手指运算十以内的运算,比如 1+1=2,他可以用两个手指算出来,但是如果你问他 5+6 等于多少,他数完十个手指之后发现手指不够用了,就会...

    yichen
  • 用Python更加了解微信好友

    运行平台: Windows Python版本: Python3.6 IDE: Sublime Text

    王强
  • 聊一聊RPC

    随着近几年分布式、微服务架构的火热,RPC 在开发工作中使用的越来越多,也变的越来越重要。作为一个学生,在学校接触到的大多都是 SSM 这类单体应用,但实习后发...

    出其东门

扫码关注云+社区

领取腾讯云代金券