当前位置: 首页 > news >正文

大数据面试题之Spark(5)

Spark SQL与DataFrame的使用?

Sparksql自定义函数?怎么创建DataFrame?

HashPartitioner和RangePartitioner的实现

Spark的水塘抽样

DAGScheduler、TaskScheduler、SchedulerBackend实现原理

介绍下Sparkclient提交application后,接下来的流程?

Spark的几种部署方式

在Yarn-client情况下,Driver此时在哪

Spark的cluster模式有什么好处

Driver怎么管理executor

Spark的map和flatmap的区别?

Spark的cache和persist的区别?它们是transformaiton算子还是action算子?

Saprk Streaming从Kafka中读取数据两种方式?

Spark Streaming的工作原理?

Spark Streaming的DStream和DStreamGraph的区别?


Spark SQL与DataFrame的使用?

Spark SQL 是 Apache Spark 中的一个重要模块,它允许用户使用 SQL 查询或者 DataFrame API 来处理结构化和半结构化数据。DataFrame 是 Spark SQL 的核心数据结构,它提供了一种类型安全且易于编程的方式来操作数据集,类似于关系型数据库中的表格,但具有分布式处理能力。下面简要介绍如何使用 Spark SQL 与 DataFrame:Spark SQL 的基本使用
1、初始化 SparkSession:
SparkSession 是 Spark SQL 的入口点,它整合了SQLContext和HiveContext的功能。首先,你需要创建一个 SparkSession 实例:

from pyspark.sql import SparkSessionspark = SparkSession.builder \.appName("Spark SQL Example") \.config("spark.some.config.option", "some-value") \.getOrCreate()

2、加载数据:
你可以从各种数据源(如CSV、JSON、Parquet文件或数据库)加载数据到 DataFrame:

df = spark.read.format("csv").option("header", "true").load("path/to/your/csv")

3、执行 SQL 查询:
一旦有 DataFrame,你可以直接在它上运行 SQL 查询:

df.createOrReplaceTempView("my_table")
sql_query_df = spark.sql("SELECT * FROM my_table WHERE condition")

4、DataFrame API 操作:
DataFrame API 提供了一系列丰富的函数来处理数据,比如筛选、排序、聚合等:

filtered_df = df.filter(df["column_name"] > 10)
grouped_df = df.groupBy("category").sum("amount")

5、数据写回:
处理完数据后,你可以将 DataFrame 保存回文件系统、数据库或其他数据源:

df.write.format("parquet").save("output/path")

DataFrame 的使用示例
1、创建 DataFrame:
除了从外部数据源加载,你还可以直接从 Python 列表、Pandas DataFrame 创建 DataFrame:

data = [("Alice", 34), ("Bob", 42)]
columns = ["name", "age"]
df = spark.createDataFrame(data, columns)

2、基本操作:
包括选择列、过滤行、排序、聚合等:

selected_df = df.select("name")
filtered_df = df.filter(df["age"] > 30)
sorted_df = df.sort("age")
aggregated_df = df.groupBy().mean("age")

3、转换和操作:
可以使用 DataFrame 的方法进行更复杂的转换,比如 join、union、withColumn 等。
显示和保存结果:
使用 show() 方法可以快速查看 DataFrame 的前几行数据,collect() 获取所有数据到驱动程序,write 方法则可以将 DataFrame 保存到文件或数据库。

df.show()
results = df.collect()
df.write.csv("output.csv")

通过以上步骤,你可以高效地使用 Spark SQL 和 DataFrame API 来分析和处理数据。记得在实际应用中根据具体需求调整配置和选择合适的操作。

Sparksql自定义函数?怎么创建DataFrame?

1、Spark SQL自定义函数(UDF)
自定义函数允许你在Spark SQL查询中使用自定义逻辑。以下是如何创建和使用一个简单的字符串转换UDF的例子:

import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.types.DataTypes// 定义一个简单的UDF,将输入字符串转换为大写
val toUpperCaseUDF = udf((input: String) => input.toUpperCase)// 假设已经有一个DataFrame df,现在可以使用这个UDF
val dfWithUppercase = df.withColumn("uppercase_column", toUpperCaseUDF($"original_column"))

在这个例子中,udf函数用于从普通的Scala函数创建Spark SQL的UDF,然后通过.withColumn方法将其应用于DataFrame的某一列。

创建DataFrame的几种方法
Spark提供了多种方式来创建DataFrame,以下是几种常用的方法:

1. 从RDD转换
如果你已经有了一个RDD,可以使用toDF或createDataFrame方法将其转换为DataFrame。

import spark.implicits._val rdd = spark.sparkContext.parallelize(Seq(("Alice", 30), ("Bob", 25)))
val dfFromRDD = rdd.toDF("name", "age")

或使用createDataFrame,通常需要指定DataFrame的架构:

import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{StructField, StructType}val schema = StructType(Seq(StructField("name", DataTypes.StringType, nullable = false),StructField("age", DataTypes.IntegerType, nullable = false)
))val dfFromRDDWithSchema = spark.createDataFrame(rdd.map(_.productIterator.toArray), schema)

2. 通过SparkSession的工厂方法
可以直接从集合创建DataFrame:

val data = Seq(("Alice", 30), ("Bob", 25))
val columns = Seq("name", "age")
val dfFromSeq = spark.createDataFrame(data).toDF(columns:_*)

3. 从外部数据源读取
可以直接从JSON、CSV、Parquet等文件格式中读取数据来创建DataFrame:

val dfFromFile = spark.read.json("path/to/json/file")

4. 使用反射机制(样例类)
对于Scala,可以通过定义样例类和使用反射自动推断DataFrame的模式:

case class Person(name: String, age: Int)val peopleRDD = spark.sparkContext.parallelize(Seq(Person("Alice", 30), Person("Bob", 25)))
import spark.implicits._
val dfFromCaseClass = peopleRDD.toDF()

HashPartitioner和RangePartitioner的实现

HashPartitioner和RangePartitioner是Spark中两种常见的分区器,它们分别采用不同的策略来确定数据如何被分配到不同的分区中。以下是关于这两种分区器实现的详细解析:

HashPartitioner
1. 原理

HashPartitioner的分区原理是基于给定的key计算其hashCode,并将该hashCode值除以分区的个数取余。如果余数小于0,则通过余数加上分区的个数来转为正数。最终返回的值就是这个key所属的分区ID。

2. 实现

1) HashPartitioner的源码在org.apache.spark包下。
2) 构造函数接收一个参数partitions,表示分区的数量。
3) getPartition方法是HashPartitioner的核心,它根据key的值返回对应的分区ID。
    如果key为null,则直接返回0分区。
    如果key非null,则使用Utils.nonNegativeMod(key.hashCode(), numPartitions)计算分区ID,确保结果是非负的。
4) 需要注意的是,HashPartitioner可能会导致每个分区中的数据量分布不均匀,极端情况下会导致某些分区拥有RDD的所有数据。
RangePartitioner
1. 原理

RangePartitioner的主要目的是尽量保证每个分区中数据量的均匀,并且分区和分区之间是有序的。它通过将一定范围内的数据映射到某个分区内来实现这一目标。

2. 实现

 1) RangePartitioner的实现主要分为两个步骤:

  1. 从整个RDD中抽取样本数据,将样本数据排序,计算出每个分区的最大key值,形成一个Array[K]类型的数组变量rangeBounds。
  2. 判断key在rangeBounds中所处的范围,给出该key值在下一个RDD中的分区ID下标。

 2) 该分区器要求RDD中的key类型必须是可排序的。
 3) sortByKey底层使用的数据分区器就是RangePartitioner分区器。
 4) RangePartitioner通过蓄水池抽样算法从RDD中抽取数据作为样本,然后根据这些样本来确定每个分区的边界。
 5) 在计算分区的边界时,如果分区数量较少(例如小于或等于128),则使用简单的暴力循环搜索;如果分区数量较多,则使用二分查找来提高效率。
总结
HashPartitioner和RangePartitioner各有特点:

  • HashPartitioner实现简单,但可能导致数据分布不均匀。
  • RangePartitioner则尽量保证数据分布均匀,并且分区之间有序,但实现相对复杂,且要求key可排序。

在Spark中,可以根据具体的应用场景和需求来选择合适的分区器。

Spark的水塘抽样

Spark的水塘抽样(Reservoir Sampling)是一种用于从大规模数据集中随机选择样本的算法,特别适用于当数据集太大而无法全部加载到内存或不适合排序时。以下是关于Spark水塘抽样的详细解释:

1. 基本原理
水塘抽样算法确保从数据流或数据集中随机选择元素时,每个元素被选中的概率相等。在Spark中,这种算法可以并行地在数据集的所有分区上执行,每个分区独立地进行抽样。

2. 实现步骤
水塘抽样的实现步骤如下:

 1) 初始化水塘:首先,创建一个大小为k的数组(或称为“水塘”)来存储被抽样的元素。如果数据集的前k个元素可以直接放入水塘中。
 2) 遍历数据集:对于数据集中的第i(i > k)个元素:
生成一个范围在1到i之间的随机数j。
如果j小于等于k,则用第i个元素替换水塘中的第j个元素;否则,不做任何操作。
结果输出:当遍历完整个数据集后,水塘中的元素即为抽样的结果。
3. 特点
 1) 随机性:每个元素被选中的概率相等,保证了抽样的随机性。
 2) 并行性:在Spark中,水塘抽样可以并行地在数据集的所有分区上执行,提高了效率。
 3) 内存效率:水塘抽样只需要固定数量的内存空间(即k个元素的空间),就可以完成大规模数据流的等概率抽样。
 4) 适用性:适用于大规模数据集,特别是当数据集太大以至于无法放入内存或不适合排序时。
4. 抽样比例
用户可以指定抽样比例,即希望从数据集中抽取的元素占总元素的比例。在Spark中,可以使用.sample方法进行水塘抽样,通过设置withReplacement参数为false来实现不放回的抽样。

5. 示例代码
在Spark中,可以使用以下示例代码进行水塘抽样:

val fraction = 0.1 // 定义抽样比例为10%  
val sampledDF = originalDF.sample(fraction, withReplacement = false) // 对originalDF进行水塘抽样

6. 注意事项
水塘抽样得到的是近似结果,适用于需要快速获得数据集特征的场景,如数据概览、快速分析等。
在使用水塘抽样时,需要注意抽样比例的选择,以及数据集的大小和特性,以确保抽样的准确性和有效性。

DAGScheduler、TaskScheduler、SchedulerBackend实现原理

Spark的作业调度体系主要由三个核心组件构成:DAGScheduler、TaskScheduler以及SchedulerBackend。它们共同协作,确保Spark应用程序高效、可靠地执行。下面是这三个组件的基本工作原理和职责:

DAGScheduler
DAGScheduler(有向无环图调度器)位于Spark的调度层次的较高层,它主要负责将用户提交的Spark作业转化为一系列的Stage,这些Stage构成了一个DAG(有向无环图)。DAGScheduler的工作流程包括:

1、解析作业:接收到用户的Spark作业后,DAGScheduler会分析RDD之间的依赖关系,将宽依赖(如shuffle)作为边界切分Stage。
2、Stage划分:基于RDD的依赖关系,将作业划分为多个Stage,每个Stage包含一组相同的任务(Task),这些任务可以并行执行。
3、任务调度:为每个Stage生成TaskSet(任务集),然后通过TaskScheduler接口提交给TaskScheduler。
4、优化执行计划:通过Catalyst优化器对执行计划进行优化,比如重用RDD、合并小任务等。
5、资源分配:虽然DAGScheduler不直接负责资源分配,但它通过与TaskScheduler的交互间接影响任务在Executor上的分配。
TaskScheduler
TaskScheduler(任务调度器)位于DAGScheduler之下,它是一个低级别的调度接口,负责将DAGScheduler生成的TaskSet进一步调度到各个Executor上执行。其主要职责包括:

1、任务分配:接收来自DAGScheduler的TaskSet,根据一定的策略(如FIFO、FAIR等)将任务分配到各个Executor上。
2、资源管理:与SchedulerBackend交互,了解Executor的状态和资源可用情况,以此为基础做任务分配。
3、任务跟踪与重试:监控Task的执行状态,处理Executor失败的情况,必要时重新调度失败的任务。
4、本地性优化:尽量将任务分配到数据所在的节点上,利用本地性原则减少网络IO,提升执行效率。
SchedulerBackend
SchedulerBackend(调度后端)是TaskScheduler与集群管理器(如YARN、Mesos或Standalone模式)之间的接口,负责Executor的启动、停止、注册以及资源请求。其主要功能包括:

1、Executor管理:根据TaskScheduler的需求,向集群管理器请求资源以启动Executor,同时管理Executor的生命周期。
2、资源请求与分配:向集群管理器发送资源请求,接收资源分配通知,为TaskScheduler提供可用的Executor信息。
3、心跳机制:与Executor保持心跳通信,监控Executor状态,及时发现和处理Executor的故障。
4、事件传递:作为消息通道,将Executor的事件(如Executor注册、任务完成、Executor失败等)传递给TaskScheduler。
综上所述,DAGScheduler负责高层次的逻辑划分和优化,TaskScheduler处理具体任务的分配与执行管理,而SchedulerBackend则是与底层资源管理器交互的桥梁,三者协同工作,确保Spark应用的高效执行。

介绍下Sparkclient提交application后,接下来的流程?

当Spark客户端提交一个application后,会经历一系列步骤来准备和执行该应用。以下是一个简化的流程概述:

1、启动SparkContext:

  • 首先,在application的代码中会创建一个SparkContext对象。这是Spark应用程序与集群交互的主要入口点,负责初始化Spark应用程序的运行环境,包括配置信息(如应用名称、主类、依赖库等)和连接集群管理器。

2、连接到集群管理器:

  • SparkContext会连接到集群管理器,如Standalone、YARN或Mesos。集群管理器负责资源的分配和监控。提交application时,用户需指定所使用的集群管理器。

3、资源分配:

  • 集群管理器根据application的资源请求(例如执行器的数量、内存大小、CPU核心数等)在集群中分配必要的资源。资源分配后,集群管理器启动相应数量的执行器(Executors)并在它们上面分配资源。

4、Executor初始化:

  • Executors初始化时会在各自的节点上启动,并与Driver建立连接。Executor是执行真正计算任务的进程,它们维护着计算和存储资源。

5、任务调度与执行:

  • SparkContext将应用程序代码和任务逻辑发送给Executor。
  • DAGScheduler负责将整个application划分为多个Stage,每个Stage包含多个可以并行执行的任务(Tasks)。这基于RDD之间的依赖关系来确定,以优化数据的计算和传输。
  • TaskScheduler将这些任务分配给各个Executor执行。它负责跟踪任务的执行进度,并在任务失败时重新安排任务。
  • Executors执行这些任务,任务之间可能涉及数据的Shuffle过程,即数据在Executor间重新分布以满足计算需求。

6、结果收集与应用结束:

  • 任务完成后,其结果会被返回给Driver,Driver可能进一步处理这些结果或直接输出。
  • 当application的所有任务都完成时,SparkContext会通知集群管理器释放资源,并最终关闭自身,标志着application执行结束。

这个过程涉及到了Spark的多个关键组件,包括SparkContext、DAGScheduler、TaskScheduler、Executor等,共同协作以高效、可靠地执行分布式计算任务。

Spark的几种部署方式

Spark的部署方式主要包括以下几种:

1、Local模式(本地单机模式):

  • 主要用于本地开发和测试。
  • 在该模式下,Spark会利用本地计算机的资源来执行计算任务。
  • 可以通过配置参数,如local[n]来指定使用多少个线程,其中n代表线程数。local[*]则表示使用所有可用的核心。

2、Standalone模式(集群单机模式):

  • Spark自带的资源管理框架,可以独立部署到一个集群中,无需依赖其他资源管理系统。
  • 该模式体现了经典的master-slave架构,包含一个Master节点和多个Slave节点(也称为Worker节点)。
  • Master节点负责接收来自客户端的提交任务,并分配给Worker节点执行。
  • 在这种模式下,集群可能会存在单点故障问题,可以通过配置Zookeeper等解决方案来增强容错性。

3、YARN模式(Spark on YARN):

  • 利用Hadoop YARN作为资源管理器来调度Spark作业。
  • YARN模式进一步分为YARN Cluster模式和YARN Client模式:
  • YARN Cluster:适用于生产环境,所有的资源调度和计算都在集群上运行。
  • YARN Client:适用于交互和调试环境。
  • YARN模式可以有效提高资源利用率,特别是在与Hadoop共享集群资源时。

4、Mesos模式(Spark on Mesos):

  • Mesos是一款开源的资源调度管理系统,可以为Spark提供服务。
  • 由于Spark与Mesos存在密切关系,因此Spark在Mesos上的运行更加灵活和自然。
  • 但如果同时运行Hadoop和Spark,从兼容性的角度来看,Spark on YARN可能是更好的选择。

5、Kubernetes模式:

  • Google开源的容器编排引擎,用于自动化部署、扩展和管理容器化应用程序。
  • Spark也支持在Kubernetes上进行部署,这允许更灵活和可移植的资源管理。

在Yarn-client情况下,Driver此时在哪

在Yarn-client模式下,Driver是在任务提交的客户端本地机器上运行。这意味着当用户通过spark-submit或者其他方式提交Spark应用时,Driver进程会启动在提交应用的那个机器上,并且会一直运行直到应用程序结束。Driver负责与YARN的ResourceManager进行通信,请求资源来启动ApplicationMaster,并进一步协调Executor的资源分配、任务调度与监控等工作。由于Driver与用户交互的进程在同一台机器上,因此这种方式适合于调试和交互式查询,因为它可以立即看到应用的输出。

Spark的cluster模式有什么好处

Spark的Cluster模式有以下几个显著的好处:

1、资源利用率高:在Cluster模式下,Spark能够更有效地利用整个集群的资源,包括CPU、内存和存储。通过在多个节点上并行运行任务,显著提高计算速度和数据处理能力。
2、灵活的资源调度:支持与多种资源调度器(如YARN、Mesos、Kubernetes)集成,适应不同的部署环境,并优化资源分配和使用。这使得Spark应用能更好地融入现有的基础架构中。
3、动态资源分配:Spark在Cluster模式下支持动态地根据应用需求调整资源使用量,有效应对负载变化,提升集群的整体效率。
4、扩展性:Cluster模式易于扩展,可以根据数据量和计算需求的增长轻松地向集群添加或移除节点,无需对应用做大的改动。
5、统一的数据处理平台:提供了一个统一的平台处理批处理、流处理、机器学习和图处理等多种类型的数据处理任务,降低了使用多种工具的学习成本,并提高了开发和维护效率。
6、更好的隔离性:Driver程序与Executor在不同的节点上运行,这样可以减少一个应用的问题对其他应用或集群稳定性的影响,增强了系统的健壮性。
7、提升运行效率:相较于Client模式,Cluster模式下Driver和Executor间的通信效率更高,因为它们更可能位于同一个局域网内,减少了网络延迟。
8、适合生产环境:由于上述种种优势,Cluster模式特别适合用于生产环境的部署,尤其是在需要高性能、高稳定性的大规模数据处理场景中。尽管查看日志相对不便,但可以通过日志收集系统(如Flume、Logstash)或者YARN的Web UI来解决这一问题。

Driver怎么管理executor

在Apache Spark中,Driver负责管理和控制整个Spark应用程序的执行流程,包括Executor的生命周期管理、任务调度与执行、以及资源的请求与回收。以下是Driver管理Executor的主要方式:

1、资源申请:
Driver在应用程序启动时,会与集群管理器(如YARN、Mesos或Spark Standalone的Master)进行通信,根据应用程序的需求申请Executor资源。这包括请求特定数量的Executor以及每个Executor的CPU核心数和内存大小。
2、任务调度:
Driver中的两个重要组件DAGScheduler和TaskScheduler负责将复杂的作业分解成一系列Stage,并进一步将Stage分解成可执行的Task。DAGScheduler负责逻辑上的任务划分和Stage的组织,而TaskScheduler则负责物理上将这些Task分配到各个Executor上执行。
3、状态监控:
Driver持续监控Executor的运行状态,通过心跳机制与Executor保持通信,检查其健康状况。如果Executor因故障或网络问题变得不可用,Driver会收到通知。
4、故障恢复:
当检测到Executor失败时,Driver可以请求集群管理器启动新的Executor来替代失效的Executor,以确保任务的正常执行。此外,TaskScheduler还会负责因Executor失败而需要重试的任务。
5、资源释放:
应用程序执行完毕后,Driver会负责清理过程,包括通知集群管理器释放之前申请的所有Executor资源,以及关闭与Executor的通信。
6、内存与CPU管理:
虽然直接的内存与CPU管理主要在Executor层面进行,但Driver通过配置和任务分配间接控制Executor的资源使用。例如,通过配置可以限制每个Executor的最大内存使用量,以及每个任务的内存使用上限。

Spark的map和flatmap的区别?

Spark中的map和flatMap是两个常用的转换操作,用于对RDD(弹性分布式数据集)中的元素进行处理和转换。以下是它们之间的主要区别:

1、操作方式:

  • map:对RDD中的每个元素应用一个函数,并返回一个新的RDD,其中每个元素都是原RDD中对应元素经过函数处理后的结果。简而言之,map操作是“一对一”的映射。
  • flatMap:也是对RDD中的每个元素应用一个函数,但该函数返回的结果可以是一个元素或者一个元素的集合(如列表、数组等)。flatMap会将这些集合“扁平化”为一个新的RDD,即所有的元素合并为一个RDD。这意味着flatMap操作可以实现“一对多”的映射。

2、返回值类型:

  • map:返回一个新的RDD,其中的元素类型与输入RDD的元素类型可能不同,但每个元素都是单个对象。
  • flatMap:返回一个新的RDD,其中的元素类型与输入RDD的元素类型可能不同,且每个元素可能是单个对象,也可能是由多个对象组成的集合经过扁平化后的结果。

3、使用场景:

  • map:适用于对RDD中的每个元素进行独立处理,且处理结果仍然是单个对象的场景。例如,将RDD中的每个整数乘以2。
  • flatMap:适用于需要将RDD中的每个元素拆分为多个独立元素的场景。例如,将包含字符串的RDD拆分为单词的RDD。在这种情况下,使用flatMap可以更方便地将每个字符串拆分为单词,并将所有单词合并为一个新的RDD。

4、示例:
假设有一个包含字符串的RDD:rdd = ["Hello World", "Spark is great"]
使用map操作:rdd.map(lambda x: x.split(" ")) 将返回一个包含两个列表的RDD:[["Hello", "World"], ["Spark", "is", "great"]]
使用flatMap操作:rdd.flatMap(lambda x: x.split(" ")) 将返回一个包含所有单词的RDD:["Hello", "World", "Spark", "is", "great"]
总结来说,map和flatMap的主要区别在于它们对RDD中元素的处理方式和返回结果的形式。map实现“一对一”的映射,而flatMap实现“一对多”的映射,并通过扁平化操作将多个集合合并为一个RDD。

Spark的cache和persist的区别?它们是transformaiton算子还是action算子?

Spark中的cache和persist在缓存RDD(弹性分布式数据集)时起着关键作用,但它们在功能和用法上存在一些差异。以下是对这两个方法的详细比较和说明:

cache和persist的区别
1、功能:

  • cache:cache是persist的一个特例,它默认将数据以MEMORY_ONLY的存储级别缓存在内存中。也就是说,cache底层实际上调用了persist方法,但限定了存储级别。
  • persist:persist方法允许用户指定数据的存储级别,如MEMORY_ONLY、MEMORY_AND_DISK等。这意味着你可以根据应用程序的需求和集群的资源情况,灵活地选择数据的存储位置和方式。

2、灵活性:

  • 由于persist允许用户指定存储级别,因此它在使用上更加灵活。而cache则相对固定,只能将数据缓存在内存中。

cache和persist是transformation算子还是action算子?

  • 既不是transformation算子也不是action算子:cache和persist都不是Spark中的transformation或action算子。它们不会生成新的RDD,也不会触发数据的实际计算。相反,它们只是为RDD标记了一个“缓存”或“持久化”的属性。这个属性会在后续遇到action算子时触发数据的缓存或持久化操作。

总结

  • cache和persist都是用于缓存RDD的方法,但persist提供了更多的灵活性,允许用户指定数据的存储级别。
  • 这两个方法都不是transformation或action算子,它们只是为RDD设置了缓存或持久化的属性,实际的缓存或持久化操作会在后续遇到action算子时触发。

额外信息

  • 存储级别:Spark提供了多种存储级别供用户选择,包括MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER等。这些存储级别决定了数据在缓存时的存储位置和序列化方式。
  • 缓存时机:cache和persist方法被调用时并不会立即触发数据的缓存或持久化。实际上,它们只是标记了RDD需要被缓存或持久化。只有当后续遇到action算子时,Spark才会真正地将数据缓存或持久化到指定的存储位置。
  • 缓存替换策略:当内存不足以容纳所有需要缓存的数据时,Spark会使用LRU(最近最少使用)策略来替换旧的缓存数据。这意味着最近最少使用的数据将首先被移除,以便为新的数据腾出空间。

Saprk Streaming从Kafka中读取数据两种方式?

Spark Streaming从Kafka中读取数据主要有两种方式:基于Receiver的方式(Receiver-based Approach)和基于Direct的方式(Direct Approach)。以下是这两种方式的详细解释:

基于Receiver的方式(Receiver-based Approach)
1、原理:Spark Streaming官方最先提供了基于Receiver的Kafka数据消费模式。在这种模式下,Spark集群会启动指定的Receivers来专门、持续不断、异步地从Kafka读取数据。读取的数据首先会保存在Receiver中,然后由Spark Streaming处理。
2、特点:
使用了Kafka的高阶API接口,因此不需要自己管理Offset,而是由Zookeeper和消费者组GroupID自动管理。
默认情况下,如果程序失败或Executor宕掉,可能会丢失数据。但通过设置spark.streaming.receiver.writeAheadLog.enable=true,可以利用预写日志(Write Ahead Log, WAL)将数据备份到更可靠的系统(如HDFS)中,以确保数据不丢失。
在数据量大、网络状况不佳的情况下,启用WAL可能会严重降低性能。
3、优点:
用户可以专注于所读数据,而不用关注或维护consumer的offsets,减少了用户的工作量和代码量。
4、缺点:
由于Spark Streaming和Zookeeper中的Offset可能不同步,这种方式偶尔会造成数据重复消费。
需要额外的Receivers来读取数据,这些Receivers不参与计算任务,从而降低了资源利用效率。
 

基于Direct的方式(Direct Approach)
1、原理:Spark 1.3版本引入了基于Direct的方式。在这种模式下,Spark Streaming不再需要Receiver来持续读取数据,而是当batch任务触发时,由Executor直接从Kafka读取数据并参与到计算过程中。Offset的管理则通过Spark Streaming的checkpoints来实现。
2、特点:
使用了Kafka的简单消费者API,因此不需要ZooKeeper参与。
Kafka中的partition与RDD中的partition一一对应,简化了并行读取和数据处理。
不需要开启WAL机制,降低了数据丢失的风险,并且提高了性能。
由于Spark Streaming自己负责追踪消费的Offset,因此可以保证数据被消费一次且仅一次。
3、优点:
提高了并行度,简化了并行读取。
降低了资源消耗,因为不需要额外的Receivers。
提高了鲁棒性,因为只有在batch任务触发时才会读取数据,避免了因数据堆积导致的计算崩溃。
4、缺点:
需要用户采用checkpoint或者第三方存储来维护Offset,增加了开发成本。
监控和可视化不如基于Receiver的方式方便,需要额外的开发工作。
在实际应用中,可以根据具体的业务场景和需求选择适合的读取方式。如果需要高可靠性和精确一次的数据处理,可以选择基于Direct的方式;如果更注重开发和维护的简便性,可以选择基于Receiver的方式。

Spark Streaming的工作原理?

Spark Streaming是Apache Spark的一个组件,专为处理实时数据流设计,它采用了一种称为微批处理(Micro-Batching)的处理模型。以下是Spark Streaming的工作原理概览:

1、数据摄取:
    Spark Streaming可以从多种数据源接收实时数据流,包括Kafka、Flume、Kinesis、TCP sockets、文件系统等。数据源通过接收器(Receiver)或直接通过数据源API(如Structured Streaming中的数据源)被引入到Spark Streaming中。
2、数据分片:
    进入的数据流被分割成小的时间片,每个时间片被称为一个批次(Batch)。批次的大小(例如,2秒、5秒)是可以配置的,这是微批处理的关键概念。每个批次的数据被视为一个离散化数据流(Discretized Stream,简称DStream)。
3、DStream转换:
    DStream是Spark Streaming中表示连续数据流的高级抽象,它本质上是一系列RDD(弹性分布式数据集)的序列。开发者可以使用高阶函数(如map、filter、reduce、join、window等)对DStream进行转换和聚合操作,这些操作最终会转化为对组成DStream的RDD的操作。
4、任务调度与执行:
    Spark Streaming的DAGScheduler将DStream上的转换操作转换为多个Stage,并进一步分解为多个Task。TaskScheduler将这些任务分配给Spark集群中的Executor执行。Executor是Spark集群中的工作节点,它们负责实际的数据处理。
5、输出与存储:
    处理后的结果可以被输出到文件系统(如HDFS)、数据库、消息队列或其他实时可视化工具中。输出操作同样作为DStream上的操作进行定义。
6、容错与恢复:
    Spark Streaming通过RDD的血统(Lineage)机制提供容错能力。如果某个Executor失败,Spark可以利用RDD的依赖关系重新计算丢失的分区。同时,Spark Streaming还支持检查点机制,定期将应用程序的元数据(如偏移量)保存到持久存储,以便在驱动程序失败时恢复应用程序状态。
通过这样的机制,Spark Streaming实现了高吞吐量、低延迟的实时数据处理,同时保持了Spark核心API的易用性和强大的容错特性。

Spark Streaming的DStream和DStreamGraph的区别?

Spark Streaming中的DStream和DStreamGraph是两个核心概念,它们在Spark Streaming的架构中扮演着不同的角色。以下是对两者的区别进行的清晰归纳:

1. 定义和角色

DStream(Discretized Stream):
 1) 定义:DStream是Spark Streaming提供的一种高级抽象,代表了一个持续不断的数据流。
 2) 角色:它是Spark Streaming中用于处理流式数据的基本单位,可以通过输入数据源创建,如Kafka、Flume等,也可以通过对其他DStream应用高阶函数(如map、reduce、join、window等)来创建。
 3) 内部结构:DStream在内部是由一系列连续产生的RDD(弹性分布式数据集)组成的序列。每个时间区间收到的数据都被封装为一个RDD,而DStream则是由这些RDD所组成的序列。
DStreamGraph:
 1) 定义:DStreamGraph是RDD DAG(有向无环图)的模板,用于表示DStream之间的依赖关系或“血缘关系”。
 2) 角色:它记录了整个Spark Streaming应用程序中DStream的转换(transformation)和输出(output)操作,以及这些操作之间的依赖关系。DStreamGraph是Spark Streaming进行任务调度和优化的基础。
 3) 结构:DStreamGraph有两个重要的成员:inputStreams和outputStreams。inputStreams表示输入数据源(如Kafka、Flume等),而outputStreams则表示通过转换操作生成的DStream。
2. 功能和用途

DStream:

  • 主要用于处理流式数据,提供了丰富的API(如map、reduce、join、window等)来支持各种数据处理需求。
  • 可以将处理后的数据保存到外部系统,如HDFS、数据库等。

DStreamGraph:

  • 主要用于任务调度和优化。Spark Streaming通过DStreamGraph来确定每个RDD的计算逻辑,以及这些RDD之间的依赖关系,从而能够高效地调度和执行计算任务。
  • 在容错和恢复方面,DStreamGraph也起到了关键作用。通过DStreamGraph中的checkpoint机制,可以保存DStream的状态和进度,以便在应用程序故障时恢复执行。

3. 总结

DStream和DStreamGraph在Spark Streaming中各自扮演着不同的角色。DStream是处理流式数据的基本单位,提供了丰富的数据处理API;而DStreamGraph则用于表示DStream之间的依赖关系,是Spark Streaming进行任务调度和优化的基础。两者共同构成了Spark Streaming的核心架构,使得Spark Streaming能够高效、可靠地处理大规模、实时的数据流。

引用:https://www.nowcoder.com/discuss/353159520220291072

通义千问、文心一言

相关文章:

大数据面试题之Spark(5)

Spark SQL与DataFrame的使用? Sparksql自定义函数?怎么创建DataFrame? HashPartitioner和RangePartitioner的实现 Spark的水塘抽样 DAGScheduler、TaskScheduler、SchedulerBackend实现原理 介绍下Sparkclient提交application后,接下来的流程? Spark的几种…...

springboot笔记示例六:fastjson2集成

springboot笔记示例六:fastjson2集成 本文md下载 https://download.csdn.net/download/a254939392/89491102本文md文档下载地址 #springboot json官方说明 https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-json.htmlsprin…...

VLOOKUP函数在表格的简单运用-两个表匹配

1.什么是VLOOKUP? VLOOKUP是Excel中的一个内置函数,主要用于在区域或表格的首列查找指定的值,并返回该行中其他列的值。它特别适用于跨表格数据匹配 2.函数运用 2.1.这边两个表取名a表和b表,做为我们的实例表。 表格a包含&…...

http.cookiejar.LoadError: Cookies file must be Netscape formatted,not JSON.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

逻辑操作符

目录 && --- 逻辑与操作符 || --- 逻辑或操作符 && --- 逻辑与操作符 逻辑与操作符有并且的意思,一般用于判断语句中 逻辑与操作符运行规则是都要为真,才会继续执行或计算 360笔试题: 有关前置(--),后置(-…...

Java调用第三方接口的秘籍:技巧、案例与最佳实践

Java调用第三方接口的秘籍:技巧、案例与最佳实践 在Java开发中,调用第三方接口是一项常见的任务。无论是与外部系统交互、集成其他服务,还是调用远程API获取数据,掌握有效的第三方接口调用技巧都是至关重要的。本文将深入剖析Jav…...

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络(CNN)2.3 循环神经网络(RNN) 第三章 深度学习的应用实…...

计网之IP

IP IP基本认识 不使用NAT时,源IP地址和目的IP地址不变,只要源MAC和目的MAC地址在变化 IP地址 D类是组播地址,E类是保留地址 无分类地址CIDR 解决直接分类的B类65536太多,C类256太少a.b.c.d/x的前x位属于网路号,剩…...

mybatis延迟加载

mybatis延迟加载 1、延迟加载概述 应用场景 ​ 如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 延迟加载的好处 ​ 先从单表查询、需要时再从关联表去关联查…...

危险!属性拷贝工具的坑!

1. 背景​ 之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。 不推荐的主要理由是: 有些属性拷贝工具性能有点差有些属性拷贝工具有“BUG”使用属性拷贝工具容易存在一些隐患&#xff08…...

qt实现打开pdf(阅读器)功能用什么库比较合适

关于这个问题,网上搜一下,可以看到非常多的相关博客和例子,可以先看看这个总结性的博客(https://zhuanlan.zhihu.com/p/480973072) 该博客讲得比较清楚了,这里我再补充一下吧(qt官方也给出了一些…...

在node.js环境中使用web服务器http-server运行html静态文件

http-server http-server是一个超轻量级web服务器,它可以将任何一个文件夹当作服务器的目录供自己使用。 当我们想要在服务器运行一些代码,但是又不会配置服务器的时候,就可以使用http-server就可以搞定了。 使用方法 因为http-server需要…...

前端学习篇一(HTML)

Introduction ##文章内容:使用HBuilder制作一个简单的HTML5网页以此达到学习HTML5 的目的 ##编写内容:1.HTML实现平台 2.HTML简介 3.HTML语言解析 ##编写人:贾雯爽 ##最后更新时间:2024/07/01 Overview Details 一、HTML简介…...

VUE笔记

框架: 框架结构,把很多基础功能已经实现(封装了)。 框架:在基础语言之上,对各种基础功能进行封装,方便开发者,提高开发效率。 举例:操作页面 现在:点击按…...

Datawhale机器学习day-1

赛题 在当今科技日新月异的时代,人工智能(AI)技术正以前所未有的深度和广度渗透到科研领域,特别是在化学及药物研发中展现出了巨大潜力。精准预测分子性质有助于高效筛选出具有优异性能的候选药物。以PROTACs为例,它是…...

业务模型扩展字段存储

构建业务模型时,通常模型会设置扩展信息,存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性,但并没有结构化存储的类型和非空等约束,且强依赖代码中写入/读取时进行序列化/反序列化操作, 当扩展信息结构简单且…...

50+k8s常用命令,助你成为k8s大牛!

Kubernetes是一个强大的容器编排平台,不管是运维、开发还是测试或多或少都会接触到,熟练的掌握k8s可大大提高工作效率和强化自身技能。 集群管理 1. 查看集群节点状态: kubectl get nodes2. 查看集群资源使用情况: kubectl top nodes3. 查看集群信息…...

002-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法,所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇,将介绍基础的线性回归方法,包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归(Regression&…...

python实现网页自动化(自动登录需要验证的网页)

引言: python作为实现网页自动化的一个重要工具,其强大的各种封装的库使得程序运行更加简洁,只需要下载相应的库,然后调用库中的函数就可以简便的实现我们想要的网页相关操作。 正文: 我的前几篇文章写了关于初学爬虫中比较容易上手的功能,例如爬取静态网页的数据、动…...

ctfshow-web入门-命令执行(web71-web74)

目录 1、web71 2、web72 3、web73 4、web74 1、web71 像上一题那样扫描但是输出全是问号 查看提示:我们可以结合 exit() 函数执行php代码让后面的匹配缓冲区不执行直接退出。 payload: cvar_export(scandir(/));exit(); 同理读取 flag.txt cinclud…...

一体化导航的优点及应用领域

一体化导航,作为现代导航技术的重要发展方向,正日益展现出其独特的魅力和广泛的应用前景。这种导航方式将多种导航技术、信息系统以及数据处理方法集成于一个统一的平台上,为用户提供高效、准确、便捷的导航服务。 一体化导航的核心在于其高度…...

“吃饭大学”!中国大学食堂排行TOP10(含西电)

同学们们,考研择校考虑的因素除了学术,地理位置等方面,你们还会考虑哪些因素呢?小研作为一个吃货,必定会考虑的一个因素当然是大学的食堂美食啊~ 那中国超级好吃的大学食堂在哪?一起来看看有没有你的目标院…...

使用 Mybatis 时,调用 DAO接口时是怎么调用到 SQL 的?

Mybatis 是一个流行的 Java 持久层框架,它提供了一种半自动的 SQL 映射方式,允许开发者在 Java 代码中以一种更加直观和灵活的方式来操作数据库。当你使用 Mybatis 调用 DAO 接口时,背后的工作流程大致如下: 接口定义:…...

微信小程序毕业设计-微信食堂线上订餐系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...

昂首资本实例使用价格行为策略,交易翻倍一点都不难

交易翻倍难吗?当Anzo Capital昂首资本使用价格行为策略进行交易时,发现一点都不难,以下是使用价格行为策略的实例分享: 1. 在初次交易信号出现时,推荐在1.00429价位入场,将止损设于1.04399,止盈…...

20240701 每日AI必读资讯

🏫AI真炼丹:整整14天,无需人类参与 - 英矽智能推出全球首个AI参与决策的生物学实验室,实现了14天内完成靶点发现和验证的全自动化闭环实验。 - 该实验室由PandaOmics平台驱动,集成多种预测模型和海量数据&#xff0…...

GPT-5 一年半后发布,对此你有何期待?

IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的…...

Redis学习——Redisson 分布式锁集成及其简单使用

文章目录 引言1. Redisson概述1.1 Redisson的基本概念1.2 Redisson的主要功能1.3 Redisson的优点 2. 开发环境3. Redisson的安装与配置3.1 添加依赖3.2 配置Redisson 4. 使用Redisson4.1 可重入锁4.1.1 可重入锁的概念4.1.2 可重入锁的实现原理4.1.3 简单使用锁的获取和释放 4.…...

08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数

08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数 0. 引言1. 关于m_line2. 关于m_quiver3. 关于m_text4. 关于m_plot5. 结语 0. 引言 本篇介绍下m_map中添加绘制基础线(m_line、m_plot)、绘制箭头(m_quiver&#x…...

Luminar Neo 1.20.0 (macOS Universal) - 创新 AI 图像编辑器

Luminar Neo 1.20.0 (macOS Universal) - 创新 AI 图像编辑器 利用尖端的人工智能生成技术,轻松增强照片效果 请访问原文链接:https://sysin.org/blog/luminar-neo/,查看最新版。原创作品,转载请保留出处。 作者主页&#xff1…...

谈谈Flink消费kafka的偏移量

offset配置: flinkKafkaConsumer.setStartFromEarliest():从topic的最早offset位置开始处理数据,如果kafka中保存有消费者组的消费位置将被忽略。 flinkKafkaConsumer.setStartFromLatest():从topic的最新offset位置开始处理数据,如果kafka中保存有消费…...

MySQL 高级SQL高级语句(二)

一.CREATE VIEW 视图 可以被当作是虚拟表或存储查询。 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。 临时表在用户退出或同数据库的连接断开后就自动消失了,而…...

MySQL之高可用性(四)

高可用性 故障转移和故障恢复 冗余是很好的技术,但实际上只有在遇到故障需要恢复时才会用到。(见鬼,这可以用备份来实现)。冗余一点儿也不会增加可用性或减少宕机。在故障转移的过程中,高可用性是建立在冗余的基础上。当有一个组件失效&…...

招聘智能管理系统设计

设计一个招聘智能管理系统,需要从多个维度考虑,包括但不限于用户界面、功能模块、数据安全、算法模型等。以下是一个基本的设计框架: 1. 系统架构: 前端:提供直观的用户界面,包括应聘者和招聘者的登录/注册…...

达梦数据库系列—15. 表的备份和还原

目录 1、表备份 2、表还原 1、表备份 表备份和表还原恢复,都必须在联机状态下进行。 与备份数据库与表空间不同,不需要备份归档日志,不存在增量备份之说。 CREATE TABLE TAB_FOR_RES_02(C1 INT);CREATE INDEX I_TAB_FOR_RES_02 ON TAB_F…...

无线领夹麦克风哪个品牌音质最好,直播用领夹麦克风还是声卡麦

随着社交媒体的兴起,直播和Vlog已经成为内容创作的新趋势,这些变化不仅改变了人们分享生活的方式,也带动了音频设备市场的增长。无线领夹麦克风,以其便携性和卓越的录音品质,迅速成为视频制作者的重要工具。它们在直播…...

《Windows API每日一练》6.2 客户区鼠标消息

第五章已经讲到,Windows只会把键盘消息发送到当前具有输入焦点的窗口。鼠标消息则不同:当鼠标经过窗口或在窗口内被单击,则即使该窗口是非活动窗口或不带输入焦点, 窗口过程还是会收到鼠标消息。Windows定义了 21种鼠标消息。不过…...

体验升级:扫描全能王智能高清滤镜2.0全面测评

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…...

【JVM系列】JVM调优

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Linux基础 - Postfix 与 Dovecot 部署邮件系统

目录 零. 简介 一. 部署 二. 设置用户别名信箱 三. Linux 邮件客户端 零. 简介 Postfix 和 Dovecot 是在 Linux 系统中常用于部署邮件系统的两个重要组件。 Postfix 是一种邮件传输代理(MTA),主要负责接收、转发和发送邮件。它具有高性能…...

Qt的安装

一、Qt安装 下载地址:https://download.qt.io/archive/qt/ opencv下载安装 下载地址:https://opencv.org/releases/ 陈年旧文,没有下文,以此纪念。。。。。...

ThreeJS-3D教学十二:ShaderMaterial

一、首先 Shader 是做什么的 Shader 可以自定义每个顶点、每个片元/像素如何显示,而控制顶点和片元显示是通过设置 vertexShader 顶点着色器和 fragmentShader 片元着色器,这两个着色器用在 ShaderMaterial 和 RawShaderMaterial 材质上。 我们先看一个例…...

计算机网络面试TCP篇之TCP三次握手与四次挥手

TCP 三次握手与四次挥手面试题 任 TCP 虐我千百遍,我仍待 TCP 如初恋。 巨巨巨巨长的提纲,发车!发车! PS:本次文章不涉及 TCP 流量控制、拥塞控制、可靠性传输等方面知识,这些知识在这篇: TCP …...

Python-数据分析组合可视化实例图【附完整源码】

数据分析组合可视化实例图 开篇:应女朋友的要求,于是写下了这篇详细的数据可视化代码及完整注释 一:柱状图、折线图横向组合网格布局 本段代码使用了pyecharts库来创建一个包含多个图表(柱状图、折线图)和网格布局的…...

【JavaEE】Spring Web MVC详解

一.基本概念. 1.什么是Spring Web MVC? 官方链接: https://docs.spring.io/spring-framework/reference/web/webmvc.html Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning…...

docker安装rocketMq5x以上的版本

1.背景 安装RocketMQ 5.x以上的版本主要是因为新版本引入了许多性能优化、新功能以及对已有特性的增强,这些改进可以帮助提升消息队列系统的稳定性和效率。 1.性能提升:RocketMQ 5.x版本通常包括了对消息处理速度、吞吐量和延迟的优化,使得系…...

【Spring】DAO 和 Repository 的区别

DAO 和 Repository 的区别 1.概述2.DAO 模式2.1 User2.2 UserDao2.3 UserDaoImpl 3.Repository 模式3.1 UserRepository3.2 UserRepositoryImpl 4.具有多个 DAO 的 Repository 模式4.1 Tweet4.2 TweetDao 和 TweetDaoImpl4.3 增强 User 域4.4 UserRepositoryImpl 5.比较两种模式…...

高阶面试-秒杀系统的设计

场景 特价商品如茅台,在8月1日22点10分0秒开始秒杀 平台用户量:几千万,预计几十万用户感兴趣 需求 临时性的活动,不要太大技术改动 原则 商品不能超卖下单成功的订单不能丢失服务器和数据库不能崩溃尽量不让机器人抢走商品 …...

四十五、 证券基金业数据出境有无特别规范需要注意?

证券基金业数据合规除应遵守本《实务问答》前述的各项通用规定外,还应注意中国证券监督管理委员会等其他机构发布的相关规范。其中,与数据出境相关的主要包括《证券期货业数据分类分级指引》(JR/T 0158—2018,2018年 9月 27日实施…...

02.Linux下安装FFmpeg

目录 一、下载FFmpeg的编译源码 二、编译源码 三、ffmpeg工具结构解析 1、bin目录 2、include库 3、lib库 四、注意事项 五、可能出现的一些问题 1、某些工具未安装/版本过久 2、缺少pkg-config工具 3、缺少ffmplay FFmpeg 是一个开源的跨平台音视频处理工具集&…...

OpenSSL的一些使用案例

目录 一、介绍 二、基本使用 1、Shell (1)文件加解密 (2)生成密钥文件 2、API (1)md5sum (2)AES256加解密 一、介绍 本篇博客重点不是详细描述 OpenSSL 的用法,只…...

基于weixin小程序新生报到系统的设计

管理员账户功能包括:系统首页,个人中心,学生管理,班级信息管理,师资力量管理,宿舍信息管理,宿舍安排管理,签到信息管理,论坛管理 小程序功能包括:系统首页&a…...

震惊!张宇强化36讲1200页,暑期强化高效利用指南!

特别喜欢张宇老师的讲课风格 如果你打算跟张宇老师,那么基础——>强化——>冲刺,你应该这么买书! 张宇老师25版课程大改版,其中,36讲的变动是最大的,张宇老师25版课程把以往的强化课程前移&#xff0…...

操作系统——操作系统安全性

...

【 木兰宽松许可证】

木兰宽松许可证, 第1版 2019年8月 http://license.coscl.org.cn/MulanPSL 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第1版(“本许可证”)的如下条款的约束: 定义 “软件”是指由“贡献”构成的许可在“本…...

解锁IDEA中Git/SVN Issue Navigation功能:80%程序员都不懂的秘密武器~

文章目录 前言什么是 Git Issue Navigation?配置 Git Issue Navigation1. 打开设置2. 导航到 Issue Navigation 设置3. 添加新的 Issue Navigation 规则具体示例配置 使用 Git Issue Navigation在提交信息中使用 Issue ID实际导航到连接 优点1. 快速定位问题2. 提高…...

嘉兴燃气09908与嘉兴管网公司订立天然气供应框架协议

智通财经APP讯,嘉兴燃气发布公告,于2024年5月23日,该公司(作为供应商)与嘉兴管网公司作为(作为买方)订立天然气供应框架协议。根据天然气供应框架协议,嘉兴管网公司与该公司可不时就该公司于2024年5月23日至2027年3月31日期间向嘉兴管网公司供应天然气订立最终协议,惟须遵…...

Python--List列表

list列表⭐⭐ 1高级数据类型 Python中的数据类型可以分为:数字型(基本数据类型)和非数字型(高级数据类型) ●数字型包含:整型int、浮点型float、布尔型bool、复数型complex ●非数字型包含:字符…...

K8S中Prometheus+Grafana监控

1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理:通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用,比如haproxy,nginx,Mysql,Linux系统信…...

【PB案例学习笔记】-11动画显示窗口

写在前面 这是PB案例学习笔记系列文章的第11篇,该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gite…...

总结 HTTP 协议的基本格式

一、HTTP 是什么 HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议 . HTTP 诞生与 1991 年 . 目前已经发展为最主流使用的一种应用层协议 . HTTP 协议目前有三个大版本: HTTP / 1 和 HTTP / 2 都是基于TCP 传输控制协议传输数据。最新版本的…...

Golang原生http实现中间件

Golang原生http实现中间件 中间件(middleware):常被用来做认证校验、审计等 大家常用的Iris、Gin等web框架,都包含了中间件逻辑。但有时我们引入该框架显得较为繁重,本文将介绍通过golang原生http来实现中间件操作。全…...