大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
大数据 ETL + Flume 数据清洗 — 详细教程及实例
- 1. ETL 和 Flume 概述
- 1.1 ETL(Extract, Transform, Load)
- 1.2 Flume 概述
- 2. Flume 环境搭建
- 2.1 下载并安装 Flume
- 2.2 启动 Flume
- 3. Flume 配置和常见 Source、Sink、Channel
- 3.1 Flume Source
- 3.2 Flume Sink
- 3.3 Flume Channel
- 4. ETL 数据清洗过程
- 4.1 提取(Extract)
- 4.2 转换(Transform)
- 4.3 加载(Load)
- 5. 实例演示:使用 Flume 进行数据清洗
- 5.1 配置 Flume
- 5.2 启动 Flume
- 5.3 使用 Spark 清洗数据
- 6.常见问题及解决方案详细化(附实例)
- 6.1. Flume 启动失败或无法启动
- 6.1.1 配置文件错误
- 6.1.2 端口被占用
- 6.1.3 Java 环境变量未配置
- 6.2. 数据丢失或无法写入目标
- 6.2.1 Sink 配置错误
- 6.2.2 Channel 类型配置错误
- 6.2.3 目标系统不可用
- 3. 数据传输速度慢
- 6.3.1 Flume 配置不合理
- 6.3.2 网络带宽瓶颈
- 6.3.3 资源配置不足
- 4. 数据格式不一致或数据损坏
- 6.4.1 数据格式不一致
- 6.4.2 数据损坏
- 5. Flume 性能瓶颈
- 6.5.1 配置不当导致性能瓶颈
- 6.5.2 增加 Flume Agent 并行度
- 7. 总结
在大数据生态中,ETL(Extract, Transform, Load)是处理和清洗数据的核心过程。Flume 是一个分布式的、可靠的流数据收集工具,常用于将日志和流数据导入到 Hadoop、HDFS、Kafka 或其他数据存储系统。本文将结合 Flume 的使用、数据清洗、ETL 流程以及 常见问题和解决方案,为您提供完整的技术指南。
1. ETL 和 Flume 概述
1.1 ETL(Extract, Transform, Load)
ETL 是从各种数据源中提取数据(Extract)、对数据进行清洗和转换(Transform),最后将数据加载到目标存储系统(Load)的过程。ETL 过程是大数据架构中至关重要的一部分,常用于处理不同格式的原始数据,将其转化为有价值的数据。
- Extract(提取):从数据源中提取原始数据,支持多种数据源,如文件、数据库、流数据等。
- Transform(转换):清洗、格式化、过滤、去重等数据转换操作。
- Load(加载):将处理后的数据加载到目标存储(如 HDFS、Kafka、数据库等)中。
1.2 Flume 概述
Flume 是 Apache 提供的一个分布式流数据收集、聚合和传输的工具。它可以用来将实时数据流(如日志、监控数据等)收集并传输到 Hadoop、Kafka 等存储系统进行后续处理。Flume 的工作原理是通过定义 Source、Channel 和 Sink 来完成数据的收集、传输和存储。
- Source(源):数据输入来源,Flume 支持多种 Source 类型(如
netcat、file、exec)。 - Channel(通道):负责暂存数据,提供异步、持久化存储。
- Sink(接收器):数据输出目标,可以是 HDFS、Kafka、数据库等。
2. Flume 环境搭建
2.1 下载并安装 Flume
-
下载 Flume
从 Apache Flume 官方下载页面 下载适合您操作系统的 Flume 安装包。
-
解压并安装
解压下载的包,并进入安装目录:
tar -xzvf apache-flume-1.9.0-bin.tar.gz cd apache-flume-1.9.0
2.2 启动 Flume
Flume 提供了命令行工具来启动 Flume 服务。以下是启动 Flume Agent 的命令行示例:
bin/flume-ng agent --conf conf --conf-file conf/flume-conf.properties --name agent -Dflume.root.logger=INFO,console
其中,flume-conf.properties 是 Flume 的配置文件,agent 是 Flume Agent 的名称。
3. Flume 配置和常见 Source、Sink、Channel
Flume 配置文件定义了 Source、Sink 和 Channel 的类型、属性以及它们之间的连接方式。
3.1 Flume Source
Flume 支持多种 Source 类型,常见的 Source 包括:
- netcat:通过 TCP/UDP 接收数据。
- file:从文件系统读取数据。
- exec:通过执行外部命令获取数据。
- avro:通过 Avro 协议接收数据。
3.2 Flume Sink
Flume 提供了多种 Sink 类型,支持将数据输出到不同目标系统:
- logger:打印日志。
- hdfs:将数据保存到 Hadoop HDFS。
- kafka:将数据发送到 Kafka。
- jdbc:将数据存入数据库。
3.3 Flume Channel
Flume 的 Channel 用于暂存数据,可以配置为:
- memory:使用内存存储数据。
- file:使用文件系统存储数据。
- jdbc:将数据存入数据库。
4. ETL 数据清洗过程
ETL 中的数据清洗通常包括对原始数据进行过滤、格式转换、去重、规范化等操作。Flume 本身并不提供数据转换功能,但我们可以将 Flume 与其他工具(如 Apache Spark、Kafka、HDFS)结合使用,进行复杂的数据清洗和转换。
4.1 提取(Extract)
Flume 从数据源(如文件、网络端口、外部命令等)中提取原始数据。例如,我们可以使用 netcat 从指定端口接收数据:
# flume-conf.properties
agent.sources = r1
agent.sources.r1.type = netcat
agent.sources.r1.bind = localhost
agent.sources.r1.port = 44444
4.2 转换(Transform)
Flume 本身不提供复杂的转换功能,因此可以使用 Apache Spark、Flink 或 Hadoop 进行数据处理。例如,我们可以将 Flume 数据传输到 Kafka 或 HDFS,之后使用 Spark 对数据进行清洗和转换。
Spark 数据清洗示例:
from pyspark.sql import SparkSession
from pyspark.sql.functions import colspark = SparkSession.builder.appName("ETL Data Cleaning").getOrCreate()# 加载数据
df = spark.read.json("hdfs://localhost:9000/user/flume/output_data/*.json")# 清洗数据:去除空值
df_cleaned = df.filter(col("user_id").isNotNull()).filter(col("event_time") > "2024-01-01")# 保存清洗后的数据
df_cleaned.write.json("hdfs://localhost:9000/user/flume/cleaned_data/")
4.3 加载(Load)
清洗后的数据可以通过 Flume 将其加载到目标存储(如 HDFS、Kafka、数据库等)。
# 将清洗后的数据写入 HDFS
agent.sinks.k1.type = hdfs
agent.sinks.k1.hdfs.path = hdfs://localhost:9000/user/flume/output_data
agent.sinks.k1.hdfs.filePrefix = events-
agent.sinks.k1.hdfs.rollSize = 1000000
5. 实例演示:使用 Flume 进行数据清洗
假设我们需要从网络端口接收 JSON 格式的原始数据,清洗数据后将其保存到 HDFS。我们将 Flume 配置为通过 netcat 读取数据,将数据传输到 HDFS,接着使用 Spark 进行数据清洗。
5.1 配置 Flume
# flume-conf.properties
# Source 配置:使用 netcat 接收数据
agent.sources = r1
agent.sources.r1.type = netcat
agent.sources.r1.bind = localhost
agent.sources.r1.port = 44444# Channel 配置:使用 memory 存储数据
agent.channels = c1
agent.channels.c1.type = memory# Sink 配置:将数据存入 HDFS
agent.sinks = k1
agent.sinks.k1.type = hdfs
agent.sinks.k1.hdfs.path = hdfs://localhost:9000/user/flume/output_data
agent.sinks.k1.hdfs.filePrefix = event_data_
agent.sinks.k1.hdfs.rollSize = 1000000# 连接 Source 和 Sink
agent.sources.r1.channels = c1
agent.sinks.k1.channel = c1
5.2 启动 Flume
通过以下命令启动 Flume Agent,监听 localhost:44444 端口并将数据发送到 HDFS:
bin/flume-ng agent --conf conf --conf-file conf/flume-conf.properties --name agent -Dflume.root.logger=INFO,console
5.3 使用 Spark 清洗数据
在 Flume 将数据保存到 HDFS 后,使用 Spark 进行数据清洗:
from pyspark.sql import SparkSession
from pyspark.sql.functions import colspark = SparkSession.builder.appName("ETL Data Cleaning").getOrCreate()# 加载数据
df = spark.read.json("hdfs://localhost:9000/user/flume/output_data/*.json")# 数据清洗
df_cleaned = df.filter(col("user_id").isNotNull()) \.filter(col("event_time") > "2024-01-01")# 保存清洗后的数据
df_cleaned.write.json("hdfs://localhost:9000/user/flume/cleaned_data/")
6.常见问题及解决方案详细化(附实例)
在使用 Flume 进行大数据处理和 ETL 操作时,经常会遇到一些配置问题、性能瓶颈或者数据问题。以下是一些 Flume 在实际应用中常见的问题及解决方案,并附带了实例帮助你解决问题。
6.1. Flume 启动失败或无法启动
问题描述:
启动 Flume Agent 时,系统报错或者 Flume 无法正常启动。
常见原因及解决方案:
6.1.1 配置文件错误
原因:Flume 启动失败的常见原因之一是配置文件有误,比如文件路径错误、格式不正确、某些属性未配置等。
解决方案:
- 检查配置文件
flume-conf.properties是否有语法错误或缺少关键配置项。 - 确保配置文件中的路径(如
hdfs.path)正确。 - 检查配置文件中的
Source、Sink和Channel是否正确连接。
示例:假设我们有以下的配置文件:
# flume-conf.properties
agent.sources = r1
agent.channels = c1
agent.sinks = k1# Source 配置:netcat
agent.sources.r1.type = netcat
agent.sources.r1.bind = localhost
agent.sources.r1.port = 44444# Channel 配置:memory
agent.channels.c1.type = memory# Sink 配置:hdfs
agent.sinks.k1.type = hdfs
agent.sinks.k1.hdfs.path = hdfs://localhost:9000/user/flume/output_data
agent.sinks.k1.hdfs.filePrefix = event_data_
agent.sinks.k1.hdfs.rollSize = 1000000# Source 和 Sink 连接
agent.sources.r1.channels = c1
agent.sinks.k1.channel = c1
确保所有配置项(例如 bind, port, path)都是正确的,并且没有拼写错误。
6.1.2 端口被占用
原因:如果 Flume 的 Source 配置绑定的端口(如 localhost:44444)已经被其他应用占用,那么 Flume 无法启动。
解决方案:
-
检查端口是否被其他程序占用,可以使用
netstat或lsof命令查看端口占用情况。netstat -tuln | grep 44444 -
如果端口已被占用,可以更改 Flume 配置中的端口号,避免冲突。
agent.sources.r1.port = 55555
6.1.3 Java 环境变量未配置
原因:Flume 是基于 Java 开发的,如果你的 Java 环境变量未正确配置,会导致 Flume 启动失败。
解决方案:
-
确保 JAVA_HOME 环境变量已正确配置,并且 Java 版本支持 Flume。
-
使用以下命令检查 Java 版本是否可用:
java -version确保 Java 版本至少是 8 以上。
6.2. 数据丢失或无法写入目标
问题描述:
Flume 在收集和传输数据时,数据丢失或无法成功写入目标系统(如 HDFS、Kafka 等)。
常见原因及解决方案:
6.2.1 Sink 配置错误
原因:如果 Sink 配置错误,数据可能无法成功写入目标。例如,HDFS 的路径配置不正确、Kafka 配置错误等。
解决方案:
- 检查 Flume 配置中的
Sink部分,确保目标系统(如 HDFS)路径正确并且有写权限。 - 确保 HDFS 或 Kafka 目标系统处于运行状态。
示例:假设我们配置了将数据写入 HDFS,但 HDFS 的路径配置错误:
agent.sinks.k1.type = hdfs
agent.sinks.k1.hdfs.path = hdfs://localhost:9000/user/flume/output_data
如果路径错误,Flume 会无法写入数据。确保 hdfs://localhost:9000 是正确的 HDFS 路径,并且 Flume 用户有相应的写权限。
6.2.2 Channel 类型配置错误
原因:Flume 使用 Channel 来暂存数据,如果 Channel 配置不当,可能会导致数据丢失或者传输失败。
解决方案:
- 检查
Channel的类型和配置。例如,使用memory类型的Channel时,数据会保存在内存中,可能导致内存溢出。 - 如果需要持久化存储,考虑使用
file类型的Channel。
示例:如果使用内存存储的 Channel,并且数据量较大,可能会导致内存溢出:
agent.channels.c1.type = memory
解决方案是将 Channel 类型改为 file,或者增加内存配置:
agent.channels.c1.type = file
6.2.3 目标系统不可用
原因:Flume 的目标系统(如 HDFS、Kafka)出现故障或不可用时,数据无法成功写入。
解决方案:
- 检查目标系统是否可用。例如,检查 HDFS 是否运行正常,Kafka 是否连接可用。
- 配置 Flume 的
Sink重试机制,可以设置batchSize、maxRetries等参数。
agent.sinks.k1.hdfs.batchSize = 100
agent.sinks.k1.hdfs.rollCount = 10000
3. 数据传输速度慢
问题描述:
Flume 在传输数据时,传输速度较慢,影响数据实时性。
常见原因及解决方案:
6.3.1 Flume 配置不合理
原因:Flume 的配置(如 batchSize、channel 配置等)不合理可能会导致数据传输速度慢。
解决方案:
- 调整
batchSize和rollSize等配置,提高数据批量处理能力。 - 通过调优
Source、Sink、Channel的参数,控制每次操作的数据量。
示例:优化 HDFS Sink 配置来提高数据传输速度:
agent.sinks.k1.hdfs.batchSize = 1000
agent.sinks.k1.hdfs.rollSize = 10485760 # 10MB
6.3.2 网络带宽瓶颈
原因:数据传输过程中的网络带宽不足,导致数据传输缓慢。
解决方案:
- 检查网络带宽,确保 Flume 节点之间的网络连接足够快。
- 优化数据传输路径,例如通过 Kafka 或其他高速数据流组件传输。
6.3.3 资源配置不足
原因:Flume 配置的内存或 CPU 资源不足,导致数据处理速度慢。
解决方案:
- 增加 Flume 进程的内存,调整 JVM 堆内存设置。
export JAVA_OPTS="-Xmx4g -Xms2g"
- 增加 Flume Agent 的并发度或分区数,提高数据处理速度。
4. 数据格式不一致或数据损坏
问题描述:
Flume 处理的原始数据格式不一致,或者传输过程中数据格式出现问题。
常见原因及解决方案:
6.4.1 数据格式不一致
原因:Flume 收集的数据格式不统一,可能是 JSON、CSV 或 XML 等不同格式,导致数据无法正确解析。
解决方案:
- 在 Flume 配置中使用合适的
Interceptor或Processor,将数据格式统一化。
示例:假设我们要清洗 JSON 格式数据,首先用 JsonDecoder 解码 JSON 数据:
agent.sources.r1.interceptors = i1
agent.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.JsonDecoder$Builder
6.4.2 数据损坏
原因:Flume 在数据传输过程中,数据可能被损坏或不完整。
解决方案:
- 检查 Flume 的日志,查看是否有数据丢失或传输失败的错误信息。
- 增加
Channel的持久化特性,确保数据在传输过程中不会丢失。
agent.channels.c1.type = file
5. Flume 性能瓶颈
问题描述:
在处理大规模数据时,Flume 的性能出现瓶颈,导致数据传输延迟或失败。
常见原因及解决方案:
6.5.1 配置不当导致性能瓶颈
原因:Flume 配置不当(如 batchSize、Channel 配置、内存不足)会导致性能瓶颈。
解决方案:
- 调整 `batch
Size、rollSize、sink` 配置,提高吞吐量。
- 使用内存和磁盘混合的
Channel配置,避免内存溢出。
示例:调优 Sink 和 Channel 配置:
agent.sinks.k1.hdfs.batchSize = 10000
agent.sinks.k1.hdfs.rollSize = 10000000 # 10MB
agent.channels.c1.type = file
6.5.2 增加 Flume Agent 并行度
原因:Flume Agent 可能需要处理大量数据流时,单线程无法满足高吞吐量需求。
解决方案:
- 增加 Flume 的并发度,使用多线程或多个 Flume Agent 实例分担压力。
7. 总结
通过本文的详细教程,我们介绍了如何使用 Flume 进行大数据的 ETL 操作,结合 Spark 实现数据清洗。Flume 作为流数据收集工具,可以与其他大数据技术结合,实现高效的数据传输与清洗。通过合理的配置和调优,能够处理和清洗大规模数据,最终为数据分析提供高质量的数据集。
推荐阅读:《大数据测试 Elasticsearch — 详细教程及实例》,《大数据测试spark+kafka-详细教程》
相关文章:
大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
大数据 ETL Flume 数据清洗 — 详细教程及实例 1. ETL 和 Flume 概述1.1 ETL(Extract, Transform, Load)1.2 Flume 概述 2. Flume 环境搭建2.1 下载并安装 Flume2.2 启动 Flume 3. Flume 配置和常见 Source、Sink、Channel3.1 Flume Source3.2 Flume Si…...
鸿蒙next版开发:订阅应用事件(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了强大的应用事件订阅机制,允许开发者订阅和处理系统或应用级别的事件。这一功能对于监控应用行为、优化用户体验和进行性能分析至关重要。本文将详细介绍如何在ArkTS中订阅应用事件,并提供示例代码进行说明。 应…...
F litter 开发之flutter_local_notifications
flutter_local_notifications 消息通知 flutter_local_notifications地址 flutter_local_notifications: ^18.0.1class NotificationHelper {//工厂模式调用该类时,默认调用此方法,将实例对象返回出去static NotificationHelper? _instance null;sta…...
springboot参数校验
springboot 参数校验 Validated 以及 Valid - 唏嘘- - 博客园 SpringBoot参数校验Validated、Valid_springboot validate-CSDN博客...
Spring生态学习路径与源码深度探讨
引言 Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学…...
C++:set详解
文章目录 前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1)find2)count3)lower_bound与upper_bound4)equal_range 三、set的值是不能修改的原理四、基于哈希表的set总结 前言 根据应用场景的不同,STL总…...
(一)- DRM架构
一,DRM简介 linux内核中包含两类图形显示设备驱动框架: FB设备:Framebuffer图形显示框架; DRM:直接渲染管理器(Direct Rendering Manager),是linux目前主流的图形显示框架; 1&am…...
Docker了解
Docker是一种容器化技术,它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中,以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术,可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…...
【DL】YOLO11 OBB目标检测 | 模型训练 | 推理
本文进行YOLO11的旋转目标检测任务,旋转目标检测能够更精确地定位和描述那些非水平排列的目标,比如倾斜的飞机、船舶等。在原始的目标检测中,添加一个角度预测,实现定向边界框检测。 话不多说,先来个效果图!!! YOLO11中的旋转目标检测的特点 ▲更精确的定位:通过使用…...
vue读取本地excel文件并渲染到列表页面
1.安装插件(版本0.18.5) npm i xlsx 2.封装插件 <template><div class"container"><slot></slot></div> </template><script> import * as XLSX from xlsx export default {name: ReadExcel,props: {filePath: {type: …...
github 以及 huggingface下载模型和数据
runningcheese/MirrorSite: 镜像网站合集 (github.com) huggingface 下载模型和数据使用snapshot_download的方法 不会修改HuggingFace模型下载默认缓存路径?一篇教会你!_huggingface默认下载路径-CSDN博客 下载模型 使用snapshot_download 使用snapshot_down…...
使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏
作者:BLACK595 “小恐龙酷跑”,它是一款有趣的离线游戏,是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标, 但当我们按下空格后,小恐…...
51c视觉~合集6
我自己的原文哦~ https://blog.51cto.com/whaosoft/11603901 #CSWin-UNet 将自注意力机制集成到UNet中!CSWin-UNet:U型分割方法,显著提高计算效率和感受野交互!本文提出了CSWin-UNet,这是一种新颖的U型分割方法&…...
STM32(hal库)在串口中,USART和uart有什么区别?
在STM32的HAL库中,USART和UART都是用于串口通信的模块,但它们在功能特性和使用场景上存在一些区别。以下是对两者的详细比较: 一、功能特性 UART(通用异步收发器): 是一种串行、异步、全双工的通信协议。通…...
机器学习、深度学习面试知识点汇总
下面是本人在面试中整理的资料和文字,主要针对面试八股做浅显的总结,大部分来源于ChatGPT,中间有借鉴一些博主的优质文章,已经在各文中指出原文。有任何问题,欢迎随时不吝指正。 文章系列图像使用动漫 《星游记》插图…...
FPGA高速设计之Aurora64B/66B的应用与不足的修正
FPGA高速设计之Aurora64B/66B的应用与不足的修正 Aurora IP协议的特点 首先基于网上找到的一些资料,来讲述下Aurora高速协议的特点与相关的应用。Aurora 协议在 2002 年由 Xilinx 公司首次提出,是由Xilinx提供的一个开源、免费的链路层串行传输通信协议…...
如何通过PHP脚本自动推送WordPress文章至百度站长平台
想要提高网站在百度搜索中的曝光度?百度站长平台提供了一个非常方便的API接口,允许网站自动将新发布的内容推送至百度以加快收录。本文将带您一步步实现这一功能,帮助您的WordPress站点实现每日自动推送最新文章的URL至百度站长平台。 1. 前提条件 确保您有一个已安装并运行…...
ORA-01092 ORA-14695 ORA-38301
文章目录 前言一、MAX_STRING_SIZE--12C 新特性扩展数据类型 varchar2(32767)二、恢复操作1.尝试恢复MAX_STRING_SIZE参数为默认值2.在upgrade模式下执行utl32k.sql 前言 今天客户发来一个内部测试库数据库启动截图报错,描述是“上午出现服务卡顿,然后重…...
upload-labs通关练习---更新到15关
目录 环境搭建 第一关 方法一 修改文件类型 方法二 前端禁用JS绕过 第二关 方法一 修改Content-Type类型 方法二 修改上传文件类型 第三关 第四关 第五关 方法一 Windows大小写绕过 方法二 利用.user.ini 第六关 第七关 第八关 第九关 第十关 第十一关 第十二…...
WPF 应用程序中使用 Prism 框架时,有多种方式可以注册服务和依赖项
Prism 提供了更多的注册方式,适应不同的需求和场景。下面我会全面列出 IContainerRegistry 提供的所有常见注册方式,并附带相应的示例。1. 注册单例(Singleton) 注册单例类型服务,整个应用生命周期内只会创建一个实例&…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
