Java Spark例子程序

目錄

    • spark基礎&rdd
      • docs
      • RDD
      • spark架構
      • Spark 對比 hadoop MapReduce
      • spark maven依賴
    • Spark的checkpoint
    • transformations、shuffle、actions
      • reduceByKey的用法
      • groupByKey的用法
      • count / count distinct
    • 例子:單詞計數
    • 例子:一批人員年齡數據求平均(rdd)
    • 例子:求不同性別的最大/最小身高(Sql)
      • map/reduce求平均身高(rdd)

spark基礎&rdd

docs

docs: https://archive.apache.org/dist/spark/docs/3.1.1/

RDD

RDD(Resilient Distributed Dataset)叫做彈性分布式數據集,是 Spark 中最基本的數據抽象,它代表一個不可變、可分區、里面的元素可并行計算的集合。(不可變、自動容錯、位置感知性調度和可伸縮性)

RDD is a collection of elements partitioned across the nodes of the cluster that can be operated on in parallel

resilient 英[r??z?li?nt]
adj. 有彈性(或彈力)的;有適應力的;能復原的;可迅速恢復的;
  1. 一組分片(Partition),即數據集的基本組成單位。對于 RDD 來說,每個分片都會被一個計算任務處理,并決定并行計算的粒度。用戶可以在創建 RDD 時指定 RDD 的分片個數,如果沒有指定,那么就會采用默認值。默認值就是程序所分配到的 CPU Core 的數目。
  2. 一個計算每個分區的函數。Spark 中 RDD 的計算是以分片為單位的,每個 RDD 都會實現 compute 函數以達到這個目的。compute 函數會對迭代器進行復合,不需要保存每次計算的結果。
  3. RDD 之間的依賴關系。RDD 的每次轉換都會生成一個新的 RDD,所以 RDD 之間就會形成類似于流水線一樣的前后依賴關系。在部分分區數據丟失時,Spark 可以通過這個依賴關系重新計算丟失的分區數據,而不是對 RDD 的所有分區進行重新計算。
  4. 一個 Partitioner,即 RDD 的分片函數。當前 Spark 中實現了兩種類型的分片函數,一個是基于哈希的 HashPartitioner,另外一個是基于范圍的 RangePartitioner。只有對于于 key-value 的 RDD,才會有 Partitioner,非 key-value 的 RDD 的 Parititioner 的值是 None。Partitioner 函數不但決定了 RDD 本身的分片數量,也決定了 parent RDD Shuffle 輸出時的分片數量。
  5. 一個列表,存儲存取每個 Partition 的優先位置(preferred location)。對于一個 HDFS 文件來說,這個列表保存的就是每個 Partition 所在的塊的位置。按照“移動數據不如移動計算”的理念,Spark 在進行任務調度的時候,會盡可能地將計算任務分配到其所要處理數據塊的存儲位置。

spark架構

在這里插入圖片描述

  1. Driver(驅動程序)?: 作為應用程序的主控進程,負責解析用戶代碼、生成DAG(有向無環圖)并劃分Stage。
  2. Cluster Manager(集群管理器)?:管理集群資源,支持Standalone、YARN、Mesos和Kubernetes等模式
  3. Worker(工作節點)?:在集群節點上運行,負責啟動Executor進程并監控其狀態。??
  4. ?Executor(執行器):在Worker節點上執行具體任務,管理內存緩存和磁盤I/O,定期向Driver發送心跳。??
  5. ?Task(任務)?:最小執行單元,由Executor并行處理,每個Stage被拆分為多個Task。??

特點

  • 內存計算?:中間結果存儲在內存中,相比Hadoop MapReduce減少磁盤I/O,部分速度能提升10-100倍。??
  • 彈性分布式數據集(RDD)?:基礎數據結構,支持容錯和并行計算,通過Lineage(血統、依賴鏈、依賴關系)機制恢復數據。??
  • 多模式支持?:兼容批處理、流處理(Spark Streaming)、SQL查詢(Spark SQL)及機器學習(MLlib)。??

Spark 對比 hadoop MapReduce

spark例子參考:https://xie.infoq.cn/article/71e6677d03b59ce7aa5eec22a

在這里插入圖片描述
hadoop MapReduce參考:https://doctording.blog.csdn.net/article/details/78467216

對比hadoop MapReduce:
在這里插入圖片描述
Map:
在這里插入圖片描述
Reduce:
在這里插入圖片描述

spark maven依賴

<!-- Spark core --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.1.1</version></dependency><!-- Spark SQL --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.12</artifactId><version>3.1.1</version></dependency><!-- 如果需要使用 MLlib --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-mllib_2.12</artifactId><version>3.1.1</version></dependency>

Spark的checkpoint

spark 中 Checkpoint 的主要作用是斬斷 RDD 的依賴鏈。
Checkpoint 的兩種方式

  1. 可靠的將數據存儲在可靠的存儲引擎中,例如 HDFS。要將 RDD 緩存在本地 block manager 中,在 exquator中。如果 work 崩潰,數據消失。而 RDD 也能存儲在 HDFS 中,即一種 checkpoint 可靠的方式,即將 RDD 的數據緩存到 HDFS 中。
  2. 本地的將數據存儲在本地,稱為 Local checkpoint,較少使用,和 RDD 的區別比較小。本地存儲方式不太符合checkpoint 的思想。

https://developer.aliyun.com/article/1086764

https://developer.aliyun.com/article/1329824

transformations、shuffle、actions

transformation 英[?tr?nsf??me??n]
n. (徹底的)變化,改觀,轉變,改革;轉型;(用于南非)民主改革;

  • map
  • filter
  • flatMap
  • mapPartitions
  • mapPartitionsWithIndex
  • sample
  • union
  • intersection
  • distinct
  • groupByKey
  • reduceByKey
  • aggregateByKey
  • sortByKey
  • join
  • cogroup
  • cartesian
  • pipe
  • coalesce
  • repartition
  • repartitionAndSortWithinPartitions

shuffle 英[???fl]
v. 洗牌;洗(牌);拖著腳走;坐立不安;把(紙張等)變換位置,打亂次序;(笨拙或尷尬地)把腳動來動去;
n.洗牌;拖著腳走;曳步舞;

Operations which can cause a shuffle include repartition operations like repartition and coalesce, ‘ByKey operations (except for counting) like groupByKey and reduceByKey, and join operations like cogroup and join.


actions

  • collect()
  • count()
  • first()
  • take(n)
  • takeSample(withReplacement, num, [seed])
  • takeOrdered(n, [ordering])
  • saveAsTextFile(path)
  • saveAsSequenceFile(path)
  • saveAsObjectFile(path)
  • countByKey()
  • foreach(func)

reduceByKey的用法

值可合并的聚合操作

  • scala
val data = List(("a", 1), ("b", 2), ("a", 3), ("b", 4))
val rdd = sc.parallelize(data)
val result = rdd.reduceByKey(_ + _)  // 對相同key的值求和
result.collect().foreach(println)
  • 輸出
(a,4)
(b,6)

核心特點

  1. 本地聚合優化?:先在分區內合并數據(類似MapReduce的combiner),減少shuffle數據量?
  2. 函數要求?:聚合函數需滿足結合律(如加法、最大值等)
  3. 性能對比?:比groupByKey更高效,因后者不進行預聚合

典型場景

  1. 統計詞頻(單詞計數)
  2. 分組求和/求平均值
  3. 數據去重后的聚合計算

groupByKey的用法

Spark中的groupByKey是一個針對鍵值對RDD的核心轉換算子

核心機制

  1. 分組邏輯?:將相同key的所有value合并為迭代器(Iterable),輸出格式為(K, Iterable)。與reduceByKey不同,它僅進行分組而不執行聚合操作?
  2. 執行過程?:直接對全量數據進行shuffle,不進行本地預聚合,導致網絡傳輸量較大。例如處理(“a”,1), (“a”,2)會直接傳輸所有鍵值對,而reduceByKey會先在分區內合并為(“a”,3)再shuffle。

典型應用場景

  1. 需保留所有值的場景?:如統計每個用戶的完整行為序列
  2. 非聚合操作?:例如對分組后的值進行復雜處理(排序、去重等)

缺點

  1. 數據傾斜風險:單個key對應的value過多會導致OOM,如某key關聯百萬級記錄:使用reduceByKey或aggregateByKey替代(若允許預聚合);對傾斜key單獨處理(如加鹽分片)
  2. 內存消耗:未壓縮的迭代器對象會占用更多內存,建議配合mapValues轉換為緊湊數據結構

例子

val data = sc.parallelize(Seq(("a",1), ("b",2), ("a",3)))
val grouped = data.groupByKey()  // 輸出: (a, [1,3]), (b, [2])
grouped.foreach(println)

輸出

(a,CompactBuffer(1, 3))
(b,CompactBuffer(2))

count / count distinct

count:

  1. 觸發計算?:count是行動算子,會立即觸發作業執行
  2. 全量掃描?:默認會掃描全表數據,大數據集可能耗時較長。
  3. 優化建議?:
    • 對過濾后的數據統計(先filter再count)
    • 使用緩存(cache())避免重復計算
scala> val rdd = sc.parallelize(Seq(1, 2, 3))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[4] at parallelize at <console>:24scala> val total = rdd.count()  // 輸出:3
total: Long = 3scala>

  • count distinct例子
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;import java.util.Arrays;
import java.util.List;/*** @Author mubi* @Date 2025/8/14 23:39*/
public class Main {public static void main(String[] args) throws Exception {// 初始化SparkSessionSparkSession spark = SparkSession.builder().appName("countDistinct").master("local[*]").getOrCreate();// 定義SchemaStructType schema = new StructType(new StructField[]{DataTypes.createStructField("id", DataTypes.IntegerType, false),DataTypes.createStructField("fruit", DataTypes.StringType, false)});// 創建Row數據List<Row> data = Arrays.asList(RowFactory.create(1, "apple"),RowFactory.create(2, "banana"),RowFactory.create(3, "apple"),RowFactory.create(4, "orange"),RowFactory.create(5, "banana"));// 構建DataFrameDataset<Row> df = spark.createDataFrame(data ,schema);// 計算不同水果數量long distinctFruitsCount = df.select("fruit").distinct().count();System.out.println("Number of distinct fruits: " + distinctFruitsCount);spark.stop();}
}

例子:單詞計數

在這里插入圖片描述

  • java程序
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;import java.util.Arrays;
import java.util.List;/*** @Author mubi* @Date 2025/8/14 23:39*/
public class Main {public static void main(String[] args) throws Exception {// 創建Spark配置和上下文SparkConf conf = new SparkConf().setAppName("JavaWordCount").setMaster("local");JavaSparkContext sc = new JavaSparkContext(conf);// 讀取文本文件,這里使用Spark自帶的示例文本文件JavaRDD<String> input = sc.textFile("src/main/resources/words.txt");// 將每行文本拆分成單詞,并對單詞進行計數JavaRDD<String> words = input.flatMap(s -> Arrays.asList(s.split(" ")).iterator());JavaPairRDD<String, Integer> wordCounts = words.mapToPair(s -> new Tuple2<>(s, 1)).reduceByKey((a, b) -> a + b);// 收集結果并打印List<Tuple2<String, Integer>> output = wordCounts.collect();for (Tuple2<?,?> tuple : output) {System.out.println(tuple._1() + ": " + tuple._2());}// 關閉Spark上下文sc.close();}}
  • 輸入
hello how are you
fine
hello you
  • 輸出
are: 1
fine: 1
you: 2
how: 1
hello: 2

例子:一批人員年齡數據求平均(rdd)

  • java程序
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;/*** @Author mubi* @Date 2025/8/14 23:39*/
public class Main {public static void main(String[] args) throws Exception {SparkConf conf = new SparkConf();conf.setMaster("local");conf.setAppName("AvgAge");JavaSparkContext sc = new JavaSparkContext(conf);//剛從文件讀出來的RDD已經是一行一行的字符串,所以可以直接進行mapToPairJavaRDD<String> fileRDD = sc.textFile("src/main/resources/peopleAges.txt");final long peopleCnt = fileRDD.count();// map: <年齡,數量1>JavaPairRDD<Integer, Integer> ageOneRdd = fileRDD.mapToPair(new PairFunction<String, Integer, Integer>() {@Overridepublic Tuple2<Integer, Integer> call(String s) throws Exception {Integer age = Integer.parseInt(s.split("\\s+")[1]);return new Tuple2(age, 1);}});// reduce: <年齡,總數量>JavaPairRDD<Integer, Integer> ageCountRDD = ageOneRdd.reduceByKey((v1, v2) -> v1 + v2).sortByKey();ageCountRDD.saveAsTextFile("src/main/resources/ageAnalysis");//求總年齡和long totalAgeSum = ageCountRDD.map(tuple -> (long)tuple._1() * (long)tuple._2()).reduce((a, b) -> a + b);System.out.println("totalAgeSum:" + totalAgeSum + ",peopleCnt:" + peopleCnt);//求平均年齡System.out.println("all people avg age is:" + totalAgeSum * 1.0d / peopleCnt);}//生成年齡數據,格式"序號 年齡"public static void makeAgeData() throws IOException {File newFile = new File("src/main/resources/peopleAges.txt");if (newFile.exists()){newFile.delete();}newFile.createNewFile();FileWriter fw = new FileWriter(newFile,true);Random rand = new Random();for (int i = 1; i <= 1000000; i++) {fw.append(i + " " + (rand.nextInt(100) + 1) + "\n");fw.flush();}fw.close();System.out.println("makeAgeData finish");}
}

例子文件:

1 20
2 30
3 40
4 50
5 60
6 60
7 50
8 40

例子輸出

totalAgeSum:350, peopleCnt:8
all people avg age is:43.75

例子:求不同性別的最大/最小身高(Sql)

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;/*** @Author mubi* @Date 2025/8/14 23:39*/
public class Main {public static void main(String[] args) throws Exception {SparkSession spark = SparkSession.builder().appName("HeightAnalysis").master("local[*]").getOrCreate();Dataset<Row> df = spark.read().option("delimiter", " ").option("header", "false").csv("src/main/resources/peopleSexHeight.txt").toDF("id", "gender", "height").withColumn("height", functions.col("height").cast("int"));System.out.println("=== 數據 ===");df.show();// 男性身高統計Dataset<Row> maleStats = df.filter("gender = 'M'").agg(functions.max("height").alias("max_height"),functions.min("height").alias("min_height"));System.out.println("=== 男性身高統計 ===");maleStats.show();// 女性身高統計Dataset<Row> femaleStats = df.filter("gender = 'F'").agg(functions.max("height").alias("max_height"),functions.min("height").alias("min_height"));System.out.println("=== 女性身高統計 ===");femaleStats.show();spark.stop();}public static void makeData() throws IOException {File newFile = new File("src/main/resources/peopleSexHeight.txt");if (newFile.exists()){newFile.delete();}newFile.createNewFile();FileWriter fw = new FileWriter(newFile,true);Random rand = new Random();final int N = 1_000_000;for (int i = 1; i <= N; i++) {String gender = getRandomGender();int height = rand.nextInt(220);if (height < 100 && gender.equals("M")) {height = height + 100;}if (height < 100 && gender == "F") {height = height + 50;}fw.append(i + " " + gender + " " + height + "\n");fw.flush();}fw.close();System.out.println("makeAgeData finish");}static String getRandomGender() {Random rand = new Random();int randNum = rand.nextInt(2) + 1;if (randNum % 2 == 0) {return "M";} else {return "F";}}
}
  • 數據
1 M 153
2 F 64
3 M 107
4 F 83
5 F 131
6 M 174
7 F 86
8 M 115
9 M 191
10 F 208
  • 輸出
=== 男性身高統計 ===
+----------+----------+
|max_height|min_height|
+----------+----------+
|       191|       107|
+----------+----------+=== 女性身高統計 ===
+----------+----------+
|max_height|min_height|
+----------+----------+
|       208|        64|
+----------+----------+

附rdd:

 public static void main(String[] args) throws Exception {SparkConf conf = new SparkConf();conf.setMaster("local");conf.setAppName("maxMinHeight");JavaSparkContext sc = new JavaSparkContext(conf);//剛從文件讀出來的RDD已經是一行一行的字符串,所以可以直接進行mapToPairJavaRDD<String> dataRdd = sc.textFile("src/main/resources/peopleSexHeight.txt");// 處理男性數據JavaRDD<Integer> maleHeights = dataRdd.filter(line -> line.split(" ")[1].equalsIgnoreCase("M")).map(line -> Integer.parseInt(line.split(" ")[2]));// 處理女性數據JavaRDD<Integer> femaleHeights = dataRdd.filter(line -> line.split(" ")[1].equalsIgnoreCase("F")).map(line -> Integer.parseInt(line.split(" ")[2]));// 計算并打印結果System.out.println("男性最高身高: " + maleHeights.max(Comparator.naturalOrder()));System.out.println("男性最低身高: " + maleHeights.min(Comparator.naturalOrder()));System.out.println("女性最高身高: " + femaleHeights.max(Comparator.naturalOrder()));System.out.println("女性最低身高: " + femaleHeights.min(Comparator.naturalOrder()));}

map/reduce求平均身高(rdd)

public static void main(String[] args) throws Exception {SparkConf conf = new SparkConf();conf.setMaster("local");conf.setAppName("maxMinHeight");JavaSparkContext sc = new JavaSparkContext(conf);//剛從文件讀出來的RDD已經是一行一行的字符串,所以可以直接進行mapToPairJavaRDD<String> dataRdd = sc.textFile("src/main/resources/peopleSexHeight.txt");// 處理男性數據JavaRDD<Integer> maleHeights = dataRdd.filter(line -> line.split(" ")[1].equalsIgnoreCase("M")).map(line -> Integer.parseInt(line.split(" ")[2]));long count = maleHeights.count();// 計算總和和計數int totalHeight = maleHeights.reduce((a, b) -> a + b);// 計算并打印平均身高double average = (double) totalHeight / count;System.out.printf("男性平均身高: %.2f cm\n", average);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93382.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93382.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93382.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《代碼重生:楊蓉與62.webp》

《代碼重生&#xff1a;楊蓉與62.webp》2045年&#xff0c;星耀城。雨絲斜織在量子玻璃幕墻上&#xff0c;霓虹倒影如液態代碼流淌。楊蓉坐在“時光回溯實驗室”的終端前&#xff0c;面前懸浮著一行行泛黃的日志——那是從2018年GitHub快照中提取的原始構建記錄。她指尖輕點&am…

軟考 系統架構設計師系列知識點之雜項集萃(123)

接前一篇文章:軟考 系統架構設計師系列知識點之雜項集萃(122) 第227題 某公司欲開發一種工業機器人,用來進行汽車零件的裝配。公司的架構師經過分析與討論,給出了該機器人控制軟件的兩種候選架構方案:閉環控制和分層結構。以下對于這兩者候選框架的選擇路由,錯誤的是(…

Sonatype Nexus Repository Manager docker版本安裝

docker 網址 https://hub.docker.com/r/sonatype/nexus3 拉取鏡像 docker pull sonatype/nexus3創建docker docker run -d -p 8081:8081 --name nexus --restart always sonatype/nexus3查看密碼 docker exec nexus cat /nexus-data/admin.password導出docker image 鏡像 …

Java Stream API:讓業務數據處理更優雅

在 Java 業務開發中&#xff0c;我們經常需要對集合數據進行**篩選&#xff08;filter&#xff09;、轉換&#xff08;map&#xff09;、聚合&#xff08;collect&#xff09;**等操作。比如從一批結果中過濾出符合條件的記錄&#xff0c;就像這樣&#xff1a; 假數據&#xf…

Win11和Win10共享打印機提示709用添加Windows憑據來解決的小方法

我們在使用共享打印機打印文件時或者添加共享打印機的時候&#xff0c;遇到了系統提示錯誤709的問題&#xff0c;導致打印失敗、共享失敗&#xff0c;如果你現在正好也遇到了這一問題&#xff0c;那么不妨來看看下面吳師傅使用過的這個方法&#xff0c;希望可以能夠幫助大家有效…

【嵌入式STM32】I2C總結

I2C誕生于上世紀80年代初&#xff0c;由飛利浦&#xff08;現在的恩智浦NXP&#xff09;為解決微控制器與外圍芯片之間繁瑣的連接問題而設計。 僅僅兩根線——SCL&#xff08;時鐘線&#xff09;和SDA&#xff08;數據線&#xff09;&#xff0c;就能實現多設備間的雙向通信。 …

WPF 監控CPU、內存性能

本段代碼是一個封裝的用戶控件<UserControl x:Class"YF_Frame.PerformanceMonitor"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.…

Rust學習筆記(四)|結構體與枚舉(面向對象、模式匹配)

本篇文章包含的內容1 結構體1.1 定義和初始化結構體1.2 Tuple Struct1.3 結構體方法&#xff08;Rust 面向對象&#xff09;1.4 關聯函數2 枚舉2.1 定義和使用枚舉2.2 將數據附加到枚舉的變體中2.3 Option 枚舉2.4 模式匹配2.4.1 match語句2.4.2 if let語句1 結構體 1.1 定義和…

C++——分布式

文章目錄一、什么是分布式&#xff1f;核心特點為什么需要分布式&#xff1f;分布式 vs 集中式常見分布式場景挑戰與難點二、 簡述下CAP理論2.1 簡述2.2 詳細三、 簡述下分布式中的2PC2.1 詳細3.2 簡述三 、簡述下Raft協議3.1 詳細3.2 簡述四 grpc框架4.1 RPC&#xff08;Remot…

Redis面試精講 Day 20:Redis大規模部署性能調優

【Redis面試精講 Day 20】Redis大規模部署性能調優 開篇 歡迎來到"Redis面試精講"系列第20天&#xff01;今天我們將深入探討Redis在大規模部署場景下的性能調優策略&#xff0c;這是高級工程師和架構師面試必考的核心知識點。本文將從操作系統配置、Redis參數調優…

[微服務]ELK Stack安裝與配置全指南

目錄 一、ELK相關介紹 1.1 什么是ELK Stack 1.2 ELK核心組件與功能 1.3 ELK優勢 1.4 ES數據庫結構對比SqlServer 二、安裝ELK 2.1 window安裝 2.2 Docker下環境搭建 2.2.1 安裝7.16.3版本ElasticSearch 2.2.2 安裝7.16.3版本Kibana : 2.2.3 安裝8.0.0版本ElasticSea…

java項目怎么實現用戶行為分析、漏斗轉化、數據可視化報表。

在 Java 項目中實現用戶行為分析、漏斗轉化和數據可視化報表是一個系統性的工作&#xff0c;需要從數據采集、存儲、分析到展示的完整鏈路設計。以下是一個可行的實現方案&#xff1a;1. 整體架構設計建議采用分層架構&#xff1a;數據采集層&#xff1a;收集用戶行為數據數據存…

緩存元數據損壞操作步驟(lvmcache修復)

現象為:機械盤丟失cvol-cmeta卷如圖所示,lvm邏輯卷中缺失緩存的lvm,這邊以只讀cache為例日志現象報錯信息為:lvmcache_cvol failed manual repair required!lvmcache_cvol failed: manual repair required! 這類報錯&#xff0c;本質上是 LVM cache 池&#xff08;cache-pool&…

使用CMAKE-GUI生成Visual Studio項目

使用CMAKE-GUI生成Visual Studio項目第一種&#xff0c;如果我們想把以Cmake構建的項目移植VS上&#xff0c;就可以使用Cmake來生成.sln文件 準備生成的目錄文件先準備好我們要打包的源代碼等文件&#xff08;放在resource下&#xff09;使用cmake-gui工具來構建&#xff08;命…

20道DOM相關前端面試題

DOM 相關面試題及答案 什么是 DOM&#xff1f;DOM 樹的結構是怎樣的&#xff1f; DOM&#xff08;文檔對象模型&#xff0c;Document Object Model&#xff09;是 HTML/XML 文檔的編程接口&#xff0c;將文檔結構化為樹形節點集合&#xff0c;允許程序動態訪問和修改文檔內容、…

CVE-2021-4300漏洞復現

Adminer是一個PHP編寫的開源數據庫管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等數據庫。在其版本1.12.0到4.6.2之間存在一處因為MySQL LOAD DATA LOCAL導致的文件讀取漏洞。 一、偽造服務器 利用mysql-fake-serve…

【LeetCode題解】LeetCode 35. 搜索插入位置

【題目鏈接】 35. 搜索插入位置 【題目描述】 【題解】 通過題目可以知道這是一道經典的二分查找的題目&#xff0c;對于二分查找的題目&#xff0c;根據需要查找的兩個邊界點&#xff0c;分為兩個不同的模板&#xff0c;如下圖所示。 這道題要求在數組中查找目標值并返回其索…

RK3568 NPU RKNN(五):RKNN-ToolKit-lite2板端推理

文章目錄1、前言2、目標3、安裝RKNN-ToolKit-lite23.1、安裝環境3.2、安裝RKNN-ToolKit-lite23.3、驗證4、完整的測試程序5、運行測試程序6、程序拆解7、總結1、前言 本文僅記錄本人學習過程&#xff0c;不具備教學指導意義。 2、目標 之前提到過&#xff0c;RKNN-Toolkit2-…

二分查找。。

1 二分查找二分查找前提是數組有序。先令&#xff0c;left 0 , right 7mid (right left) / 2;如果mid的值大于要查找的值&#xff0c;則right mid - 1&#xff1b;如果小于&#xff0c;left mid 1&#xff1b;如果mid的值等于要查找的值&#xff0c;查找成功。重復步驟2…

Spring Ai 如何配置以及如何搭建

Spring Ai 如何配置以及如何搭建 解釋什么是Spring ai 首先&#xff0c;我們用Spring ai 其實不是去了解他的LLM,以及底層用的一些東西&#xff0c;Spring AI,提供給我們的其實是對各種大模型快速調用&#xff0c;提供了大模型API的作用&#xff0c;Spring AI 的核心定位是提…