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

[单master节点k8s部署]23.构建EFK日志收集平台(二)

部署elasticsearch集群

已经完成的工作:创建存储。首先配置了nfs存储提供商(nfs-deployment.yaml),然后通过创建存储类(storageclass.yaml)来将nfs服务器与存储类绑定:

[root@master 31efk]# cat storageclass.yaml 
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: do-block-storage
provisioner: example.com/nfs

创建了elasticsearch的服务(elasticsearch_svc.yaml),定义了两个接口,一个是对外的,一个是elasticsearch集群内部通信的。

[root@master 31efk]# cat elasticsearch_svc.yaml 
kind: Service
apiVersion: v1
metadata:name: elasticsearch31namespace: kube-logging31labels:app: elasticsearch
spec:selector:app: elasticsearchclusterIP: Noneports:- port: 9200name: rest- port: 9300name: inter-node

现在创建elasticsearch的具体pod。

这里的集群创建方式为statefulset,因为elasticsearch需要稳定的pod管理和持久化的存储。

  1. 有状态服务:Elasticsearch节点存储数据,因此需要持久化存储(即磁盘卷),并且需要保证每个节点能够持有自己特定的数据,即使在Pod重启或迁移时。

  2. 稳定的网络标识:StatefulSet为每个Pod分配一个稳定且唯一的网络标识(DNS名),这对于Elasticsearch这样的分布式系统至关重要,因为节点之间需要通过固定的名称相互通信。

  3. 顺序部署和终止:StatefulSet保证Pod按照顺序创建和删除,这有助于Elasticsearch集群的节点顺利加入和退出,确保集群的健康状态。

elasticsearch的yaml文件

第一部分

第一部分,可以看到部署在kube-logging31命名空间,匹配了elasticsearch31的service。容器内部也开放对应的端口。

对于statefulset来讲,需要持久化存储,这里定义了PVC模板,用来从storageClass进行请求PV。(当 PVC 指定了某个 StorageClass 时,Kubernetes 会使用该 StorageClass 动态创建(或供应)一个 PV,并将其绑定到 PVC 上。)这里的PVC的name是data,这里容器绑定的存储名称也是data,路径为/usr/share/elasticsearch/data。

apiVersion: apps/v1
kind: StatefulSet
metadata:name: elastic-cluster31namespace: kube-logging31
spec:serviceName: elasticsearch31replicas: 3selector:matchLabels:app: elasticsearchvolumeClaimTemplates:- metadata:name: datalabels:app: elasticsearchspec:accessModes: [ "ReadWriteOnce" ]storageClassName: do-block-storageresources:requests:storage: 10Gi  template:metadata:labels:app: elasticsearchspec:containers:- name: elasticsearchimage: docker.elastic.co/elasticsearch/elasticsearch:7.2.0imagePullPolicy: IfNotPresentresources:limits:cpu: 1000mrequests:cpu: 100mports:- containerPort: 9200name: restprotocol: TCP- containerPort: 9300name: inter-nodeprotocol: TCPvolumeMounts:- name: datamountPath: /usr/share/elasticsearch/data   
第二部分

container的环境变量:这里设置的环境变量主要是为了进行一个集群的搭建,这里的集群和statefulset里面的name是不一样的,具体关系如下:

  • selector 主要用于 Kubernetes 内部,它负责确定哪些 Pods 属于哪个 StatefulSet,或者哪些 Pods 应该由某个服务来管理。但是,selector 并不能直接影响 Elasticsearch 集群的内部逻辑,也不能用来标识 Elasticsearch 中的节点。

  • 可以说selector主要方便容器的生命周期管理,不能控制elasticsearch集群内部的逻辑。而elasticsearch需要进行节点选举等更加精确的控制,因此还需要额外的配置。

  • node.name:作用于 Elasticsearch 层,是 Elasticsearch 集群中唯一标识每个节点的配置。每个 Elasticsearch 节点必须有一个唯一的 node.name,以便 Elasticsearch 能够正确地管理和协同多节点的操作,如主节点选举、数据分片分配等。

所以下面的container的环境变量就是规定了elasticsearch的集群名称,以及node.name。

由于在statefulset中,创建的pod的名字是固定的,名称格式是<statefulset-name>-<ordinal> 。由于statefulset的名称是es-cluster,所以pod的名称就是es-cluster31-0,es-cluster31-1,es-cluster31-2。而这里的discovery.seed_hosts是每一个pod的DNS地址,每一个pod的DNS地址格式为:

<pod-name>.<service-name>.<namespace>.svc.cluster.local

所以看到 discovery.seed_hosts:"es-cluster31-0.elasticsearch31.kube-logging31.svc.cluster.local,es-cluster31-1.elasticsearch31.kube-logging31.svc.cluster.local,es-cluster31-2.elasticsearch31.kube-logging31.svc.cluster.local"

          env:- name: cluster.namevalue: k8s-logs- name: node.namevalueFrom:fieldRef:fieldPath: metadata.name- name: discovery.seed_hostsvalue: "elastic-cluster31-0.elasticsearch31.kube-logging31.svc.cluster.local,elastic-cluster31-1.elasticsearch31.kube-logging31.svc.cluster.local,elastic-cluster31-2.elasticsearch31.kube-logging31.svc.cluster.local"- name: cluster.initial_master_nodesvalue: "elastic-cluster31-0,elastic-cluster31-1,elastic-cluster31-2"- name: ES_JAVA_OPTSvalue: "-Xms512m -Xmx512m"
第三部分 

这里的三个初始化容器是为了更好的准备elasticsearch的容器环境,确保在elasticsearch启动之前,所有的权限都已经配置正确。

fix-permission

第一个fix-permission是为了修复数据目录的权限。这里需要介绍pod的创建顺序。initcontainers 和主容器都是 Pod 的一部分。当 Kubernetes 创建 Pod 时,会按照以下顺序执行操作:

  1. 创建 Pod:Kubernetes 会首先创建整个 Pod 实体,包括其描述的所有容器(initContainers 和主容器)。
  2. 挂载卷(PVC):当 Pod 被创建时,Kubernetes 会根据 Pod 的定义(包括 volumeMounts 和 PersistentVolumeClaim)将所需的持久卷挂载到 Pod 中的指定路径。这一步是 在所有容器启动之前 完成的。
  3. 启动 initContainers:卷挂载完成后,Kubernetes 会启动 initContainers,这些容器可以访问 Pod 中已经挂载的卷。
  4. 启动主容器:当 所有 initContainers 成功运行完成 后,Kubernetes 才会启动主容器(即 Elasticsearch 容器)。

所以可以看到,在initContainer启动之前,持久卷的挂载已经到了pod的指定路径。但是Kubernetes 动态分配的存储卷(通过 PVC 申请的持久卷)可能默认具有不适合 Elasticsearch 的文件权限。

Elasticsearch 容器通常以特定用户身份(如 UID 1000)运行,而持久卷可能以 root 用户(UID 0)创建。为了让 Elasticsearch 拥有正确的访问权限,initContainer 需要修改挂载卷的数据目录权限。因此第一个initContainer:fix-permissions 容器的运行确保数据目录的权限是正确的(chown -R 1000:1000),这样 Elasticsearch 主容器启动时能够正常访问和写入数据。

initContainers:- name: fix-permissionsimage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]securityContext:privileged: truevolumeMounts:- name: datamountPath: /usr/share/elasticsearch/data- name: increase-vm-max-mapimage: busyboximagePullPolicy: IfNotPresentcommand: ["sysctl", "-w", "vm.max_map_count=262144"]securityContext:privileged: true- name: increase-fd-ulimitimage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "ulimit -n 65536"]securityContext:privileged: true
increase-vm-max-map

容器本质上是一个轻量级的隔离环境,在容器中运行的应用程序实际上是一个linux进程。一般来讲,linux会限制每一个进程的内存映射数量,从而限制这个进程对资源的消耗。

Luence是elasticsearch的核心技术,是一个全文检索技术。Luence通过使用操作系统的 内存映射(memory-mapped I/O) 技术来高效访问索引文件,尤其是在处理大规模的索引时。内存映射允许 Lucene 将磁盘上的索引文件映射为进程的虚拟内存空间,因此可以像访问普通内存一样访问这些文件。

但是对于elasticsearch这种日志收集的容器,linux给的 65530个内存映射区域是不够的当 Elasticsearch/Lucene 达到系统允许的最大内存映射区域数量时,操作系统会拒绝为新的索引文件或数据文件创建内存映射。这会导致 Lucene 无法加载新的索引文件,从而影响搜索和查询的执行。

所以这个increase-vm-max-map的容器,把vm-max-count的数量增加到了262144。

increase-fd-ulimit

这个容器用来提升进程可以打开的最大文件描述符的限制。

elasticsearch部署

随后进行elasticsearch的部署,发现三个容器正常启动:

[root@master 31efk]# kubectl get pods -n kube-logging31 -owide
NAME                  READY   STATUS    RESTARTS   AGE    IP               NODE    NOMINATED NODE   READINESS GATES
elastic-cluster31-0   1/1     Running   0          114s   10.244.104.62    node2   <none>           <none>
elastic-cluster31-1   1/1     Running   0          110s   10.244.166.184   node1   <none>           <none>
elastic-cluster31-2   1/1     Running   0          103s   10.244.104.63    node2   <none>           <none>

由于elasticsearch没有对外暴露端口,可以进行端口映射,然后在集群外面访问

kubectl port-forward elastic-cluster31-0 9200:9200 -n kube-logging31

然后打开另一个端口,进行访问,可以看到很多内容。

[root@master 31efk]# curl http://localhost:9200/_cluster/state?pretty
{"cluster_name" : "k8s-logs","cluster_uuid" : "4fuxJ67HSxSBsVDfKIA8Qg","version" : 17,"state_uuid" : "PpwhJDXlQvarKzCMhUy2Og","master_node" : "UWRrJRlCQ-uDcqZ3M6Y4YQ","blocks" : { },"nodes" : {"UWRrJRlCQ-uDcqZ3M6Y4YQ" : {"name" : "elastic-cluster31-1","ephemeral_id" : "S3NLgNGrRBOjWuoNC1CcHw","transport_address" : "10.244.166.185:9300","attributes" : {"ml.machine_memory" : "3953741824","ml.max_open_jobs" : "20","xpack.installed" : "true"}},"PlT4KVDFSI2qztJqF99eYw" : {"name" : "elastic-cluster31-2","ephemeral_id" : "z1akgw8xTjurYdq1_DZ7-Q","transport_address" : "10.244.104.1:9300","attributes" : {"ml.machine_memory" : "3953741824","ml.max_open_jobs" : "20","xpack.installed" : "true"}},"XXd95XfcRgW69C1ls0ZFTw" : {"name" : "elastic-cluster31-0","ephemeral_id" : "aKjaY6m0TbCTnynDPdD7JA","transport_address" : "10.244.104.2:9300","attributes" : {"ml.machine_memory" : "3953741824","ml.max_open_jobs" : "20","xpack.installed" : "true"}}},"metadata" : {"cluster_uuid" : "4fuxJ67HSxSBsVDfKIA8Qg","cluster_coordination" : {"term" : 1,"last_committed_config" : ["UWRrJRlCQ-uDcqZ3M6Y4YQ","PlT4KVDFSI2qztJqF99eYw","XXd95XfcRgW69C1ls0ZFTw"],"last_accepted_config" : ["UWRrJRlCQ-uDcqZ3M6Y4YQ","PlT4KVDFSI2qztJqF99eYw","XXd95XfcRgW69C1ls0ZFTw"],
...

其实如果不进行端口映射,在elasticsearch的内部也可以进行访问。可以看到elasticsearch的三个pod,他们之间可以互相发现。

[root@master 31efk]# kubectl exec -it elastic-cluster31-0 -n kube-logging31 -- /bin/bash
Defaulted container "elasticsearch" out of: elasticsearch, fix-permissions (init), increase-vm-max-map (init), increase-fd-ulimit (init)
[root@elastic-cluster31-0 elasticsearch]# curl http://localhost:9200/_cat/nodes?v
ip             heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.244.166.185           18          95   1    0.13    0.20     0.18 mdi       *      elastic-cluster31-1
10.244.104.1             17          88   0    0.02    0.05     0.08 mdi       -      elastic-cluster31-2
10.244.104.2             23          88   0    0.02    0.05     0.08 mdi       -      elastic-cluster31-0
pv和pvc
[root@master 31efk]# kubectl get pv --all-namespaces -owide
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS       REASON   AGE    VOLUMEMODE
pvc-124274e8-1977-4e46-895d-d6b9449682f7   10Gi       RWO            Delete           Bound    kube-logging31/data-elastic-cluster31-1   do-block-storage            145m   Filesystem
pvc-677221e5-ed6a-417b-ac69-6b90304afa4e   10Gi       RWO            Delete           Bound    kube-logging31/data-elastic-cluster31-0   do-block-storage            148m   Filesystem
pvc-944a372c-1c0d-442d-998a-b62c5be7ca21   10Gi       RWO            Delete           Bound    kube-logging31/data-elastic-cluster31-2   do-block-storage            144m   Filesystem
[root@master 31efk]# kubectl get pvc --all-namespaces -owide
NAMESPACE        NAME                       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE    VOLUMEMODE
kube-logging31   data-elastic-cluster31-0   Bound    pvc-677221e5-ed6a-417b-ac69-6b90304afa4e   10Gi       RWO            do-block-storage   149m   Filesystem
kube-logging31   data-elastic-cluster31-1   Bound    pvc-124274e8-1977-4e46-895d-d6b9449682f7   10Gi       RWO            do-block-storage   145m   Filesystem
kube-logging31   data-elastic-cluster31-2   Bound    pvc-944a372c-1c0d-442d-998a-b62c5be7ca21   10Gi       RWO            do-block-storage   145m   Filesystem

相关文章:

[单master节点k8s部署]23.构建EFK日志收集平台(二)

部署elasticsearch集群 已经完成的工作&#xff1a;创建存储。首先配置了nfs存储提供商&#xff08;nfs-deployment.yaml&#xff09;&#xff0c;然后通过创建存储类&#xff08;storageclass.yaml&#xff09;来将nfs服务器与存储类绑定&#xff1a; [rootmaster 31efk]# c…...

C#的属性(Property)应用说明(二)

Property的应用说明补充&#xff1a; 一.自定义逻辑&#xff1a; 可以在 get 和 set 访问器中包含自定义的逻辑。 public class Person {private string name;public string Name{get { return name; }set{if (string.IsNullOrWhiteSpace(value))throw new ArgumentException…...

VUE.js笔记

1.介绍vue Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 Vue 应用程序的基本…...

SpringBoot--yml配置文件的时间/大小的单位转换

原文网址&#xff1a;SpringBoot--yml配置文件的时间/大小的单位转换_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍SpringBoot的yml&#xff08;properties&#xff09;配置文件的时间/大小的单位转换。 概述 SpringBoot可以将yml中的配置绑定到一个Java类的字段&#x…...

【算法业务】互联网风控业务中的拒绝推断场景算法应用分享(涉及半监督算法、异常检测、变分自编码、样本权重自适应调整、迁移学习等)

1. 业务目标和任务描述 该项目是很早期的一个工作&#xff0c;属于互联网信贷风控场景&#xff0c;研究并应用信贷中的拒绝推断任务&#xff0c;处理方式也许对于目前的一些业务还有参考意义&#xff0c;因此这里做下分享。拒绝推断是指在信贷业务中&#xff0c;利用已知的接受…...

Windows PowerShell相关笔记

之前我写的一篇&#xff0c;把我的PS&#xff08;power shell&#xff09;该了配置文件 pyqt5vscode 配置坑笔记_vscode使用pyqt command failed-CSDN博客 文件里写的自动加载conda #region conda initialize # !! Contents within this block are managed by conda init !!…...

力扣9.24

2207. 字符串中最多数目的子序列 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern &#xff0c;两者都只包含小写英文字母。 你可以在 text 中任意位置插入 一个 字符&#xff0c;这个插入的字符必须是 pattern[0] 或者 pattern[1] 。…...

NRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块

nRF21540是一款射频前端模块(FEM)&#xff0c;可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备&#xff0c;nRF21540是一种“即插即用型”的无线传输范围扩展器&#xff0c;可与nRF52和nRF53系列的高级多协议无线SoC搭配使用&#xff0c;所需的外部器件数…...

2024最新Linux Socket编程

我们深谙信息交流的价值&#xff0c;那网络中进程之间如何通信&#xff0c;如我们每天打开浏览器浏览网页时&#xff0c;浏览器的进程怎么与web服务器通信的&#xff1f;当你用QQ聊天时&#xff0c;QQ进程怎么与服务器或你好友所在的QQ进程通信&#xff1f;这些都得靠socket&am…...

Linux下的驱动开发二

一、IO模型 I/O 模型在操作系统中用于处理应用程序与设备驱动之间的数据传输。I/O 通信模型的核心是解决程序与设备之间如何高效、合理地进行数据通信。不同的模型通过阻塞、非阻塞、同步、异步的方式来控制数据流和处理 I/O 请求。 注&#xff1a;在驱动开发中可以定义一个全…...

【JAVA报错已解决】 Java.lang.ArrayIndexOutOfBoundsException

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

2024 CSP 游记

J 组 初赛 早上也是五点钟就起来 打游戏 了。 考点在八达小学&#xff0c;除了感觉小、破、旧就没有其他感觉&#xff08; 我妈也是成功的给我提前一小时到达考场。 拿到试卷后&#xff0c;瞄一眼&#xff0c;咋这么简单&#xff0c;和一本通的模拟卷难度一样&#xff1f;…...

双十一有什么推荐好物?,这些你不能错过的宝藏好物推荐

随着双十一的临近&#xff0c;这场盛大的购物狂欢蓄势待发&#xff01;为了让大家不在琳琅满目的商品中徘徊&#xff0c;琪琪用心归纳了一份购物清单&#xff0c;分享那些我亲自使用过&#xff0c;觉得必须拥有的商品。 这些商品不仅价格公道&#xff0c;而且质量上乘&#xf…...

NSSCTF [HUBUCTF 2022 新生赛]simple_RE(变种base64编码)

文件无壳 拖入IDA中 shiftF12查看可疑字符串 发现两串字符串 一看这两个等于号就猜测是base64编码 进入主函数看看 这段代码是一个简单的 C 语言程序&#xff0c;主要功能是接受用户输入的字符串作为“flag”&#xff0c;然后通过对输入的字符串进行一些处理和比较来验证是否输…...

clickhouse使用extract提取分号之前,之后,中间的内容

Area&#xff1a;‘安徽;宣城;宣州’&#xff0c;要提取分号之前&#xff0c;两个分号之前&#xff0c;最后一个分号之后的内容作为省市区 这是最后得到的正确的结果&#xff0c;感谢chatgpt 刚开始本来想使用splitByString -- 宣城 select splitByString(;,安徽;宣城;宣州)[2…...

Unity3D Compute Shader同步详解

前言 在Unity3D中&#xff0c;Compute Shader是一种强大的工具&#xff0c;它利用GPU的并行处理能力来执行复杂的计算任务&#xff0c;从而减轻CPU的负担&#xff0c;提高游戏的性能和效率。然而&#xff0c;由于GPU的工作方式&#xff0c;对共享资源的访问需要特别注意同步问…...

3D模型在UI设计中应用越来越多,给UI带来了什么?

当前3D模型在UI设计中应用很多&#xff0c;极大地拓展了UI设计的发挥空间&#xff0c;也拓宽了UI的应用领域&#xff0c;本文分享下UI中引入3D模型到底能带来什么价值. 3D模型在UI设计中的应用可以给用户界面带来以下几个方面的好处&#xff1a; 更真实的视觉体验&#xff1a;…...

前端框架的选择与考量:一场技术的盛宴

在当今快速迭代的Web开发领域&#xff0c;前端框架的选择成为了项目启动初期不可忽视的重要环节。随着React、Vue、Angular等主流框架的崛起&#xff0c;以及Svelte、Quasar等新兴力量的加入&#xff0c;开发者们面临着前所未有的选择难题。本文旨在探讨前端框架的选择依据、主…...

第五部分:7---信号的捕捉

目录 信号递达期间&#xff0c;该信号会被屏蔽直到递达完成。 sigaction实现信号的捕捉&#xff1a; 案例&#xff1a;在处理2号信号时屏蔽3号信号。 子进程退出向父进程发送SIGCHLD信号&#xff1a; 信号递达期间&#xff0c;该信号会被屏蔽直到递达完成。 当某个信号的处…...

HarmonyOS鸿蒙开发实战( Beta5.0)页面加载效果实现详解实践案例

鸿蒙HarmonyOS开发实战往期必看文章&#xff1a;&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发性能实践总结&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发案例实践总结合集&#xff08;持续更新......&#xff09; 一分钟了解”纯血版&…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...