EFK架构部署

news2024/9/24 11:31:13

7.17版本

准备工作

配置域名

cat >> /etc/hosts <<'EOF'
192.168.199.149 elk149daidaiedu.com
192.168.199.150 elk150daidaiedu.com
192.168.199.155 elk155daidaiedu.com
EOF

修改主机名

hostnamectl set-hostname elk155.daidaiedu.com

免密登录

ssh-keygen
ssh-copy-id elk150.daidaiedu.com
ssh-copy-id elk155.daidaiedu.com

安装同步工具rsync

yum install rsync -y
编写同步脚本
vim /usr/local/sbin/data_rsync.sh
#!/bin/bash
​
if [ $# -ne 1 ];then
    echo "Usage: $0 /path/file(绝对路径)"
    exit
fi
#判断文件是否存在
if [ ! -e $1 ];then
    echo "[ $1 ] dir or file not find!"
    exit
fi 
#获取父路径
fullpath=`dirname $1`
#获取子路径
basename=`basename $1`
#进入到父目录
cd $fullpath
​
for ((host_id=102;host_id<=105;host_id+=3))
    do
    echo ===== rsyncing elk${host_id}.daidaiedu.com: $basename =====
    rsync -az $basename `whoami`@elk${host_id}.daidaiedu.com:$fullpath
    if [ $? -eq 0 ];then
        echo "执行成功"
    fi
done
​
测试rsync是否同步

集群时间同步

yum install ntpdate chrony
​
vim /etc/chrony.conf
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server ntp5.aliyun.com iburst
​
修改完重启服务
systemtl restart chronyd

查看服务配置文件

systemctl cat elasticsearch
9300端口:各个节点之间相互之间通信,tcp协议,传输层
9200端口:和外部集群通信,http,应用层

EFK架构

files---->filbeat----->es集群<--------kibana

部署elasticsearch

[root@elk149 ~]# grep -Ev '^$|^#' /etc/elasticsearch/elasticsearch.yml
cluster.name: daidai-elk
node.name: elk149
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["192.168.199.149","192.168.199.150","192.168.199.155"]
注意:在另外两台服务器上配置,注意修改node.name和network.host,cluster.name必须一致
systemctl restart elasticsearch
​
​
完成后测试
curl 192.168.199.149:9200
[root@elk149 ~]# curl 192.168.199.149:9200
{
  "name" : "elk149",
  "cluster_name" : "daidai-elk",
  "cluster_uuid" : "MYa5wN0PQFmi4nH-2T-zlQ",
  "version" : {
    "number" : "7.17.3",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "5ad023604c8d7416c9eb6c0eadb62b14e766caff",
    "build_date" : "2022-04-19T08:11:19.070913226Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
​
或者在浏览器上输入 
http://192.168.199.150:9200/_cat/nodes?v
​
ip              heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.199.150           40          97   4    0.04    0.04     0.08 cdfhilmrstw -      elk150
192.168.199.149           40          98   1    0.00    0.01     0.05 cdfhilmrstw *      elk149
192.168.199.155           34          96   4    0.23    0.08     0.08 cdfhilmrstw -      elk155

部署Kibana

[root@elk155 kibana]# grep -Ev  '^$|^#' kibana.yml
server.host: "0.0.0.0"
server.name: "daidai-kib"
elasticsearch.hosts: ["http://192.168.199.155:9200","http://192.168.199.149:9200","http://192.168.199.150:9200"]
i18n.locale: "zh-CN"

在manager下面找到《堆栈检测》  

显示三个节点正常

部署filebate

部署在监控应用的主机上(如检测nginx),按行读取日志

下载filebeat软件
/etc/filebeat/


[root@elk150 filebeat]# cat filebeat.yml
filebeat.inputs:
- type: stdin
output.console:
  pretty: true
#从标准输入上读取数据,返回结果到控制台,下面的error可以省略

执行
filebeat -e -c filebeat.yml

修改flebeat文件

filebeat会把读取日志的操作记录在log.json日志中,方便下一次继续读取 
在启动时会指明该文件的路径
/var/lib/filebeat/registry/filebeat/log.json
格式如下图所示
{"k":"filebeat::logs::native::437853-64768","v":{"type":"log","id":"native::437853-64768","prev_id":"","offset":22,"ttl":-1,"source":"/var/tmp/a.log","timestamp":[2061699874768,1712889188],"FileStateOS":{"inode":437853,"device":64768},"identifier_name":"native"}}
{"op":"set","id":35}
其中"source":"/var/tmp/a.log"代表filebeat从那里读取的日志文件
	"offset":22代表偏移量,用来定位文件中的特定位置,读取数据
[root@elk155 ~]# cat /var/tmp/a.log
111
222
333444
565555
# cat /var/lib/filebeat/registry/filebeat/log.json
{"k":"filebeat::logs::native::437853-64768","v":{"prev_id":"","timestamp":[2062273451290,1712889896],"ttl":-1,"type":"log","FileStateOS":{"inode":437853,"device":64768},"id":"native::437853-64768","source":"/var/tmp/a.log","offset":22,"identifier_name":"native"}}

偏移量:3+3+6+6+4(4个换行符)=22

可以修改/var/lib/filebeat/registry/filebeat/log.json文件中最后一行的offset的值,下次启动时可以从指定位置读取文件

或者删除目录下的log.json文件/删除/var/lib/filebeat/*

enable

vim /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enable: true	是否启动当前的输入类型,默认启动,false为禁用
  paths:		指定数据路径
    - /tmp/test.log
    - /tmp/test/*.log
- type: log
  enabled: true
  paths:
    - /tmp/test/*.txt
output.console:
  pretty: true

tags

给当前的数据类型加上标签
[root@elk155 tmp]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  paths:
    - /var/tmp/*.log
  tags: ["运维工程师","python开发","数据库运维"]
- type: log
  paths:
    - /var/tmp/*.txt
  tags: ["python开发","数据库运维","阿李云"]
output.console:
  pretty: true

fileds

#自定义字段
vim filebeat.yml

filebeat.inputs:
- type: log
  paths:
    - /var/tmp/*.log
  tags: ["运维工程师","python开发","数据库运维"]
  fields:
    school: "河南濮阳"
    class: "linux90"
- type: log
  paths:
    - /var/tmp/*.txt
  tags: ["python开发","数据库运维","阿李云"]
output.console:
  pretty: true

运行结果如下

{
  "fields": {
    "school": "河南濮阳",
    "class": "linux90"
  },
  ...
  "tags": [
    "运维工程师",
    "python开发",
    "数据库运维"
  ],
}

fields是键值对

fileds_under_root

把fikeds字段放在顶级字段出,默认为false,放在fileds下,遇上面的对比
 "tags": [
    "运维工程师",
    "python开发",
    "数据库运维"
  ],
  "school": "河南濮阳",
  "input": {
    "type": "log"
  },

创建索引模板index

[root@elk155 filebeat]# cat filebeat.yml.bak3
filebeat.inputs:
- type: log
  paths:
    - /var/tmp/*.log
  tags: ["运维工程师","python开发","数据库运维"]
  fields:
    school: "河南濮阳"
    class: "linux90"
  fields_under_root: true
- type: log
  paths:
    - /var/tmp/*.txt
  tags: ["python开发","数据库运维","阿李云"]
output.elasticsearch:
  hosts: ["192.168.199.149:9200","192.168.199.150:9200","192.168.199.155:9200"]
  index: "daidai-linux-elk-%{+yyy.MM.dd}"

#禁用生命周期
setup.ilm.enabled: false
#设置索引名称
setup.template.name: "daidai-linux"
#设置索引模板的匹配模式
setup.template.pattern: "daidai-linux"

indexs

[root@elk155 filebeat]# cat filebeat.yml
filebeat.inputs:
- type: log
  paths:
    - /var/tmp/*.log
  tags: ["daidai-elk","python开发","数据库运维"]
  fields:
    school: "河南濮阳"
    class: "linux90"
  fields_under_root: true
- type: log
  paths:
    - /var/tmp/*.txt
  tags: ["daidai-python","数据库运维","阿李云"]
output.elasticsearch:
  hosts: ["192.168.199.149:9200","192.168.199.150:9200","192.168.199.155:9200"]
  indices:
    - index: "daidai-elk-%{+yyyy.MM.dd}"
      when.contains:
        tags: "daidai-elk"
    - index: "daidai-python-%{+yyyy.MM.dd}"
      when.contains:
        tags: "daidai-python"
#禁用生命周期
setup.ilm.enabled: false
#设hi索引名称
setup.template.name: "daidai-linux"
#设置索引模板的匹配模式
setup.template.pattern: "daidai-linux"
分片数量不可以修改
副本数量可以修改

设置分片和副本

filebeat.inputs:
- type: log
  paths:
    - /var/tmp/*.log
  tags: ["daidai-elk","python开发","数据库运维"]
  fields:
    school: "河南濮阳"
    class: "linux90"
  fields_under_root: true
- type: log
  paths:
    - /var/tmp/*.txt
  tags: ["daidai-python","数据库运维","阿李云"]
output.elasticsearch:
  hosts: ["192.168.199.149:9200","192.168.199.150:9200","192.168.199.155:9200"]
  indices:
    - index: "daidai-elk-%{+yyyy.MM.dd}"
      when.contains:
        tags: "daidai-elk"
    - index: "daidai-python-%{+yyyy.MM.dd}"
      when.contains:
        tags: "daidai-python"
#禁用生命周期
setup.ilm.enabled: false
#设hi索引名称
setup.template.name: "daidai-linux"
#设置索引模板的匹配模式
setup.template.pattern: "daidai-linux"

#设置分片和副本
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 1 	#小于集群数量

setup.ilm和setup.template

setup.ilm.enabled: false 和 setup.template.enabled: false 都是关于 Filebeat 在与 Elasticsearch 通信时的行为的设置,但它们针对的是不同的功能。

setup.ilm.enabled: false:

这个设置禁用了索引生命周期管理(ILM),该功能允许 Elasticsearch 自动管理索引的生命周期,包括创建、删除和归档索引。
禁用 ILM 可能意味着你需要手动管理索引的生命周期,包括索引的创建、关闭和删除等操作。
setup.template.enabled: false:

这个设置禁用了索引模板管理功能,该功能允许 Filebeat 自动创建并加载索引模板到 Elasticsearch 中。
禁用索引模板管理意味着你需要手动管理索引模板,包括创建和加载适合你的数据的索引模板。
因此,区别在于 setup.ilm.enabled: false 主要影响了索引的生命周期管理,而 setup.template.enabled: false 则主要影响了索引模板的创建和加载。
集群颜色问题
绿色:集群的主分片和副本分片可以访问
黄色:集群的部分副本分片可以访问
红色:集群的部分主分片无法访问

Elasticsraerh(简称ES,数据的存储,查询,分析)
索引(index):索引是ES中用于存储数据的逻辑容器,类似于关系数据库中的数据库
分片(shard):分片是索引的物理分割,用于将索引分成多个部分存储在不同的节点上
副本(replica):副本是分片的复制,用于提高数据的可靠性和容错能力。每个分片可以有零个或多个副本,副本存储在不				同的节点上,当主分片不可用时,副本可以顶替成为主分片提供服务
主分片和副本分片:
主分片可以读和写,rw
副本分片只能读,w

kibana(数据查询,监控)

nginx

在149主机上下载nginx服务并且启动,日志文件在/var/log/nginx/access.log

[root@bogon filebeat]# cat filebeat.yml
filebeat.inputs:
- type: log
  paths:
    - /var/log/nginx/access.log
  tags: ["access"]
  
  #把数据格式换成json格式
  json.keys_under_root: true
  json.add_error_key: true
  json.message_key: log

output.elasticsearch:
  enabled: true
  hosts: ["192.168.199.149:9200","192.168.199.150:9200","192.168.199.155:9200"]
  index: "daidai-nginx-access.log-%{+yyyy.MM.dd}"
#禁用生命周期
setup.ilm.enabled: false
##设hi索引名称
setup.template.name: "daidai-nginx"
##设置索引模板的匹配模式
setup.template.pattern: "daidai-nginx"
##设置分片和副本
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 1

执行.yml文件

只收集nginx错误访问日志(添加过滤规则)

[root@bogon nginx]# cat /etc/filebeat/nginx.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/*.log
  include_lines: ["failed","error"]	#过滤信息中包含failed和error的信息
  
  ...
  ...
  ...

使用filebeat自带nginx模块

在nginx配置文件中修改日志格式

修改如下

yum部署filebeat查看模块

filebeat -c nginx-module.yml  modules list
 
cat nginx-module.yml
[root@bogon filebeat]# cat nginx-module.yml
filebeat.config.modules:
  path: /etc/filebeat/modules.d/*.yml
  reload.enabled: true

#nginx.yml配置文件在/etc/fileeat/modul.d/下,这里有好多类似的文件,默认后缀名为disabled

  
[root@bogon filebeat]# filebeat -c nginx-module.yml modules list
Enabled:
nginx

Disabled:
activemq

把模块nginx启用 filebeat -c nginx-module.yml modules enabled nginx
[root@bogon filebeat]# grep -Ev '^$|^*#' modules.d/nginx.yml
- module: nginx
  access:
    enabled: true
    var.paths: ["/var/log/nginx/logs/access.log*"]
  error:
    enabled: true
    var.paths: ["/usr/local/nginx/logs/error.log*"]
  ingress_controller:
    enabled: false

tomcat

收集tomcat访问日志

部署tomcat环境

解压软件包

tar -zxvf apache-tomcat-9.0.21.tar.gz -C /data

启动服务

cd /data/
cd /bin
./startup.sh
#查看端口是否启动
ss -natlp 
users:(("java",pid=61025,fd=60))
LISTEN      0      100          [::]:8080        [::]:*                   
#查看日志文件
格式为localhost_access_log.2024-04-17.txt

启用模块管理

filebeat -c nginx-module.yml modules enable tomcat
nginx-module.yml 为filebeat的modules模块问价的路径,这里启用了tomcat配置文件
#查看都有哪些模块启用,现在又tomcat和nginx
[root@bogon filebeat]# filebeat -c nginx-module.yml modules  list
Enabled:
nginx
tomcat

Disabled:
activemq

配置tomcat.yml

上面启动tomcat模块后,在/etc/filebeat/moduls.d/下面会出现tomacat.yml文件

[root@bogon filebeat]# grep -Ev '^$|^*#' modules.d/tomcat.yml
- module: tomcat
  log:
    enabled: true
    var.input: file
    var.paths:
      - /data/apache-tomcat-9.0.21/logs/*.txt
#注意,tomcat模块中有三种input模式,又tcp,udp,file.默认为UDP,
filebeat -e -c tomcat.yml

过滤字段

可以加上and,or

收集tomcat错误日志

[root@bogon logs]# cat /etc/filebeat/tomcat-error.yml
filebeat.inputs:
- type: log
  paths:
  enabled: false
    - /data/apache-tomcat-9.0.21/logs/*.txt
  json.keys_under_root: true

- type: log
  paths:
    - /data/apache-tomcat-9.0.21/logs/*.out
  #匹配错误信息到一行,这里匹配以日期开头直接到下一个日期为一行
  multiline.type: pattern
  multiline.pattern: '^\d{2}'
  multiline.negate: true
  multiline.match: after

output.elasticsearch:

  enabled: true
  hosts: ["192.168.199.149:9200","192.168.199.150:9200","192.168.199.151:9200"]
  index: "daidai-tomcat-error.log-%{+yyyy.MM.dd}"

#禁用生命周期
setup.ilm.enabled: false
###设hi索引名称
setup.template.name: "daidai-tomcat"
###设置索引模板的匹配模式
setup.template.pattern: "daidai-tomcat"
setup.template.overwrite: true
###设置分片和副本
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0

收集es日志

[root@bogon filebeat]# cat es.log.yml
filebeat.inputs:
- type: log
  paths:
    - /var/log/elasticsearch/my-application.log
  json.keys_under_root: true
output.elasticsearch:
  enabled: true
  hosts: ["192.168.199.149:9200","192.168.199.150:9200","192.168.199.151:9200"]
  index: "daidai-es-access.log-%{+yyyy.MM.dd}"

#禁用生命周期
setup.ilm.enabled: false
###设hi索引名称
setup.template.name: "daidai-es"
###设置索引模板的匹配模式
setup.template.pattern: "daidai-es"
setup.template.overwrite: true
###设置分片和副本
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0

日志过滤

包含指定信息会过滤出来,区分大小写,"^error"过滤以error开头的信息,支持通配符
[root@bogon test]# cat /etc/filebeat/filebeat-console.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /tmp/test/*.log
  include_lines: ["action","error"]

output.console:
  pretty: true

#include_lines: ['sometext']  包含sometext的行,白名单
#exclude_lines: ['^DBG']  不包含以^DBU的行,黑命单

案例

分别把nginx的访问日志和错误日志放到不同index下

[root@bogon filebeat]# cat  nginx-test.yml
filebeat.inputs:
- type: log
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  tags: ["access"]

- type: log
  paths:
    - /var/log/nginx/error.log
  onclude_lines: ['\[error\]']	#这里[]需要转意
  tags: ["error"]

output.elasticsearch:
  enabled: true
  hosts: ["192.168.199.149:9200","192.168.199.150:9200","192.168.199.151:9200"]
  indices:
    - index: "daidai-nginx-access.log-%{+yyyy.MM.dd}"
      when.contains:
        tags: "access"
    - index: "daidai-nginx-error.log-%{+yyyy.MM.dd}"
      when.contains:
        tags: "error"
        
#禁用生命周期
setup.ilm.enabled: false
###设hi索引名称
setup.template.name: "daidai-nginx"
###设置索引模板的匹配模式
setup.template.pattern: "daidai-nginx"
setup.template.overwrite: true
###设置分片和副本
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0

案例二

收集nginx和tomcat访问日志和错误日志

[root@bogon filebeat]# cat nginx-tomcat.yml
filebeat.inputs:
- type: log
  paths:
    - /var/log/nginx/access.log
  tags: ["nginx-access"]
  json.keys_under_root: true

- type: log
  paths:
    - /var/log/nginx/error.log
  include_lines: ['\[error\]']
  tags: ["nginx-error"]

- type: log
  paths:
    - /data/apache-tomcat-9.0.21/logs/*.txt
  tags: ["tomcat-access"]
  json.keys_under_root: true

- type: log
  enabled: true
  paths:
    - /data/apache-tomcat-9.0.21/logs/*.out
#匹配错误信息到一行,这里匹配以日期开头直接到下一个日期为一行

  tags: ["tomcat-error"]
  multiline.type: pattern
  multiline.pattern: '^\d{2}'
  multiline.negate: true
  multiline.match: after

output.elasticsearch:

  enabled: true
  hosts: ["192.168.199.149:9200","192.168.199.150:9200","192.168.199.151:9200"]
  indices:
    - index: "daidai-nginx-access.log-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-access"
    - index: "daidai-nginx-error.log-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-error"

    - index: "daidai-tomcat-access.log-%{+yyyy.MM.dd}"
      when.contains:
        tags: "tomcat-access"
    - index: "daidai-tomcat-error.log-%{+yyyy.MM.dd}"
      when.contains:
        tags: "tomcat-error"
#禁用生命周期
setup.ilm.enabled: false
###设hi索引名称
setup.template.name: "daidai-web"
###设置索引模板的匹配模式
setup.template.pattern: "daidai-web"
setup.template.overwrite: true
###设置分片和副本
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0

新版本:log-----> filestream

加上json解析

filebeat.inputs:
- type: filestream
  ...
  parsers:
    - ndjson:
        target: ""
        message_key: msg
    - multiline:
        type: counter
        lines_count: 3
        ...
        ...
        ...
filebeat.inputs:
- type: filestream
  enabled: true
  paths:
    - /data/apache-tomcat-9.0.21/logs/*.txt
  json.keys_under_root: true

- type: filestream
  paths:
    - /data/apache-tomcat-9.0.21/logs/*.out
  parsers:
  #定义多行匹配
    - multiline:
        type: pattern
        pattern: '^\d{2}'
        negate: true
        match: after
       ...
       ...
       ...

input源配置一旦超过4个,可能会复现出部分数据无法写入的问题
方法一:
	拆成多个filebeat文件,出问题时可以指定数据路径  --path.data string   Data path (default " ")
[root@bogon tmp]# cd test
[root@bogon test]# ll
total 8
-rw-r--r-- 1 root root  39 Apr 18 10:33 a.log
-rw------- 1 root root   0 Apr 18 20:09 filebeat.lock
-rw------- 1 root root 100 Apr 18 20:09 meta.json
drwxr-x--- 3 root root  22 Apr 18 20:09 registry
执行后目录下面会出现新的文件,停止后filebeat.lock文件会消失

方法二:rsyslog

使用rsyslog聚合对文件

yum install rsyslog

rsyslog服务配置文件/etc/rsyslog.conf

#设置所有信息日志都发送到指定文件中
*.*                                                     /var/log/daidai.log
#打开tcp协议(取消前面的注释)
$ModLoad imtcp
$InputTCPServerRun 514
#重启服务
systemctl restart rsyslog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1606324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

# 从浅入深 学习 SpringCloud 微服务架构(一)基础知识

从浅入深 学习 SpringCloud 微服务架构&#xff08;一&#xff09;基础知识 1、系统架构演变&#xff1a; 1&#xff09;单体应用架构。如电商项目。 用户管理、商品管理、订单管理&#xff0c;在一个模块里。 优点&#xff1a;开发简单&#xff0c;快速&#xff0c;适用于…

VScode远程连接虚拟机提示: 无法建立连接:XHR failed.问题解决方案

一问题描述 在vscode下载插件Remote-SSH远程连接虚拟机时提示无法建立连接 二.最大嫌疑原因&#xff1a; 我也是在网上找了许久&#xff0c;发现就是网络原因&#xff0c;具体不知&#xff0c;明明访问别的网页没问题&#xff0c;就是连不上&#xff0c;然后发现下载vscode的…

前端CSS基础4(像素,颜色,字体属性大小复合属性)

前端CSS基础4&#xff08;像素&#xff0c;颜色&#xff0c;字体属性大小复合属性&#xff09; CSS代码编写位置CSS像素CSS颜色CSS常用字体属性和大小字体的复合属性 CSS代码编写位置 在HTML文件的头部使用 <head><style>/* 在这里编写CSS代码 */</style> …

Meta Llama 3强势来袭:迄今最强开源大模型,性能媲美GPT-4

前言 Meta的最新语言模型Llama 3已经发布&#xff0c;标志着在大型语言模型&#xff08;LLM&#xff09;领域的一次重大突破&#xff0c;其性能在行业内与GPT-4相媲美。此次更新不仅提升了模型的处理能力和精确性&#xff0c;还将开源模型的性能推向了一个新的高度。 Huggingf…

从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(二)

Dataframe dataframe 是spark中参考pandas设计出的一套高级API&#xff0c;用户可以像操作pandas一样方便的操作结构化数据。毕竟纯的RDD操作是十分原始且麻烦的。而dataframe的出现可以让熟悉pandas的从业人员能用非常少的成本完成分布式的数据分析工作&#xff0c; 毕竟跟数据…

数仓建模—数仓架构发展史

数仓建模—数仓架构发展史 时代的变迁&#xff0c;生死的轮回&#xff0c;历史长河滔滔&#xff0c;没有什么是永恒的&#xff0c;只有变化才是不变的&#xff0c;技术亦是如此&#xff0c;当你选择互联网的那一刻&#xff0c;你就相当于乘坐了一个滚滚向前的时代列车&#xf…

电视音频中应用的音频放大器

电视机声音的产生原理是将电视信号转化为声音&#xff0c;然后通过扬声器将声音播放出来。当我们打开电视并选择频道时&#xff0c;电视机首先从天线或有线电视信号中获取声音信号。声音信号经过放大器放大之后&#xff0c;就能够通过扬声器发出声音。电视机声音的产生原理和音…

Ubuntu20.04 ISAAC SIM仿真下载使用流程(4.16笔记补充)

机器&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti ubuntu20.04 安装显卡驱动版本&#xff1a;525.85.05 参考&#xff1a; What Is Isaac Sim? — Omniverse IsaacSim latest documentationIsaac sim Cache 2023.2.3 did not work_isaac cache stopped-CSDN博客 Is…

2024蓝桥杯每日一题(最短路径)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;奶牛回家 试题二&#xff1a;Dijkstra求最短路 II 试题三&#xff1a;spfa求最短路 试题四&#xff1a;作物杂交 试题一&#xff1a;奶牛回家 【题目描述】 晚餐时间马上就到了&#x…

【JavaEE多线程】Thread类及其常见方法(上)

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

【opencv】dnn示例-segmentation.cpp 通过深度学习模型对图像进行实时语义分割

模型下载地址&#xff1a; http://dl.caffe.berkeleyvision.org/ 配置文件下载&#xff1a; https://github.com/opencv/opencv_extra/tree/4.x/testdata/dnn 该段代码是一个利用深度学习进行语义分割的OpenCV应用实例。下面将详细解释代码的功能和方法。 引入库 引入了一些必要…

蓝桥杯2024年第十五届省赛真题-宝石组合

思路&#xff1a;参考博客&#xff0c;对Ha,Hb,Hc分别进行质因数分解会发现&#xff0c;S其实就等于Ha&#xff0c;Hb&#xff0c;Hc的最大公约数&#xff0c;不严谨推导过程如下&#xff08;字丑勿喷&#xff09;&#xff1a; 找到此规律后&#xff0c;也不能枚举Ha&#xff…

Go 单元测试之mock接口测试

文章目录 一、gomock 工具介绍二、安装三、使用3.1 指定三个参数3.2 使用命令为接口生成 mock 实现3.3 使用make 命令封装处理mock 四、接口单元测试步骤三、小黄书Service层单元测试四、flags五、打桩&#xff08;stub&#xff09;参数 六、总结6.1 测试用例定义6.2 设计测试用…

医学图像三维重建与可视化系统 医学图像分割 区域增长

医学图像的三维重建与可视化&#xff0c;这是一个非常有趣且具有挑战性的课题&#xff01;在这样的项目中&#xff0c;可以探索不同的医学图像技术&#xff0c;比如MRI、CT扫描等&#xff0c;然后利用这些图像数据进行三维重建&#xff0c;并将其可视化以供医生或研究人员使用。…

解决Mac使用Vscode无法调用外部终端

前言 今天遇到一个很奇怪的问题&#xff0c;之前好好的用Vscode还能调用外部终端&#xff0c;怎么今天不行了&#xff1f;问题出在哪里呢&#xff1f;请听我娓娓道来。 检查配置文件 我查看了一下配置文件&#xff0c;发现配置文件都是调用外部控制台&#xff0c;没毛病啊。 …

Objective-C网络数据捕获:使用MWFeedParser库下载Stack Overflow示例

概述 Objective-C开发中&#xff0c;网络数据捕获是一项常见而关键的任务&#xff0c;特别是在处理像RSS源这样的实时网络数据流时。MWFeedParser库作为一个优秀的解析工具&#xff0c;提供了简洁而强大的解决方案。本文将深入介绍如何利用MWFeedParser库&#xff0c;以高效、…

(最详细)关于List和Set的区别与应用

关于List与Set的区别 List和Set都继承自Collection接口&#xff1b; List接口的实现类有三个&#xff1a;LinkedList、ArrayList、Vector。Set接口的实现类有两个&#xff1a;HashSet(底层由HashMap实现)、LinkedHashSet。 在List中&#xff0c;List.add()是基于数组的形式来添…

Spring Boot后端+Vue前端:打造高效二手车交易系统

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

机器学习笔记 - 使用 OpenCV 的结构化森林进行边缘检测

一、简述 边缘检测是计算机视觉领域中一项非常重要的任务。这是许多纯计算机视觉任务(例如轮廓检测)的第一步。即使涉及深度学习,较深层也首先学习识别边缘,然后再学习图像的复杂特征。所以,我们可以说边缘检测在计算机视觉领域非常重要。拥有良好且高效的图像边缘检测算法…

后端返回的数据中含有Null的则不在前端展示

方式 1&#xff1a;application 上加配置 只需要在配置文件 上&#xff0c;增加 如下配置。 application 格式配置&#xff1a; spring.jackson.default-property-inclusionnon_null yml 格式配置&#xff1a; spring:jackson:default-property-inclusion: non_null注意&a…