深入探索Hadoop技术:全面学习指南

news/2024/5/3 7:49:41

引言

在大数据时代,高效地存储、处理和分析海量数据已成为企业决策与创新的关键驱动力。Hadoop,作为开源的大数据处理框架,以其强大的分布式存储和并行计算能力,以及丰富的生态系统,为企业提供了应对大规模数据挑战的有效解决方案。本文旨在为初学者和进阶者提供一份详尽的Hadoop技术学习指南,涵盖HDFS、MapReduce、YARN等核心组件,以及Hive、Pig、HBase等生态系统工具,助您踏上Hadoop技术学习之旅。

 

一、Hadoop Distributed File System (HDFS)

Hadoop Distributed File System (HDFS) 是一个高度容错、适合大规模数据集的分布式文件系统,是Hadoop生态系统的核心组成部分。下面通过一个具体例子来详细解释HDFS的主要特性和工作原理。

例子: 假设我们有一个大型电子商务公司,每天会产生数TB的交易数据。这些数据包括用户的购买记录、浏览行为、商品信息等。为了便于长期存储、管理和分析这些海量数据,公司决定采用HDFS作为其大数据平台的基础存储层。

详细解释:

1.数据分块与存储:

  • 数据分块:HDFS将大文件自动切分成固定大小的数据块(默认为128MB或256MB)。例如,一个1GB的交易日志文件会被拆分成8个(假设数据块大小为128MB)数据块。这种设计有利于并行处理和分布式存储。
  • 分布式存储:每个数据块会被复制到多台服务器(DataNode)上,形成多个副本。默认情况下,HDFS会保存3个副本,分别存储在不同的服务器或机架上,以提高数据冗余度和容错性。在这个例子中,8个数据块会在集群内的多个DataNode上分散存储,每个数据块有3个副本。

2.元数据管理:

  • NameNode:HDFS有一个中心化的元数据管理节点,即NameNode。它负责维护整个文件系统的命名空间,包括文件与目录的层级结构、文件到数据块的映射关系以及每个数据块的所有副本位置信息。在我们的例子中,NameNode会记录每个交易日志文件的数据块ID、每个数据块的多个副本所在的DataNode地址等信息。

3.读写操作:

  • 写入过程:当客户端(如数据分析应用)要写入交易数据时,首先向NameNode请求写入操作。NameNode根据负载均衡和副本策略确定数据块应存储在哪些DataNode上。客户端随后直接与这些DataNode通信,按顺序逐块写入数据。NameNode跟踪写入进度,待所有数据块都成功写入并确认后,写操作完成。
  • 读取过程:客户端读取交易数据时,先向NameNode请求文件的元数据信息。NameNode返回文件的数据块列表及其对应的DataNode地址。客户端根据这些信息,直接与存储数据块的最近或最快的DataNode建立连接,读取所需数据。如果文件很大,客户端可能同时从多个DataNode并行读取不同数据块,提升读取速度。

4.容错与高可用性:

  • 副本一致性:DataNode定期向NameNode发送心跳信息,报告自身及存储数据块的状态。若某个DataNode失效或数据块损坏,NameNode会检测到并触发复制过程,确保每个数据块始终维持所需的副本数。
  • NameNode高可用:在生产环境中,通常会部署NameNode的高可用(HA)方案,如使用Active/Standby架构,配置两个NameNode节点互为备份。当主NameNode出现故障时,备用节点可以快速接管,确保元数据服务的连续性。

5.管理与监控:

  • 命令行工具:HDFS提供了丰富的命令行工具(如hdfs dfs)供管理员和用户进行文件系统操作,如查看目录结构、上传下载文件、更改文件权限等。
  • Web UI:NameNode和DataNode都提供Web界面,用于监控集群状态、查看节点详细信息、分析存储使用情况等。

通过上述例子和详细解释,我们可以看到HDFS是如何通过分布式存储、数据分块、元数据管理、容错机制等设计,为大型电子商务公司的海量交易数据提供高效、可靠、易于管理的存储服务的。这样的架构使得公司能够快速存储、检索和分析数据,为业务决策、产品优化、个性化推荐等应用场景提供有力支持。

二、MapReduce编程模型

MapReduce编程模型是Hadoop提供的一个分布式并行计算框架,用于处理大规模数据集。下面通过一个具体的例子来详细解释MapReduce的工作原理和使用场景。
例子: 假设一家社交媒体公司需要统计过去一年内其平台上所有用户的活跃天数,即每位用户在多少天内至少有一次发帖行为。数据存储在HDFS中,每条记录包含用户ID和发帖日期(格式为YYYY-MM-DD)。目标是生成一个汇总结果,表示每个用户的活跃天数。

详细解释:

1.Map阶段:

  • Mapper函数:编写一个Java类实现Mapper接口,定义map()方法。输入是一条文本记录(用户ID和发帖日期),输出是键值对<用户ID, 日期>。Map任务会对输入数据集中的每一条记录执行此方法。
   public class ActiveDaysMapper extends Mapper<LongWritable, Text, Text, Text> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String[] parts = line.split("\t"); // 假设数据按制表符分隔String userId = parts[0];String postDate = parts[1];context.write(new Text(userId), new Text(postDate));}}
  • 数据分发:Hadoop会将输入数据集按照HDFS数据块的边界划分为多个分片(split),每个分片分配给一个Map任务。Map任务在本地处理其分片数据,生成大量的<用户ID, 日期>键值对。

2.Shuffle & Sort阶段:

  • Partitioning:根据用户ID对键值对进行分区,相同用户ID的所有键值对会被分到同一个Reducer。
  • Sorting:在每个Reducer接收的数据范围内,对键值对进行排序。由于键是用户ID,所以同一用户的所有日期会按升序排列。
  • Combine(可选):对于某些数据集,可以在Map端进行局部的Reduce操作(combine),如计数、求和等,减少网络传输数据量。本例中不适用。

3.Reduce阶段:

  • Reducer函数:编写一个Java类实现Reducer接口,定义reduce()方法。输入是一组键相同的<用户ID, 日期>键值对,输出是<用户ID, 活跃天数>。Reduce任务对每个用户的所有日期进行处理,计算活跃天数。
   public class ActiveDaysReducer extends Reducer<Text, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text resultUserId = new Text();private Set<String> activeDaysSet = new HashSet<>();@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {activeDaysSet.clear();for (Text value : values) {activeDaysSet.add(value.toString());}int activeDays = activeDaysSet.size();resultUserId.set(key);context.write(resultUserId, new IntWritable(activeDays));}}
  • 结果生成:Reduce任务遍历其处理范围内的所有键值对,对每个用户ID对应的日期集合计算其大小(即元素个数),得到活跃天数。最后,输出<用户ID, 活跃天数>键值对。

4.Job配置与执行:

  • Job设置:使用Job对象配置MapReduce作业,指定输入、输出路径、Mapper类、Reducer类等。
   Job job = Job.getInstance(conf, "User Active Days Count");job.setJarByClass(ActiveDaysJob.class);job.setMapperClass(ActiveDaysMapper.class);job.setReducerClass(ActiveDaysReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(inputPath));FileOutputFormat.setOutputPath(job, new Path(outputPath));
  • 作业提交与监控:提交作业到Hadoop集群,并通过命令行工具或Web UI监控作业执行状态和进度。

通过上述例子和详细解释,我们可以看到MapReduce编程模型如何将复杂的统计任务分解为一系列简单的Map和Reduce操作,实现对大规模数据集的高效并行处理。在这个例子中,MapReduce帮助社交媒体公司快速准确地计算出每位用户的活跃天数,为用户行为分析、用户价值评估、运营策略制定等业务决策提供数据支持。

三、Hadoop YARN (Yet Another Resource Negotiator)

Hadoop YARN (Yet Another Resource Negotiator) 是Hadoop 2.x及以后版本引入的资源管理和调度平台,负责管理集群的计算资源,并为各类分布式应用程序提供运行环境。下面通过一个具体的例子来详细解释YARN的工作原理和使用场景。

例子: 假设一家在线广告公司使用Hadoop集群进行大规模数据处理和机器学习训练。他们每天需要运行多种类型的任务,包括基于MapReduce的ETL作业、Spark SQL查询、TensorFlow深度学习模型训练等。YARN作为集群的统一资源管理系统,负责调度和管理这些任务的执行。

详细解释:

1.架构与组件:

  • ResourceManager (RM):YARN的全局资源管理器,负责整个集群的资源分配和调度。RM有两个主要子组件:
    • Scheduler:纯粹的资源调度器,根据预定的策略将资源分配给应用程序。例如,可以使用容量调度器(Capacity Scheduler)或公平调度器(Fair Scheduler)。
    • ApplicationManager (AM):负责接收用户提交的应用程序请求,协商第一个Container(资源容器)供AM使用,之后由AM与RM的Scheduler交互获取更多资源。
  • NodeManager (NM):每个计算节点上的代理,负责管理该节点上的Container,监控其资源使用情况,并向RM汇报。
  • ApplicationMaster (AM):每个应用程序的专用协调进程,负责与RM协商资源(Container)、与NM通信以启动/监控任务,并负责应用程序的完整生命周期管理。例如,MapReduce作业的AM就是JobHistoryServer,Spark作业的AM则是Spark Driver。

2.应用程序提交与执行:

  • 应用程序提交:用户通过命令行工具或API提交应用程序到RM,提交的信息包括应用程序类型(如MapReduce、Spark)、应用程序依赖(如jar包、配置文件)、资源需求(如CPU核数、内存大小)等。
  • AM启动:RM收到提交请求后,为应用程序分配第一个Container供AM使用。NM在该节点上启动AM进程。
  • 资源请求与分配:AM启动后,向RM的Scheduler请求所需资源(Container)。Scheduler根据策略分配资源,并通知NM启动相应的任务(如Mapper、Reducer、Executor等)。
  • 任务执行与监控:NM在获得资源分配后,在本地节点上启动任务,并监控其执行情况。任务执行过程中产生的标准输出和错误输出被重定向到日志文件,供用户查看和调试。
  • 任务完成与资源回收:当所有任务完成后,AM向RM注销并释放所有已分配的资源。RM更新集群资源状态,准备接受新的应用程序请求。

3.资源调度策略:

  • 容量调度器:按照队列划分资源,每个队列可设置最大资源份额。在队列内部,任务按照先到先服务(FIFO)或公平共享(fair share)原则分配资源。
  • 公平调度器:同样支持队列划分,但更强调资源的公平分配。即使后来提交的任务,只要其队列尚有资源配额,也能获得相对公平的资源份额。

4.监控与管理:

  • Web UI:YARN提供Web界面,展示集群整体状态、各个应用程序的运行情况、节点资源使用详情等,便于管理员监控和故障排查。
  • 命令行工具:如yarn application命令,可用于查看应用程序状态、杀死应用程序等操作。

在这个例子中,YARN作为在线广告公司的Hadoop集群的资源管理系统,能够有效地调度和管理多种类型的任务,确保计算资源的高效利用和任务的顺利执行。通过YARN,公司可以灵活地运行各种大数据处理和机器学习作业,满足日常数据分析、模型训练、效果预测等业务需求,从而提升广告投放效果和客户满意度。

四、Hadoop生态系统组件

Hadoop生态系统包含了一系列围绕Hadoop核心(HDFS、MapReduce、YARN)构建的工具、框架和库,旨在扩展Hadoop的功能,简化大数据处理流程,满足不同类型的分析需求。下面列举几个典型的Hadoop生态系统组件,并通过具体例子进行详细解释。

1. Apache Hive
例子:某互联网公司需要对用户行为日志进行频繁的SQL查询分析,如计算每日活跃用户数、用户留存率、热门页面访问量等。由于原始日志数据以半结构化文本形式存储在HDFS上,直接进行SQL查询非常困难。公司决定使用Hive将这些数据转换为表结构,并提供SQL接口。

详细解释:

  • 数据仓库:Hive是一个基于Hadoop的数据仓库工具,提供了一种SQL-like查询语言(HQL)来查询存储在HDFS上的数据。用户可以通过定义Hive表结构映射到HDFS上的数据文件,实现数据的结构化管理。
  • SQL查询:分析师可以直接使用HQL编写SQL查询,如SELECT date, COUNT(DISTINCT user_id) FROM user_activity GROUP BY date,来计算每日活跃用户数。Hive将这些查询转化为MapReduce作业或Tez/DAG作业(取决于配置),在Hadoop集群上执行。
  • 元数据管理与优化:Hive使用 metastore 存储表结构、分区信息等元数据,并提供查询优化器对HQL进行解析、逻辑优化和物理计划生成,以提高查询效率。
  • 与BI工具集成:Hive可以通过JDBC/ODBC接口与商业智能(BI)工具如Tableau、Power BI等无缝对接,使得非技术人员也能轻松进行数据分析。

2. Apache Pig
例子:一家电信公司在进行网络流量分析时,需要清洗、转换大量原始日志数据,然后进行聚合统计。使用传统的编程方式开发和维护这样的数据管道既耗时又容易出错。他们选择使用Pig来简化数据处理流程。

详细解释:

  • 数据流语言:Pig提供了一种名为Pig Latin的声明式数据流语言,允许用户以类似SQL的方式描述数据处理逻辑,而无需关注底层MapReduce实现细节。例如,清洗和聚合流量日志的Pig脚本可能如下:

  raw_logs = LOAD 'hdfs://path/to/logs' USING PigStorage('\t') AS (user_id:chararray, timestamp:long, bytes_sent:int);
  filtered_logs = FILTER raw_logs BY bytes_sent > 0;
  grouped_logs = GROUP filtered_logs BY user_id;
  daily_usage = FOREACH grouped_logs GENERATE group AS user_id, SUM(filtered_logs.bytes_sent) AS total_bytes;
  STORE daily_usage INTO 'hdfs://path/to/results';
  

  • 编译与优化:Pig Latin脚本会被Pig编译器转换为一系列MapReduce作业,并进行逻辑优化,如合并小文件、推导reduce阶段的key类型等,以提高执行效率。
  • UDFs与扩展:Pig支持用户自定义函数(UDFs),允许开发者使用Java、Python等语言编写定制化的数据处理逻辑,进一步扩展Pig的功能。

3. Apache HBase
例子:一家社交网络平台需要实时查询用户的基本信息、好友关系、最近动态等数据,传统的关系型数据库难以应对这种大规模、高并发、低延迟的查询需求。他们选择使用HBase作为实时数据存储系统。

详细解释:

  • 列式NoSQL数据库:HBase是一种基于HDFS的分布式、面向列族的NoSQL数据库,特别适合存储海量、稀疏、读多写少的数据。它提供了高性能、随机访问的能力,支持实时查询和更新。
  • 数据模型与表设计:在HBase中,数据以行键、列族、列限定符和时间戳的形式组织。例如,用户表可能设计为:行键为用户ID,列族分别为basic_info(存储用户名、性别等)、friendship(存储好友关系)和recent_activity(存储最近动态)。查询时,可以通过行键直接定位到用户的所有信息。
  • 客户端API与查询:应用程序可以通过HBase的Java API、RESTful API或Phoenix(SQL查询层)与HBase交互,进行数据的增删改查操作。例如,使用Java API获取用户的基本信息:
  Get get = new Get(Bytes.toBytes("user123"));Result result = table.get(get);byte[] nameBytes = result.getValue(Bytes.toBytes("basic_info"), Bytes.toBytes("name"));String userName = Bytes.toString(nameBytes);

以上例子展示了Hive、Pig和HBase这三个Hadoop生态系统组件在实际场景中的应用,它们分别在SQL查询、数据流处理和实时数据库方面极大地丰富了Hadoop平台的功能,使用户能够更便捷、高效地处理和分析大数据。实际上,Hadoop生态系统还包括Spark、Flink、Hue、Oozie、ZooKeeper等诸多其他组件,共同构成了一个功能强大、高度可扩展的大数据处理平台。

五、运维与管理

Hadoop集群的运维与管理涵盖了从部署、配置、监控到故障排查、性能调优、安全控制等一系列活动,旨在确保集群稳定、高效地运行并满足业务需求。以下通过具体例子来详细解释Hadoop运维与管理的关键环节:

1. 集群部署与配置
例子:某金融公司计划搭建一个包含10台服务器的Hadoop集群,包括3台NameNode(高可用配置)、3台ResourceManager、4台DataNode和NodeManager。他们需要进行合理的硬件选型、软件安装、配置文件设置等工作。

详细解释:

  • 硬件选型:根据业务规模和预期负载选择合适的服务器硬件,考虑CPU、内存、硬盘(SSD vs HDD)、网络带宽等因素。为保证数据冗余和高可用性,可能需要配置RAID阵列或使用独立的存储服务器。
  • 软件安装:安装操作系统(如Linux),配置基本网络服务(如DNS、NTP),确保所有服务器之间能正常通信。接着安装Hadoop相关软件包,如HDFS、YARN、Hadoop Common等,并设置适当的Java环境。
  • 配置文件设置:根据集群拓扑和业务需求配置Hadoop的各种配置文件,如hdfs-site.xml(HDFS配置)、yarn-site.xml(YARN配置)、core-site.xml(全局配置)等。这包括设定NameNode和ResourceManager的HA配置、数据块副本数、资源分配策略、安全认证模式等。
  • 集群初始化:执行格式化NameNode、启动Hadoop守护进程、创建必要目录、验证集群健康状态等操作,完成集群部署。

2. 监控与告警
例子:为确保集群稳定运行,运维团队需要实时监控集群各项指标,如节点状态、磁盘使用率、CPU利用率、内存使用率、网络流量等,并设置合理的告警阈值,以便及时发现并处理问题。

详细解释:

  • 监控工具:使用Hadoop自带的Web UI(如NameNode UI、ResourceManager UI)或第三方监控工具(如Ganglia、Prometheus、Zabbix等)收集和展示集群性能数据。
  • 告警设置:配置监控系统发送邮件、短信或推送通知给运维人员,当关键指标超过预设阈值(如磁盘使用率达到80%、节点离线、作业长时间无响应等)时触发告警。
  • 日志分析:定期检查Hadoop守护进程和应用程序的日志文件,利用日志分析工具(如Logstash、Fluentd、ELK Stack等)进行集中收集、过滤、索引和搜索,辅助故障排查。

3. 故障排查与恢复
例子:某天,运维团队收到告警,提示部分DataNode节点离线。他们需要迅速定位问题并恢复服务。

详细解释:

  • 问题定位:通过查看受影响节点的日志、使用Hadoop命令(如hdfs dfsadmin -report、yarn node -status)检查节点状态、登录节点排查硬件故障、网络问题或软件冲突。
  • 故障恢复:根据问题原因采取相应措施,如重启离线节点、修复网络配置、调整系统参数、清理无效数据、重新加入集群等。对于严重故障,可能需要执行数据恢复操作或使用备用节点替换故障节点。

4. 性能调优
例子:随着业务增长,公司发现Hadoop作业执行速度变慢,影响数据分析效率。运维团队需要对集群进行性能调优,提升作业执行速度。

详细解释:

  • 性能分析:使用Hadoop提供的工具(如JobHistory Web UI、Resource Manager UI、Hadoop Metrics2)或第三方工具(如Dr. Elephant、Ganglia)分析作业执行情况,识别瓶颈所在,如I/O密集型任务、CPU密集型任务、内存不足、数据倾斜等。
  • 调优措施:根据分析结果采取相应调优措施,如调整Hadoop配置参数(如mapreduce.map.memory.mb、yarn.scheduler.capacity.root.default.maximum-capacity)、优化作业代码(如减少shuffle数据、使用更高效的算法)、调整硬件资源(如增加内存、使用更快的磁盘)等。

5. 安全管理
例子:公司出于数据安全和合规要求,需要在Hadoop集群中实施访问控制、数据加密、审计等功能。

详细解释:

  • 访问控制:启用Kerberos或LDAP进行身份认证,配置Hadoop的ACL(Access Control List)管理文件和目录的访问权限,限制用户和组对HDFS资源的操作权限。
  • 数据加密:启用HDFS透明数据加密(Transparent Data Encryption, TDE),对存储在HDFS上的敏感数据进行加密,确保数据在静止状态下的安全性。
  • 审计追踪:开启Hadoop审计日志,记录用户对HDFS和YARN资源的所有操作,便于事后审计和问题追溯。

综上所述,Hadoop集群的运维与管理涉及多个层面的工作,包括集群部署与配置、监控与告警、故障排查与恢复、性能调优以及安全管理。通过有效运维,可以确保Hadoop集群稳定、高效地服务于各类大数据处理任务,满足业务需求并保障数据安全。

结语

学习Hadoop技术是一个理论与实践紧密结合的过程。通过深入理解HDFS、MapReduce、YARN等核心组件,熟练掌握Hive、Pig、HBase等生态工具,并在实践中不断优化集群配置与作业性能,您将能够驾驭Hadoop的强大能力,从容应对大数据处理挑战。随着技术的不断发展,持续关注Hadoop的新版本特性、替代与补充技术,将有助于您在大数据领域保持竞争力,推动企业的数据驱动转型。


http://www.mrgr.cn/p/35745630

相关文章

RAG 2.0架构详解:构建端到端检索增强生成系统

关于检索增强生成(RAG)的文章已经有很多了,如果我们能创建出可训练的检索器,或者说整个RAG可以像微调大型语言模型(LLM)那样定制化的话,那肯定能够获得更好的结果。但是当前RAG的问题在于各个子模块之间并没有完全协调,就像一个缝合怪一样,虽然能够工作但各部分并不和…

东方博宜 1157. 最小数

东方博宜 1157. 最小数 今天不想写思路&#xff0c;乱糟糟的&#xff0c;能运行就拉倒了 #include <iostream> using namespace std; int main() {int n ;int a[201] ;cin >> n ;for(int i 1 ; i < n ; i){cin >> a[i] ; } int j ;j 1 ;for(int i 1…

Java对接第三方接口C#语言 请求是xml格式方式

文章目录 目录 文章目录 安装流程 小结 概要写法流程技术细节小结 概要 实现方式通过标签方式获取一个Body内标签的信息一步一步解析到需要获取到的数据信息 写法流程 技术细节 先和对面对接项目的开发拿到postman接口数据信息&#xff0c;然后再本地跑通接口&#xff0c;再进…

荣誉

荣誉 个人 学习委员 国防教育先锋队 朋辈导师 优秀团员 省级三好学生 职业技能大赛网络安全 河南省第七届御网杯信息安全大赛三等奖第二十届全国大学生信息安全对抗技术竞赛 ​ 数通 H3C认证路由交换网络工程师.pdf H3CSE-RS-IPv6.pdf 华为ICT网络赛道三等奖华为 HarmonyOS应用…

Windows10中多屏显示器型号获取并与Screen对应

需求:标识某块屏,不参与窗口快速移动 @@@codepublic class Monitor{/// <summary>/// DeviceID,如: \\.\DISPLAY17/// </summary>public String DeviceName { get; set; } /// <summary>/// 名称,如: Default_Monitor/// </summary>public…

制作适用于openstack平台的win10镜像

1. 安装准备 从MSDN下载windows 10的镜像虚拟机开启CPU虚拟化的功能。从Fedora 网站下载已签名的 VirtIO 驱动程序 ISO 。 创建15 GB 的 qcow2 镜像&#xff1a;qemu-img create -f qcow2 win10.qcow2 15G 安装必要的软件 yum install qemu-kvm qemu-img virt-manager libvir…

ubuntu20 解决网线不能联网 RTL8111/8168/8411

这种问题一般是驱动没有正确安装。 ----RTL8111/8168/8411是一块比较坑的网卡。 1、 查看网卡信息 lspci |grep Ethernet2、 对于高版本的Ubuntu&#xff0c;能直接使用命令安装驱动。下面的r8168-dkms需根据网卡信息修改&#xff0c;上面的网卡信息还有8111&#xff0c;但逐个…

【云原生】Spring Cloud微服务学习路线汇总

【云原生】Spring Cloud微服务学习路线汇总Spring Cloud是什么?简单来说Spring Cloud是一系列框架的组成集合。主要利用的我们现在主流应用的Spring Boot框架开发便利性、巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监…

ROS笔记5--动作通讯

1、动作通讯简介 机器人是一个复杂的智能系统,并不仅仅是键盘遥控运动、识别某个目标这么简单,我们需要实现的是送餐、送货、分拣等满足具体场景需求的机器人。在这些应用功能的实现中,另外一种ROS通信机制也会被常常用到——那就是动作。 从这个名字上就可以很好理解这个概…

c# 中 dataGridView控件 显示水平滚动条

1. 最主要的在dataGridView控件属性中的ScrollBars是否设为BothBoth代表水平和垂直方向根据实际需求自动显示滚动条None 代表水平和垂直都不显示滚动条Vertical 代表只垂直显示滚动条Horizontal 代表只水平显示滚动条 2.检查表格中每个列的属性,看 Frozen 应设置为 false 如果…

Kubernetes(k8s)与docker的区别

Kubernetes(k8s)与docker的区别k8s与docker的区别Kubernetes (通常简称为"k8s") 和 Docker 是两个不同的技术,它们在容器化应用程序方面扮演着不同的角色。Docker 是一种开源的容器化技术,它允许应用程序在一个独立、可移植的容器中运行。容器化是一种将应用程序…

vue框架中的路由

vue框架中的路由 一.VueRouter的使用&#xff08;52&#xff09;二.路由模块封装三.声明式导航 - 导航链接1.router-link-active类名2.router-link-exact-active类名3.声明式导航-自定义类名 四.查询参数传参五.动态路由传参方式查询参数传参 VS 动态路由传参 六.动态路由参数的…

VKL144C/D LQFP48/SSOP48仪器仪表超低功耗/超省电LCD液晶段码驱动IC适用于分贝仪、测光仪、测厚仪可驱动36SEGx4COM

VKL144C/D概述: VKL144C/D是一个点阵式存储映射的LCD驱动器,可支持最大144点(36SEGx4COM)的 LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通 过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表 类产…

196. 删除重复的电子邮箱【Problem:Every derived table must have its own alias】

SQL-Boy上线,最近在写SQL语句遇到了这样的问题。 Problem:Every derived table must have its own alias 错误语句如下 delete from Person where id not in (select id from (select min(id) as idfrom Person group by email));百度一波 【mysql解决方案】ERROR 1248 (4200…

[Python开发问题] Selenium ERROR: Unable to find a matching set of capabilities

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Occ求点到直线的距离

计算一个点到2d基本曲线的距离使用这个类Extrema_ExtPElC2d。距离可以是最小或者最大。 Extrema是极值的意思,P是point点,ELC是elementary curve基本曲线。点到直线的距离 假设一个点 Y 和一条直线 L直线 L 的参数形式为 $ X(t) = P + t\overrightarrow{d} $ // 式11. 先求…

vscode使用PasteImage插入图片

vscode使用PasteImage插入图片 需求 在vscode中写Markdown文件,经常需要插入图片,使用插件Paste Image进行简单配置后,就可以方便插入图片并自动存放到相应路径的文件夹中 安装及配置 安装从扩展商店搜索Paste Image并安装即可配置vscode设置中搜索Paste Image,找到Paste I…

【个人博客搭建】(3)添加SqlSugar ORM 以及Json配置文件读取

1、安装sqlsugar。在models下的依赖项那右击选择管理Nuget程序包&#xff0c;输入sqlsugarcore&#xff08;因为我们用的是netcore&#xff0c;而不是net famework所以也对应sqlsugarcore&#xff09;&#xff0c;出来的第一个就是了&#xff0c;然后点击选择版本&#xff0c;一…

【机器学习】三种基本损失函数

参考:“损失函数”是如何设计出来的?直观理解“最小二乘法”和“极大似然估计法”_哔哩哔哩_bilibili “交叉熵”如何做损失函数?打包理解“信息量”、“比特”、“熵”、“KL散度”、“交叉熵”_哔哩哔哩_bilibili 《信息论基础》三种基本损失函数任务:衡量人脑与神经网络…

Gartner 《2024安全和风险管理技术路线图》:高价值技术 DSP 进入广泛部署阶段

近期&#xff0c;Gartner 发布《2024年技术采用路线图&#xff1a;安全与风险管理》&#xff08;以下简称&#xff1a;《路线图》&#xff09;&#xff0c;该信息图表识别了全球企业正在采用的 44 种与安全相关的技术&#xff0c;并根据采用阶段、部署风险和企业价值进行了映射…