Spark Streaming(二)

news2024/11/30 0:26:17

声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

B站:https://space.bilibili.com/1523287361 点击打开链接
微博地址: https://weibo.com/luoyepiaoxue2014 点击打开链接



title: Spark系列


一、Transformation 高级算子

官网链接: https://spark.apache.org/docs/3.1.2/streaming-programming-guide.html#transformations-on-dstreams

1.1 updateStateByKey

在这里插入图片描述

updateStateByKey可以实现累计

package com.aa.sparkscala.streaming

import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.ReceiverInputDStream
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * @Author AA
 * @Project bigdatapre
 * @Package com.aa.sparkscala.streaming
 */
object UpdateStateByKeyDemo {
  def main(args: Array[String]): Unit = {
    /**
     * 1、程序入口
     */
    Logger.getLogger("org").setLevel(Level.ERROR)
    val conf = new SparkConf()
    conf.setMaster("local[2]")
    conf.setAppName("UpdateStateByKeyDemo")
    val ssc = new StreamingContext(conf,Seconds(2))
    ssc.checkpoint("D://UpdateStateByKeyDemo_CheckPointDir")
    /**
     * 2、数据的输入
     */
    val myDStream: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop12",9991)
    /**
     * 3、数据的处理
     */
    val wordDStream = myDStream.flatMap(_.split(" "))//hadoop hadoop hadoop
    val wordAndOneDStream = wordDStream.map((_,1))

    /**
     * updateFunc: (Seq[V], Option[S]) => Option[S]
     * 参数一:Seq[V]
     * hadoop 1
     * hadoop 1
     * hadoop 1
     * 分组:
     * {hadoop,(1,1,1)} -> values  (1,1,1)
     *
     * 参数二: Option[S]
     * 当前的这个key的上一次的状态(历史的状态)
     *
     * Option:
     * Some 有值
     * None 没有值
     * 返回值:
     * 当前key出现的次数
     *
     */
    var resultDStream = wordAndOneDStream.updateStateByKey((values: Seq[Int], state: Option[Int]) => {
      val currentCount = values.sum
      val lastCount = state.getOrElse(0)
      Some(currentCount + lastCount)
    })

    /**
     * 4、数据的输出
     */
    resultDStream.print()

    /**
     * 5、启动程序
     */
    ssc.start()
    ssc.awaitTermination()
    ssc.stop()
  }

}

1.2 mapWithState

代码

package com.aa.sparkscala.streaming
import org.apache.log4j.{Level, Logger}
import org.apache.spark.streaming._
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author AA
 * @Project bigdatapre
 * @Package com.aa.sparkscala.streaming
 *
 * MapWithStateAPIDemo 测试
 *
 * updateStateBykey 官网上能看到
 * mapWithState 官方博客上面有,而且说测试过性能更好
 */
object MapWithStateAPIDemo {
  def main(args: Array[String]): Unit = {
    Logger.getLogger("org").setLevel(Level.ERROR)

    val sparkConf = new SparkConf().setAppName("NetworkWordCount").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val ssc = new StreamingContext(sc, Seconds(2))

    ssc.checkpoint("D://MapWithStateAPIDemo_CheckPointDir")

    val lines = ssc.socketTextStream("hadoop12", 9992)

    val words = lines.flatMap(_.split(" "))
    val wordsDStream = words.map(x => (x, 1))

    val initialRDD = sc.parallelize(List(("flink", 100L), ("spark", 50L))) //初始的一些值

    /**示例,假如输入 hadoop hadoop hadoop
     * 切分之后变成了:
     * hadoop 1
     * hadoop 1
     * hadoop 1
     *
     * 经过 mapWithState 里面的bykey操作 之后,变成了如下:
     * {hadoop,(1,1,1)  => 3}
     *
     *  hadoop 3
     *
     *  hadoop 10
     *
     * key:hadoop  当前的key
     * value:3  当前的key出现的次数
     * lastState: 当前的这个key的历史的状态
     *
     * hadoop:3
     *
     * hadoop,10
     *
     * hadoop,13
     *
     */
    // currentBatchTime :  表示当前的Batch的时间
    // key:     表示需要更新状态的key
    // value:   表示当前batch的对应的key的对应的值
    // lastState :   对应key的当前的状态
    val stateSpec =StateSpec.function((currentBatchTime: Time, key: String, value: Option[Int], lastState: State[Long]) => {

      val sum = value.getOrElse(0).toLong + lastState.getOption.getOrElse(0L) //求和

      val output = (key, sum)
      //更改状态
      //如果你的数据没有超时
      if (!lastState.isTimingOut()) {
        lastState.update(sum)
      }
      //最后一行代码是返回值
      Some(output) //返回值要求是key-value类型
    }).initialState(initialRDD)
      .numPartitions(2).timeout(Seconds(15))
    //timeout:超时。 当一个key超过这个时间没有接收到数据的时候,这个key以及对应的状态会被移除掉。也就是重新统计。

    /**
     * reduceByKey
     *
     * udpateStateByKey
     * mapWithState // 里面也有bykey操作 -> 在bykey分组的时候顺带就完成了合并的操作
     */
    val result = wordsDStream.mapWithState(stateSpec)
    //result.print() //打印出来发生变化的那些数据
    result.stateSnapshots().print()  //打印出来的是全量的数据

    //启动Streaming处理流
    ssc.start()
    ssc.awaitTermination()
    ssc.stop()
  }

}

1.3 Transform实现黑名单过滤

package com.aa.sparkscala.streaming
import org.apache.log4j.{Level, Logger}
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.dstream.DStream
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
 * @Author AA
 * @Project bigdatapre
 * @Package com.aa.sparkscala.streaming
 */
object TransformDemo {
  def main(args: Array[String]): Unit = {
    //0、打印日志
    Logger.getLogger("org").setLevel(Level.WARN)
    //1、程序入口
    val sparkConf = new SparkConf().setAppName("TransformDemo").setMaster("local[*]")
    val sc = new SparkContext(sparkConf)
    val ssc = new StreamingContext(sc, Seconds(2))

    //2、数据的输入
    val lines = ssc.socketTextStream("hadoop12", 9993)
    lines.print()

    val words = lines.flatMap(_.split(" "))
    val wordsDStream = words.map(x => (x, 1))

    /**
     * 3、数据的处理
     *
     * 首先要获取到黑名单,企业中可以从Mysql,Redis里面去获取。
     * 我们这里 造一个  黑名单的的规则
     * 其实也就是一个 过滤的小小的规则
     * 比如: "$","?","!"
     */
    val filterRDD: RDD[(String, Boolean)] = ssc.sparkContext.parallelize(List("$","?","!")).map((_,true))
    //1、给过滤的规则数据广播出去
    val filterBroadBast = ssc.sparkContext.broadcast(filterRDD.collect())
    //mapRDD
    val filterResultRDD: DStream[(String, Int)] = wordsDStream.transform(rdd => {
      val filterRDD = ssc.sparkContext.parallelize(filterBroadBast.value)
      //左连接 join,如果join不上的数据  大家可以想一下是不是需要的数据
      /**
       * (String(key), (Int(1), Option[Boolean]))
       * 通过这个option没值 来进行判断
       */
      val result: RDD[(String, (Int, Option[Boolean]))] = rdd.leftOuterJoin(filterRDD)
      val joinResult = result.filter(tuple => {
        tuple._2._2.isEmpty //过滤出来我们需要的数据
      })
      //在Scala里面最后一行就是方法的返回值  这个都是小知识  大家应该知道
      //hadoop,1
      joinResult.map(tuple => (tuple._1, tuple._2._1))
    })

    //4、数据的输出
    val result = filterResultRDD.reduceByKey(_+_)
    result.print()

    //5、启动 程序
    ssc.start()
    ssc.awaitTermination()
    ssc.stop()

  }
}

1.4 Window操作

1.4.1 代码

package com.aa.sparkscala.streaming

import org.apache.log4j.{Level, Logger}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author AA
 * @Project bigdatapre
 * @Package com.aa.sparkscala.streaming
 */
object WindowDemo {
  def main(args: Array[String]): Unit = {
    //0、打印日志
    Logger.getLogger("org").setLevel(Level.WARN)

    //1、程序入口
    val sparkConf = new SparkConf().setAppName("WindowDemo").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val ssc = new StreamingContext(sc, Seconds(2))

    //2、数据的输入
    val lines = ssc.socketTextStream("hadoop12", 9994)

    //3、数据的处理
    val words = lines.flatMap(_.split(" "))
    val wordsDStream = words.map(x => (x, 1))
    /**
     * reduceFunc: (V, V) => V,
     * windowDuration: Duration,
     * slideDuration: Duration 滑动窗口的单位
     *
     * 请注意:窗口大小和滑动间隔必须是间隔的整数倍
     * 间隔: val ssc = new StreamingContext(sc, Seconds(2))
     * 窗口大小: Seconds(6)
     * 滑动间隔: Seconds(4)
     *
     * 下面的代码的意思是 每隔2秒计算一下,最近6秒的单词出现的次数。
     * reduceByKeyAndWindow((x:Int,y:Int) => x+y,Seconds(6),Seconds(1))
     */
    val result = wordsDStream.reduceByKeyAndWindow((x:Int,y:Int) => x+y,Seconds(6),Seconds(4))

    //4、数据的输出
    result.print()

    //5、程序的启动
    ssc.start()
    ssc.awaitTermination()
    ssc.stop()
  }
}

1.4.2 可能遇到的错误及解决方案

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Exception in thread "main" java.lang.Exception: The slide duration of windowed DStream (3000 ms) must be a multiple of the slide duration of parent DStream (2000 ms)
	at org.apache.spark.streaming.dstream.WindowedDStream.<init>(WindowedDStream.scala:41)
	at org.apache.spark.streaming.dstream.DStream.$anonfun$window$1(DStream.scala:768)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
	at org.apache.spark.SparkContext.withScope(SparkContext.scala:786)
	at org.apache.spark.streaming.StreamingContext.withScope(StreamingContext.scala:264)
	at org.apache.spark.streaming.dstream.DStream.window(DStream.scala:768)
	at org.apache.spark.streaming.dstream.PairDStreamFunctions.$anonfun$reduceByKeyAndWindow$4(PairDStreamFunctions.scala:277)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
	at org.apache.spark.SparkContext.withScope(SparkContext.scala:786)
	at org.apache.spark.streaming.StreamingContext.withScope(StreamingContext.scala:264)
	at org.apache.spark.streaming.dstream.PairDStreamFunctions.reduceByKeyAndWindow(PairDStreamFunctions.scala:278)
	at org.apache.spark.streaming.dstream.PairDStreamFunctions.$anonfun$reduceByKeyAndWindow$2(PairDStreamFunctions.scala:233)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
	at org.apache.spark.SparkContext.withScope(SparkContext.scala:786)
	at org.apache.spark.streaming.StreamingContext.withScope(StreamingContext.scala:264)
	at org.apache.spark.streaming.dstream.PairDStreamFunctions.reduceByKeyAndWindow(PairDStreamFunctions.scala:233)
	at com.aa.sparkscala.streaming.WindowDemo$.main(WindowDemo.scala:36)
	at com.aa.sparkscala.streaming.WindowDemo.main(WindowDemo.scala)

Process finished with exit code 1

出现上面的错误的原因是因为窗口大小和滑动间隔必须是间隔的整数倍

  例如:
     * 间隔: val ssc = new StreamingContext(sc, Seconds(2))
     * 窗口大小: Seconds(6)
     * 滑动间隔: Seconds(4)

1.5 关于测试nc -lk的说明

在测试的时候可以在linux中使用nc -lk进行模拟数据的输入

[root@hadoop12 ~]# nc -lk 9992
flink
hbase
hadoop
....

二、Output 高级算子

拿核心算子讲解

2.1 foreachRDD

2.1.1 添加pom依赖

这是因为我们要给测试的输出的结果添加到mysql中去。所以要添加mysql的相关依赖。

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

2.1.2 代码

package com.aa.sparkscala.streaming
import org.apache.log4j.{Level, Logger}

import java.sql.DriverManager
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
/**
 * @Author AA
 * @Project bigdatapre
 * @Package com.aa.sparkscala.streaming
 *
 * ForeachDemo 多种案例
 */
object ForeachDemo {
  def main(args: Array[String]) {
    //0、打印日志
    Logger.getLogger("org").setLevel(Level.WARN)

    //1、程序入口
    val sparkConf = new SparkConf().setAppName("ForeachDemo").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val ssc = new StreamingContext(sc, Seconds(4))

    //2、数据的输入
    val lines = ssc.socketTextStream("hadoop12", 9995)

    //3、数据的处理
    val words = lines.flatMap(_.split(" "))
    val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)

    //4、数据的输出   将结果保存到Mysql 代码可以运行。
    wordCounts.foreachRDD { (rdd, time) =>

      rdd.foreach { record =>
        //为每一条数据都创建了一个连接。
        //连接使用完了以后就关闭。 频繁的创建和关闭连接。其实对数据性能影响很大。 这个就是可以优化的点  同学们自己考虑,自己动手解决
        //executor,worker
        Class.forName("com.mysql.jdbc.Driver")
        val conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spark", "root", "111111")
        val statement = conn.prepareStatement(s"insert into wordcount(ts, word, count) values (?, ?, ?)")
        statement.setLong(1, time.milliseconds.toLong)
        statement.setString(2, record._1)
        statement.setInt(3, record._2)
        statement.execute()
        statement.close()
        conn.close()
      }
    }

    //启动Streaming处理流
    ssc.start()
    //等待Streaming程序终止
    ssc.awaitTermination()
    ssc.stop()
  }

}

2.1.3 测试结果

在shell窗口中输入对应的数据

[root@hadoop12 ~]# nc -lk 9995
hello hadoop world spark flink hadoop hello hadoop

在这里插入图片描述

查看mysql中的结果

在这里插入图片描述

三、Checkpoint

package com.aa.sparkscala.streaming

import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.ReceiverInputDStream
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * @Author AA
 * @Project bigdatapre
 * @Package com.aa.sparkscala.streaming
 * 为了保证 Driver 的 HA
 */
object UpdateStateByKeyDemo {
  def main(args: Array[String]): Unit = {
    /**
     * 1、程序入口
     */
    Logger.getLogger("org").setLevel(Level.ERROR)
    val conf = new SparkConf()
    conf.setMaster("local[2]")
    conf.setAppName("UpdateStateByKeyDemo")
    val ssc = new StreamingContext(conf,Seconds(2))
    ssc.checkpoint("D://UpdateStateByKeyDemo_CheckPointDir")
    /**
     * 2、数据的输入
     */
    val myDStream: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop12",9996)
    /**
     * 3、数据的处理
     */
    val wordDStream = myDStream.flatMap(_.split(" "))//hadoop hadoop hadoop
    val wordAndOneDStream = wordDStream.map((_,1))

    /**
     * updateFunc: (Seq[V], Option[S]) => Option[S]
     * 参数一:Seq[V]
     * hadoop 1
     * hadoop 1
     * hadoop 1
     * 分组:
     * {hadoop,(1,1,1)} -> values  (1,1,1)
     *
     * 参数二: Option[S]
     * 当前的这个key的上一次的状态(历史的状态)0
     *
     * Option:
     * Some 有值
     * None 没有值
     * 返回值:
     * 当前key出现的次数
     *
     */
    var resultDStream = wordAndOneDStream.updateStateByKey((values: Seq[Int], state: Option[Int]) => {
      val currentCount = values.sum
      val lastCount = state.getOrElse(0)
      Some(currentCount + lastCount)
    })

    /**
     * 4、数据的输出
     */
    resultDStream.print()

    /**
     * 5、启动程序
     */
    ssc.start()
    ssc.awaitTermination()
    ssc.stop()
  }

}

四、SparkStreaming和SparkSQL整合

SparkStreaming和SparkSQL整合之后,就非常的方便,可以使用SQL的方式操作相应的数据。很方便。

package com.aa.sparkscala.streaming

import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * @Author AA
 * @Project bigdatapre
 * @Package com.aa.sparkscala.streaming
 */
object StreamAndSQLDemo {
  def main(args: Array[String]): Unit = {
    //0、打印日志
    Logger.getLogger("org").setLevel(Level.WARN)

    //1、程序入口
    val sparkConf = new SparkConf().setAppName("StreamAndSQLDemo").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val ssc = new StreamingContext(sc, Seconds(5)) //SS其实是准实时   flink是真正的实时

    //2、数据的输入
    val lines = ssc.socketTextStream("hadoop12", 9997)

    //3、数据的处理
    val words = lines.flatMap(_.split(" "))
    //  获取到一个一个的单词
    words.foreachRDD( rdd =>{
      val spark = SparkSession.builder().config(rdd.sparkContext.getConf).getOrCreate()
      import spark.implicits._
      // 隐式转换
      val wordDataFrame = rdd.toDF("word")
      // 注册一个临时视图
      wordDataFrame.createOrReplaceTempView("words")

      //4、数据的输出
      spark.sql("select word,count(*) as totalCount from words group by word")
        .show()
    })

    //5、程序的启动
    ssc.start()
    ssc.awaitTermination()
    ssc.stop()
  }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划算法(2)最长回文子串详解

文章目录最长回文字串动态规划代码示例前篇&#xff1a; &#xff08;1&#xff09;初识动态规划 最长回文字串 传送门&#xff1a; https://leetcode.cn/problems/longest-palindromic-substring/description/ 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 s &qu…

大数据学习:使用Java API操作HDFS

文章目录一、创建Maven项目二、添加依赖三、创建日志属性文件四、在HDFS上创建文件五、写入HDFS文件1、将数据直接写入HDFS文件2、将本地文件写入HDFS文件六、读取HDFS文件1、读取HDFS文件直接在控制台显示2、读取HDFS文件&#xff0c;保存为本地文件一、创建Maven项目 二、添加…

Spring Security 中重要对象汇总

前言 已经写了好几篇关于 Spring Security 的文章了&#xff0c;相信很多读者还是对 Spring Security 的云里雾里的。这是因为对 Spring Security 中的对象还不了解。本文就来介绍介绍一下常用对象。 认证流程 SecurityContextHolder 用户认证通过后&#xff0c;为了避免用…

【JavaWeb】Servlet系列 --- HttpServlet【底层源码分析】

HttpServlet一、什么是协议&#xff1f;什么是HTTP协议&#xff1f;二、HTTP的请求协议&#xff08;B -- > S&#xff09;1. HTTP的请求协议包括4部分&#xff08;记住&#xff09;2. HTTP请求协议的具体报文&#xff1a;GET请求3. HTTP请求协议的具体报文&#xff1a;POST请…

生成式模型和判别式模型

决策函数Yf(x)Y f(x)Yf(x)或者条件概率分布 P(Y∣X)P(Y|X)P(Y∣X) 监督学习的任务都是从数据中学习一个模型&#xff08;也叫做分类器&#xff09;&#xff0c;应用这一模型&#xff0c;对给定的输入xxx预测相应的输出YYY,这个模型的一般形式为:决策函数Yf(x)Y f(x)Yf(x)&…

java 每日一练(6)

java 每日一练(6) 文章目录单选不定项选择题编程题单选 1.关于抽象类与最终类&#xff0c;下列说法错误的是&#xff1f;   A 抽象类能被继承&#xff0c;最终类只能被实例化。   B 抽象类和最终类都可以被声明使用   C 抽象类中可以没有抽象方法&#xff0c;最终类中可以没…

Bean 管理(工厂bean)

IOC操作Bean 管理&#xff08;FactoryBean&#xff09; 下面是在Bean 管理&#xff08;工厂bean&#xff09;之前的学习&#xff0c;基于xml方式注入集合并实现 基于xml方式注入集合并实现 &#xff1a;http://t.csdn.cn/H0ipR Spring 有两种类型bean&#xff0c;一种普通bean…

第五章. 可视化数据分析分析图表—图表的常用设置2

第五章. 可视化数据分析分析图 5.2 图表的常用设置2 本节主要介绍图表的常用设置&#xff0c;设置标题和图例&#xff0c;添加注释文本&#xff0c;调整图表与画布边缘间距以及其他设置。 7.设置标题&#xff08;title&#xff09; 1).语法&#xff1a; matplotlib.pyplot.ti…

iOS15适配 UINavigationBar和UITabBar设置无效,变成黑色

今天更新了xcode13&#xff0c;运行项目发现iOS15以上的手机导航栏和状态栏之前设置的颜色等属性都不起作用了&#xff0c;都变成了黑色&#xff0c;滚动的时候才能变成正常的颜色&#xff0c;经确认得用UINavigationBarAppearance和UITabBarAppearance这两个属性对导航栏和状态…

开发SpringBoot+Jwt+Vue的前后端分离后台管理系统VueAdmin - 前端笔记

一个spring security jwt vue的前后端分离项目&#xff01;综合运用&#xff01; 关注公众号 MarkerHub&#xff0c;回复【 VueAdmin 】可以加群讨论学习、另外还会不定时安排B站视频直播答疑&#xff01; 首发公众号&#xff1a;MarkerHub 作者&#xff1a;吕一明 视频讲解&…

半年卖8万吨辣条,卫龙再闯IPO

“辣条大王”卫龙美味全球控股有限公司&#xff08;下称“卫龙”&#xff09;于11月23日重新递表&#xff0c;继续冲刺“辣条第一股”。 作为千禧一代撑起的童年“神话”&#xff0c;卫龙的上市之路却波折重重&#xff1b;它曾于2021年5月、2021年11月及此次重启IPO。 卫龙是…

线程池ThreadPoolExecutor

线程池的生命周期 private final AtomicInteger ctl new AtomicInteger(ctlOf(RUNNING, 0)); ThreadPoolExecutor使用一个ctl变量代表两个信息&#xff0c;线程池的运行状态 (runState) 和 线程池内有效线程的数量 (workerCount)&#xff0c;高三位表示状态。 workerCount&am…

MySQL 数据库存储引擎

目录 一、存储引擎简介 二、MyISAM存储引擎 1、MylSAM介绍 2、MyISAM表支持3种不同的存储格式 3、MylSAM的特点 4、MyISAM使用的生产场景 三、InnoDB存储引擎 1、InnoDB介绍 2、InnoDB的特点 3、InnoDB适用生产场景 4、MyISAM和InnoDB的区别 四、查看和修改存储引擎…

CloudAlibaba - Nacos服务注册与配置中心

文章目录一.CloudAlibaba简介1. 介绍2. 依赖3. 主要组件4. 资料文档二.Nacos服务注册与发现1. 简介2. Nacos安装3. Nacos服务注册3.1 注册服务生产者3.2 服务消费者注册和负载4. Nacos服务中心对比三.Nacos配置中心1. 基础配置搭建2. Nacos中添加配置信息2.1 Nacos中的匹配规则…

单商户商城系统功能拆解40—分销应用—分销设置

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

前端js传入Long类型精度丢失解决办法

目录 问题背景 解决过程 1.对比数据库数据 2.查询资料 解决方法 问题背景 在进行业务开发的 时候发现更新数据库中的一条数据没有成功&#xff0c;查看SQL日志发现SQL正常执行无错误信息&#xff0c;但是受影响行数为0&#xff0c;但是数据是从前端传过来的 &#xff0c;一…

面试官:MySQL explain你会关注哪些字段

编号字段名称字段说明值重要性1idSELECT查询序号&#xff0c;即为sql语句执行的顺序。数字越大越优先执行1、2、3...★★2select_typeselect类型&#xff0c;用于区分是普通查询、子查询或联合查询simple&#xff1a;简单的查询&#xff0c;不含子查询和联合查询primary&#x…

玩机搞机---卸载内置软件 无root权限卸载不需要的软件 安全卸载

目前的机型出厂都会自带一些内置软件。个别的还无法删除。各种弹窗广告 等等占用系统资源。操作卡顿。而很多卸载软件有需要root权限才可以运行。那么有没有方法可以无需root就可以卸载内置软件呢。答案是有的。而且方法很多。今天的帖子就列举一下常用的操作步骤 操作前了解的…

自己搭建网站【搭建网站】

现在搭建网站也不只是企业公司商家的专利&#xff0c;很多个人用户都想拥有属于自己的一个网站。那么怎么自己搭建网站呢&#xff1f;下面给大家简单说说。 一、申请域名 域名是访问网站的地址&#xff0c;这是必须要有的&#xff0c;可以在域名服务商网站上申请。申请域名需要…

科普-鸟哥私房菜中的“od -t oCc /etc/issue”的意思

文章摘录展示 看到这里是困惑的&#xff0c;毕竟看这里没有写oCc 的格式 既然文章不能找到答案&#xff0c;那么&#xff0c;我们看详细的说明吧&#xff08;man od&#xff09; 如图&#xff0c;想必我们应该很清楚了 &#xff0c;o[size] 对应的参数oC &#xff0c;就可以很…