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

eBPF 之 ProgramType、AttachType和InputContext

1. ProgramType 定义

定义在 include/uapi/linux/bpf.h 文件中,不同 Linux 版本会有变化,以下是 Linux 5.19 版本定义:

enum bpf_prog_type {BPF_PROG_TYPE_UNSPEC,BPF_PROG_TYPE_SOCKET_FILTER,BPF_PROG_TYPE_KPROBE,BPF_PROG_TYPE_SCHED_CLS,BPF_PROG_TYPE_SCHED_ACT,BPF_PROG_TYPE_TRACEPOINT,BPF_PROG_TYPE_XDP,BPF_PROG_TYPE_PERF_EVENT,BPF_PROG_TYPE_CGROUP_SKB,BPF_PROG_TYPE_CGROUP_SOCK,BPF_PROG_TYPE_LWT_IN,BPF_PROG_TYPE_LWT_OUT,BPF_PROG_TYPE_LWT_XMIT,BPF_PROG_TYPE_SOCK_OPS,BPF_PROG_TYPE_SK_SKB,BPF_PROG_TYPE_CGROUP_DEVICE,BPF_PROG_TYPE_SK_MSG,BPF_PROG_TYPE_RAW_TRACEPOINT,BPF_PROG_TYPE_CGROUP_SOCK_ADDR,BPF_PROG_TYPE_LWT_SEG6LOCAL,BPF_PROG_TYPE_LIRC_MODE2,BPF_PROG_TYPE_SK_REUSEPORT,BPF_PROG_TYPE_FLOW_DISSECTOR,BPF_PROG_TYPE_CGROUP_SYSCTL,BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,BPF_PROG_TYPE_CGROUP_SOCKOPT,BPF_PROG_TYPE_TRACING,BPF_PROG_TYPE_STRUCT_OPS,BPF_PROG_TYPE_EXT,BPF_PROG_TYPE_LSM,BPF_PROG_TYPE_SK_LOOKUP,BPF_PROG_TYPE_SYSCALL, /* a program that can execute syscalls */
};

2. AttachType 定义

定义在 include/uapi/linux/bpf.h 文件中,不同 Linux 版本会有变化,以下是 Linux 5.19 版本定义:

enum bpf_attach_type {BPF_CGROUP_INET_INGRESS,BPF_CGROUP_INET_EGRESS,BPF_CGROUP_INET_SOCK_CREATE,BPF_CGROUP_SOCK_OPS,BPF_SK_SKB_STREAM_PARSER,BPF_SK_SKB_STREAM_VERDICT,BPF_CGROUP_DEVICE,BPF_SK_MSG_VERDICT,BPF_CGROUP_INET4_BIND,BPF_CGROUP_INET6_BIND,BPF_CGROUP_INET4_CONNECT,BPF_CGROUP_INET6_CONNECT,BPF_CGROUP_INET4_POST_BIND,BPF_CGROUP_INET6_POST_BIND,BPF_CGROUP_UDP4_SENDMSG,BPF_CGROUP_UDP6_SENDMSG,BPF_LIRC_MODE2,BPF_FLOW_DISSECTOR,BPF_CGROUP_SYSCTL,BPF_CGROUP_UDP4_RECVMSG,BPF_CGROUP_UDP6_RECVMSG,BPF_CGROUP_GETSOCKOPT,BPF_CGROUP_SETSOCKOPT,BPF_TRACE_RAW_TP,BPF_TRACE_FENTRY,BPF_TRACE_FEXIT,BPF_MODIFY_RETURN,BPF_LSM_MAC,BPF_TRACE_ITER,BPF_CGROUP_INET4_GETPEERNAME,BPF_CGROUP_INET6_GETPEERNAME,BPF_CGROUP_INET4_GETSOCKNAME,BPF_CGROUP_INET6_GETSOCKNAME,BPF_XDP_DEVMAP,BPF_CGROUP_INET_SOCK_RELEASE,BPF_XDP_CPUMAP,BPF_SK_LOOKUP,BPF_XDP,BPF_SK_SKB_VERDICT,BPF_SK_REUSEPORT_SELECT,BPF_SK_REUSEPORT_SELECT_OR_MIGRATE,BPF_PERF_EVENT,__MAX_BPF_ATTACH_TYPE
};

3. ProgramType、AttachType和 InputContext关系

在 Linux 源码 kernel/bpf/syscall.c 文件的 attach_type_to_prog_type 函数中有 ProgramType 与 AttachType 的映射关系,同时在 Linux 源码 include/linux/bpf_types.h 中定义了 ProgramType 与 InputContext 的映射关系。

整理后的映射关系如下:

ProgramType

AttachType

InputContext

BPF_PROG_TYPE_SOCKET_FILTER

None

struct __sk_buff

BPF_PROG_TYPE_KPROBE

AttachTraceKprobeMulti

struct pt_regs

BPF_PROG_TYPE_SCHED_CLS

None

struct __sk_buff

BPF_PROG_TYPE_SCHED_ACT

None

struct __sk_buff

BPF_PROG_TYPE_TRACEPOINT

None

__u64

BPF_PROG_TYPE_XDP

BPF_XDP_DEVMAP

BPF_XDP_CPUMAP

BPF_XDP

struct xdp_md

BPF_PROG_TYPE_PERF_EVENT

None

struct bpf_perf_event_data

BPF_PROG_TYPE_CGROUP_SKB

BPF_CGROUP_INET_INGRESS

BPF_CGROUP_INET_EGRESS

struct __sk_buff

BPF_PROG_TYPE_CGROUP_SOCK

BPF_CGROUP_INET_SOCK_CREATE

BPF_CGROUP_INET_SOCK_RELEASE

BPF_CGROUP_INET4_POST_BIND

BPF_CGROUP_INET6_POST_BIND

struct bpf_sock

BPF_PROG_TYPE_LWT_IN

None

struct __sk_buff

BPF_PROG_TYPE_LWT_OUT

None

struct __sk_buff

BPF_PROG_TYPE_LWT_XMIT

None

struct __sk_buff

BPF_PROG_TYPE_SOCK_OPS

BPF_CGROUP_SOCK_OPS

struct bpf_sock_ops

BPF_PROG_TYPE_SK_SKB

BPF_SK_SKB_STREAM_PARSER

BPF_SK_SKB_STREAM_VERDICT

BPF_SK_SKB_VERDICT

struct __sk_buff

BPF_PROG_TYPE_CGROUP_DEVICE

BPF_CGROUP_DEVICE

struct bpf_cgroup_dev_ctx

BPF_PROG_TYPE_SK_MSG

BPF_SK_MSG_VERDICT

struct sk_msg_md

BPF_PROG_TYPE_RAW_TRACEPOINT

None

struct bpf_raw_tracepoint_args

BPF_PROG_TYPE_CGROUP_SOCK_ADDR

BPF_CGROUP_INET4_BIND

BPF_CGROUP_INET6_BIND

BPF_CGROUP_INET4_CONNECT

BPF_CGROUP_INET6_CONNECT

BPF_CGROUP_UDP4_SENDMSG

BPF_CGROUP_UDP6_SENDMSG

BPF_CGROUP_UDP4_RECVMSG

BPF_CGROUP_UDP6_RECVMSG

BPF_CGROUP_INET4_GETPEERNAME

BPF_CGROUP_INET6_GETPEERNAME

BPF_CGROUP_INET4_GETSOCKNAME

BPF_CGROUP_INET6_GETSOCKNAME

struct bpf_sock_addr

BPF_PROG_TYPE_LWT_SEG6LOCAL

None

struct __sk_buff

BPF_PROG_TYPE_LIRC_MODE2

BPF_LIRC_MODE2

__u32

BPF_PROG_TYPE_SK_REUSEPORT

BPF_SK_REUSEPORT_SELECT

BPF_SK_REUSEPORT_SELECT_OR_MIGRATE

struct sk_reuseport_md

BPF_PROG_TYPE_FLOW_DISSECTOR

BPF_FLOW_DISSECTOR

struct __sk_buff

BPF_PROG_TYPE_CGROUP_SYSCTL

BPF_CGROUP_SYSCTL

struct bpf_sysctl

BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE

None

struct bpf_raw_tracepoint_args

BPF_PROG_TYPE_CGROUP_SOCKOPT

BPF_CGROUP_GETSOCKOPT BPF_CGROUP_SETSOCKOPT

struct bpf_sockopt

BPF_PROG_TYPE_TRACING

BPF_TRACE_RAW_TP

BPF_TRACE_FENTRY

BPF_TRACE_FEXIT

BPF_MODIFY_RETURN

BPF_TRACE_ITER

void *

BPF_PROG_TYPE_STRUCT_OPS

None

void *

BPF_PROG_TYPE_EXT

None

void *

BPF_PROG_TYPE_LSM

BPF_LSM_MAC

void *

BPF_PROG_TYPE_SK_LOOKUP

BPF_SK_LOOKUP

struct bpf_sk_lookup

BPF_PROG_TYPE_SYSCALL

None

void *

注:也参考了 github.com/cilium/ebpf/elf_reader.go 文件定义的映射关系。

4. InputContext 详细定义

4.1. struct xdp_md

在 include/uapi/linux/bpf.h 文件下定义:

struct xdp_md {                                                                                                               	  __u32 data;__u32 data_end;__u32 data_meta;/* Below access go through struct xdp_rxq_info */__u32 ingress_ifindex; /* rxq->dev->ifindex */__u32 rx_queue_index;  /* rxq->queue_index  */__u32 egress_ifindex;  /* txq->dev->ifindex */
};

4.2. struct pt_regs

struct pt_regs 的定义与系统架构相关,以 x86 系统为例,可以在 /usr/src/linux-headers-${uname -r}/arch/x86/include/uapi/asm/ptrace.h 文件中找到,下面是 x86_64 系统架构的定义:

struct pt_regs {
/** C ABI says these regs are callee-preserved. They aren't saved on kernel entry* unless syscall needs a complete, fully filled "struct pt_regs".*/unsigned long r15;unsigned long r14;unsigned long r13;unsigned long r12;unsigned long rbp;unsigned long rbx;
/* These regs are callee-clobbered. Always saved on kernel entry. */unsigned long r11;unsigned long r10;unsigned long r9;unsigned long r8;unsigned long rax;unsigned long rcx;unsigned long rdx;unsigned long rsi;unsigned long rdi;
/** On syscall entry, this is syscall#. On CPU exception, this is error code.* On hw interrupt, it's IRQ number:*/unsigned long orig_rax;
/* Return frame for iretq */unsigned long rip;unsigned long cs;unsigned long eflags;unsigned long rsp;unsigned long ss;
/* top of stack page */
};

4.3. struct __sk_buff

在 include/uapi/linux/bpf.h 文件下定义:

/* user accessible mirror of in-kernel sk_buff.* new fields can only be added to the end of this structure*/
struct __sk_buff {__u32 len; __u32 pkt_type;__u32 mark;__u32 queue_mapping;__u32 protocol;__u32 vlan_present;__u32 vlan_tci;__u32 vlan_proto;__u32 priority;__u32 ingress_ifindex;__u32 ifindex;__u32 tc_index;__u32 cb[5];__u32 hash;__u32 tc_classid;__u32 data;__u32 data_end;__u32 napi_id;/* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */__u32 family;__u32 remote_ip4;   /* Stored in network byte order */__u32 local_ip4;    /* Stored in network byte order */__u32 remote_ip6[4];    /* Stored in network byte order */__u32 local_ip6[4]; /* Stored in network byte order */__u32 remote_port;  /* Stored in network byte order */__u32 local_port;   /* stored in host byte order *//* ... here. */__u32 data_meta;__bpf_md_ptr(struct bpf_flow_keys *, flow_keys);__u64 tstamp;__u32 wire_len;__u32 gso_segs;__bpf_md_ptr(struct bpf_sock *, sk); __u32 gso_size;
};

4.4. struct bpf_perf_event_data

在 include/uapi/linux/bpf_perf_event.h 文件下定义:

typedef struct pt_regs bpf_user_pt_regs_t;struct bpf_perf_event_data {bpf_user_pt_regs_t regs;__u64 sample_period;__u64 addr;
};

4.5. struct bpf_sock

在 include/uapi/linux/bpf.h 文件下定义:

struct bpf_sock {__u32 bound_dev_if;__u32 family;__u32 type;__u32 protocol;__u32 mark;__u32 priority;/* IP address also allows 1 and 2 bytes access */__u32 src_ip4;__u32 src_ip6[4];__u32 src_port;		/* host byte order */__be16 dst_port;	/* network byte order */__u16 :16;		/* zero padding */__u32 dst_ip4;__u32 dst_ip6[4];__u32 state;__s32 rx_queue_mapping;
};

4.6. struct bpf_sock_ops

在 include/uapi/linux/bpf.h 文件下定义:

struct bpf_sock_ops {__u32 op;union {__u32 args[4];		/* Optionally passed to bpf program */__u32 reply;		/* Returned by bpf program	    */__u32 replylong[4];	/* Optionally returned by bpf prog  */};__u32 family;__u32 remote_ip4;	/* Stored in network byte order */__u32 local_ip4;	/* Stored in network byte order */__u32 remote_ip6[4];	/* Stored in network byte order */__u32 local_ip6[4];	/* Stored in network byte order */__u32 remote_port;	/* Stored in network byte order */__u32 local_port;	/* stored in host byte order */__u32 is_fullsock;	/* Some TCP fields are only valid if* there is a full socket. If not, the* fields read as zero.*/__u32 snd_cwnd;__u32 srtt_us;		/* Averaged RTT << 3 in usecs */__u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */__u32 state;__u32 rtt_min;__u32 snd_ssthresh;__u32 rcv_nxt;__u32 snd_nxt;__u32 snd_una;__u32 mss_cache;__u32 ecn_flags;__u32 rate_delivered;__u32 rate_interval_us;__u32 packets_out;__u32 retrans_out;__u32 total_retrans;__u32 segs_in;__u32 data_segs_in;__u32 segs_out;__u32 data_segs_out;__u32 lost_out;__u32 sacked_out;__u32 sk_txhash;__u64 bytes_received;__u64 bytes_acked;__bpf_md_ptr(struct bpf_sock *, sk);/* [skb_data, skb_data_end) covers the whole TCP header.** BPF_SOCK_OPS_PARSE_HDR_OPT_CB: The packet received* BPF_SOCK_OPS_HDR_OPT_LEN_CB:   Not useful because the*                                header has not been written.* BPF_SOCK_OPS_WRITE_HDR_OPT_CB: The header and options have*				  been written so far.* BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB:  The SYNACK that concludes*					the 3WHS.* BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: The ACK that concludes*					the 3WHS.** bpf_load_hdr_opt() can also be used to read a particular option.*/__bpf_md_ptr(void *, skb_data);__bpf_md_ptr(void *, skb_data_end);__u32 skb_len;		/* The total length of a packet.* It includes the header, options,* and payload.*/__u32 skb_tcp_flags;	/* tcp_flags of the header.  It provides* an easy way to check for tcp_flags* without parsing skb_data.** In particular, the skb_tcp_flags* will still be available in* BPF_SOCK_OPS_HDR_OPT_LEN even though* the outgoing header has not* been written yet.*/
};

4.7. struct bpf_cgroup_dev_ctx

在 include/uapi/linux/bpf.h 文件下定义:

struct bpf_cgroup_dev_ctx {/* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */__u32 access_type;__u32 major;__u32 minor;
};

4.8. struct sk_msg_md

在 include/uapi/linux/bpf.h 文件下定义:

struct sk_msg_md {__bpf_md_ptr(void *, data);__bpf_md_ptr(void *, data_end);__u32 family;__u32 remote_ip4;	/* Stored in network byte order */__u32 local_ip4;	/* Stored in network byte order */__u32 remote_ip6[4];	/* Stored in network byte order */__u32 local_ip6[4];	/* Stored in network byte order */__u32 remote_port;	/* Stored in network byte order */__u32 local_port;	/* stored in host byte order */__u32 size;		/* Total size of sk_msg */__bpf_md_ptr(struct bpf_sock *, sk); /* current socket */
};

4.9. struct sk_reuseport_md

在 include/uapi/linux/bpf.h 文件下定义:

struct sk_reuseport_md {/** Start of directly accessible data. It begins from* the tcp/udp header.*/__bpf_md_ptr(void *, data);/* End of directly accessible data */__bpf_md_ptr(void *, data_end);/** Total length of packet (starting from the tcp/udp header).* Note that the directly accessible bytes (data_end - data)* could be less than this "len".  Those bytes could be* indirectly read by a helper "bpf_skb_load_bytes()".*/__u32 len;/** Eth protocol in the mac header (network byte order). e.g.* ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD)*/__u32 eth_protocol;__u32 ip_protocol;	/* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */__u32 bind_inany;	/* Is sock bound to an INANY address? */__u32 hash;		/* A hash of the packet 4 tuples *//* When reuse->migrating_sk is NULL, it is selecting a sk for the* new incoming connection request (e.g. selecting a listen sk for* the received SYN in the TCP case).  reuse->sk is one of the sk* in the reuseport group. The bpf prog can use reuse->sk to learn* the local listening ip/port without looking into the skb.** When reuse->migrating_sk is not NULL, reuse->sk is closed and* reuse->migrating_sk is the socket that needs to be migrated* to another listening socket.  migrating_sk could be a fullsock* sk that is fully established or a reqsk that is in-the-middle* of 3-way handshake.*/__bpf_md_ptr(struct bpf_sock *, sk);__bpf_md_ptr(struct bpf_sock *, migrating_sk);
};

4.10. struct bpf_raw_tracepoint_args

在 include/uapi/linux/bpf.h 文件下定义:

struct bpf_raw_tracepoint_args {__u64 args[0];
};

4.11. struct bpf_sock_addr

在 include/uapi/linux/bpf.h 文件下定义:

struct bpf_sock_addr {__u32 user_family;	/* Allows 4-byte read, but no write. */__u32 user_ip4;		/* Allows 1,2,4-byte read and 4-byte write.* Stored in network byte order.*/__u32 user_ip6[4];	/* Allows 1,2,4,8-byte read and 4,8-byte write.* Stored in network byte order.*/__u32 user_port;	/* Allows 1,2,4-byte read and 4-byte write.* Stored in network byte order*/__u32 family;		/* Allows 4-byte read, but no write */__u32 type;		/* Allows 4-byte read, but no write */__u32 protocol;		/* Allows 4-byte read, but no write */__u32 msg_src_ip4;	/* Allows 1,2,4-byte read and 4-byte write.* Stored in network byte order.*/__u32 msg_src_ip6[4];	/* Allows 1,2,4,8-byte read and 4,8-byte write.* Stored in network byte order.*/__bpf_md_ptr(struct bpf_sock *, sk);
};

4.12. struct bpf_sysctl

在 include/uapi/linux/bpf.h 文件下定义:

struct bpf_sysctl {__u32	write;		/* Sysctl is being read (= 0) or written (= 1).* Allows 1,2,4-byte read, but no write.*/__u32	file_pos;	/* Sysctl file position to read from, write to.* Allows 1,2,4-byte read an 4-byte write.*/
};

4.13. struct bpf_sockopt

在 include/uapi/linux/bpf.h 文件下定义:

struct bpf_sockopt {__bpf_md_ptr(struct bpf_sock *, sk);__bpf_md_ptr(void *, optval);__bpf_md_ptr(void *, optval_end);__s32	level;__s32	optname;__s32	optlen;__s32	retval;
};

4.14. struct bpf_sk_lookup

在 include/uapi/linux/bpf.h 文件下定义:

struct bpf_sk_lookup {union {__bpf_md_ptr(struct bpf_sock *, sk); /* Selected socket */__u64 cookie; /* Non-zero if socket was selected in PROG_TEST_RUN */};__u32 family;		/* Protocol family (AF_INET, AF_INET6) */__u32 protocol;		/* IP protocol (IPPROTO_TCP, IPPROTO_UDP) */__u32 remote_ip4;	/* Network byte order */__u32 remote_ip6[4];	/* Network byte order */__be16 remote_port;	/* Network byte order */__u16 :16;		/* Zero padding */__u32 local_ip4;	/* Network byte order */__u32 local_ip6[4];	/* Network byte order */__u32 local_port;	/* Host byte order */__u32 ingress_ifindex;		/* The arriving interface. Determined by inet_iif. */
};

相关文章:

eBPF 之 ProgramType、AttachType和InputContext

1. ProgramType 定义定义在 include/uapi/linux/bpf.h 文件中&#xff0c;不同 Linux 版本会有变化&#xff0c;以下是 Linux 5.19 版本定义&#xff1a;enum bpf_prog_type {BPF_PROG_TYPE_UNSPEC,BPF_PROG_TYPE_SOCKET_FILTER,BPF_PROG_TYPE_KPROBE,BPF_PROG_TYPE_SCHED_CLS,…...

C++运行时类型识别RTTI

C技能 runtime type identification(RTTI) 运行时类型识别在使用多态的时候经常用到。本文将会介绍RTTI的几个特征。1. 运行时类型转换下面的程序模仿了dynamic_cast<type_id>()类型转化符号&#xff0c;根据每个类的id来判断当前的类型&#xff0c;如果id不匹配&#xf…...

idea多时编辑多行-winmac都支持

1背景介绍 idea编辑器非常强大&#xff0c;其中一个功能非常优秀&#xff0c;很多程序员也非常喜欢用。这个功能能够大大大提高工作效率-------------多行代码同时编辑 2win 2.1方法1 按住alt鼠标左键上/下拖动即可 这样选中多行后&#xff0c;可以直接多行编辑。 优点&a…...

BI是报表?BI是可视化?BI到底是什么?

很多企业认为只要买一个前端商业智能BI分析工具就可以解决企业级的商业智能BI所有问题&#xff0c;这个看法实际上也不可行的。可能在最开始分析场景相对简单&#xff0c;对接数据的复杂度不是很高的情况下这类商业智能BI分析工具没有问题。但是在企业的商业智能BI项目建设有一…...

Python基础-数据类型之元组

一、元组的定义 nums (1, 2, 3, 4, 5) 元组是序列的其中一种&#xff0c;每个元素都以逗号分隔&#xff0c;用()包围。 当元组中只有一个元素时&#xff0c;需要在元素后面加逗号分隔&#xff0c;nums (1,)&#xff0c;否则括号会被当成运算符 nums (1) print(type(nums…...

大数据面试小抄

项目地址&#xff1a;https://github.com/GTyingzi/BigDATA 该项目是自己在学习大数据过程中整理、总结下来的一份面试小抄。涵盖Hadoop、Spark、Flink、Hive、HBae、Kafka、ES、Zookeeper等。 开源给大家&#xff0c;若感觉不错欢迎star~ 摘取Flink部分如下文章目录FlinkFli…...

Vue:(三十一)Vue封装的过度与动画

上一篇订阅与发布不够过瘾&#xff0c;接着再来一篇&#xff0c;come on&#xff01;&#xff01;&#xff01;作用&#xff1a;在插入、更新或移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名写法&#xff1a;过度&#xff1a;元素进入的样式&#xff1a;v-enter&am…...

文本处理:字符串替换

方法1&#xff1a;str.replace str.replace(old, new[, count]) Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced. 该方法逻辑大致如下所示&am…...

python 调用 dll 出现精度问题

问题&#xff1a;python 在调用dll 的时候出现了精度问题 总结&#xff1a;使用decimal库进行转换就可以正常传递。 ‘ 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 ’ 遇到的问题具体情况 dll 生成函数…...

STL讲解——模拟实现string

STL讲解——模拟实现string 经典的string类问题 大厂在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现string类的增、删、查、改、构造、拷贝构造、赋值运算符重载以及析构函数。大家看下自己可不可以写一个string类&#xff1f; cla…...

CDH 6.3.2 升级Hive 2.3.9

升级背景 DolphinScheduler 3.1.1安装好后&#xff0c;其源码中集成的是Hive 2.1.1&#xff0c;版本太低&#xff0c;当在数据中心连接Hive数据源时报错&#xff0c;所以升级CDH自带的Hive为2.3.9版本。 一、准备工作 1、下载hive2.3.9并解压 下载地址&#xff1a;http://a…...

距离不是拦截我们前进的主因,与社科院杜兰金融硕士一起奔赴山海

最近有咨询社科院杜兰金融管理硕士项目的同学反馈他在西安&#xff0c;读研来北京上课太远了。一直在纠结要不要申请&#xff0c;其实距离不是问题&#xff0c;相向而行才是关键。在项目就读的同学好多也是来自外地&#xff0c;他们克服了种种困难来到项目学习&#xff0c;就是…...

【SpringBoot】MyBatis-plus 报错 sqlSessionFactory sqlSessionTemplate 最新解决办法

本文针对 MyBatis-plus&#xff0c;对于 MyBatis 报相同的错误&#xff0c;可以看这个大佬的文章&#xff1a;SpringBoot3整合MyBatis报错&#xff1a;Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 针对报错如下&#xff1a; Property sqlSessionF…...

jsp诊疗预约系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp诊疗预约系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用jav…...

详解 APISIX Lua 动态调试插件 inspect

作者罗锦华&#xff0c;API7.ai 技术专家/技术工程师&#xff0c;开源项目 pgcat&#xff0c;lua-resty-ffi&#xff0c;lua-resty-inspect 的作者。 原文链接 为什么需要 Lua 动态调试插件&#xff1f; Apache APISIX 有很多 Lua 代码&#xff0c;如何在运行时不触碰源代码的…...

#科研筑基# python初学自用笔记 第五篇 函数

调用函数python有很多内置函数&#xff0c;我们可以直接调用&#xff0c;详见python官方文档&#xff1a;内置函数 — Python 3.11.2 文档&#xff0c;也可以在命令行中输入help(函数名)来查看该函数的使用法则。函数名的本质就是指向一个函数对象的引用&#xff0c;完全可以用…...

设计模式之策略模式

一.基本内容1 . 实例有各种鸭子&#xff08;野鸭&#xff0c;北京鸭子&#xff0c;水鸭等&#xff0c;鸭子有各种行为&#xff0c;比如飞&#xff0c;叫等显示鸭子的信息传统方法解决&#xff1a;鸭子为抽象类&#xff0c;具体鸭子继承抽象类2.传统方法的不足&#xff1a;其他鸭…...

dbdeployer 使用札记

https://github.com/datacharmer/dbdeployer默认配置文件为当前用户的$HOME/.dbdeployer/config.json作为配置文件&#xff0c;可以通过dbdeplyoer defaults export导出并修改配置或者直接通过dbdeployer defaults update来更新默认文件&#xff0c;配置文件包含MySQL初始信息。…...

MATLAB算法实战应用案例精讲-【图像处理】数字图像模糊化(附Java、python和matlab代码实现)

目录 前言 几个相关概念 噪声 滤波器 算法原理 算法思想 噪...

搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法

搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 Coding GitHub Hexo Markdown 搭建博客 大家好&#xff0c;这是我第一次写博客。使用 GitHub Hexo 创建最基本的博客很容易&#xff0c;网上有很多现成的教程。…...

【C++修行之路】C/C++内存管理

文章目录程序区域内存划分C语言动态内存分配&#xff1a;new和delete&#xff1a;new、delete和malloc、free的区别:程序区域内存划分 C/C程序内存区域划分非常相似。 C语言动态内存分配&#xff1a; malloc、calloc、realloc都是C语言动态开辟内存的常用函数 其中 malloc 开…...

spring cloud alibaba Sentinel(四)

服务雪崩 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。 如果一个服务出现了问题&#xff0c;调用这个服务就会出现线程阻塞的情况&#xff0c; 此时若有大量的请求涌入&#xff0c;就会出现多条 线程阻塞等待&#xff0c;进而导致服务瘫痪。 由于服…...

Redis第三讲

目录 三、Redis03 3.1 Redis持久化之RDB 3.1.1 什么是RDB 3.1.2 备份是如何执行的 3.1.3 Fork 3.1.4 RDB持久化流程 3.1.5 dump.rdb文件 3.1.6 配置rdb文件生成位置 3.1.7 如何触发RDB快照以及保持策略 3.2 Redis持久化之AOF 3.2.1 什么是AOF 3.2.2 AOF持久化流程 …...

JAVA线程池的使用

一、池化思想和JAVA线程池 池化是很重要的思想&#xff1b;池化的好处是提供缓冲和统一的管理。这个笔者在本人的数据库连接池的博客中已经提到过了&#xff08;JAVA常用数据库连接池_王者之路001的博客-CSDN博客 &#xff09;。 线程池是另一种池化思想的运用&#xff0c;把…...

力扣56.合并区间

文章目录力扣56.合并区间题目描述排序合并力扣56.合并区间 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…...

代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||

24.两两交换链表中的节点 文章链接&#xff1a;代码随想录 (programmercarl.com) 思路&#xff1a; &#xff08;1&#xff09;首先如果要处理相邻两个节点的话&#xff0c;一定需要操作两个节点的前一个节点才可以&#xff0c;因此&#xff0c;本题需要设定一个虚拟头节点 …...

我应该在我的博客上写什么? 介绍如何撰写初学者容易担心的文章

我想有很多人开了博客&#xff0c;但想不起来写作&#xff0c;无法取得进展。 博客的主题和文章的内容不会仅仅通过写你想做的事情来工作。 重要的是要了解用户想要阅读的内容以及人们可能收集的内容&#xff0c;并将其与您想要编写的内容很好地匹配。 这一次&#xff0c;我…...

嵌入式C语言设计模式 --- 外观模式

1 - 什么是外观模式? 外观模式(Facade Pattern),是一种比较简单的结构型模式,它存在的目的,也是为了简单。 外观模式隐藏了一系列接口的复杂性,旨在为外部客户端提供一个更高层次且统一简单的接口,简化了客户端调用某些模块的一系列操作。 外观模式应该是软件工程师…...

若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】

昨天情人节一(&#xffe3;︶&#xffe3;*)) 送给赛利亚一((*&#xffe3;3&#xffe3;)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 修改后的页面&#xff1a; 干干净净贼舒服一Ψ(&#xffe3;∀&#xffe3;)Ψ——Ψ(&#xffe3;∀&#x…...

SCI论文写作神器集合 —— 超级实用

特此声明&#xff1a; 本文拷贝多处别人的内容&#xff0c;并给出具体的链接 本文所提到的软件都为博主在文章撰写过程中发掘的比较实用的工具&#xff0c;旨在帮助小伙伴们更快更有效率的完成文章发表&#xff0c;如果其他好用的工具&#xff0c;欢迎各位交流~~ 一、文献搜索神…...

自己给公司做网站/百度网页游戏大厅

在日常工作中&#xff0c;批量管理服务器是个力气活&#xff0c;如果人工一台一台处理&#xff0c;效率低下。此时&#xff0c;老外写的pssh工具实现了批量管理。http://www.theether.org/pssh/ 它的原理是先建立ssh私钥认证&#xff0c;然后用pssh工具批量管理。 下面&#xf…...

wordpress搭建外贸网站/网站推广软文

出现bug的位置 系统环境 Vc6.0版本 下载文件FileTool&#xff0c;文件出处&#xff1a;http://download.csdn.net/detail/chenlu5201314/9847301 解决方法1、 下载FileTool.exe&#xff0c;并解压 下载FileTool.exe&#xff0c;选择【Unzip To Folder】的路径&#xff0…...

济南国画网站建设/企业官方网站有哪些

近日&#xff0c;欧洲地区爆发新型勒索病毒Bad Rabbit(坏兔子)&#xff0c;感染范围包含俄罗斯、乌克兰、德国等多个东欧国家。据国内网络安全企业介绍&#xff0c;该病毒伪装成Adobe flash player欺骗用户安装&#xff0c;感染后会在局域网内扩散。 Bad Rabbit会以感染的设备为…...

厦门三五互联可以做网站吗/百度网盘网页版登录

目标 电烙铁的温度是50度以上和185度以上的时候&#xff0c;LED点亮。 用料 arduinoUNOled&#xff08;2个&#xff09;电阻器&#xff08;1kΩ/3个&#xff09;热敏电阻&#xff08;103CT4/1个&#xff09;https://www.marutsu.co.jp/pc/i/59749/电路图 A1&#xff5e;A3&…...

做直播网站收费吗/网站推广优化方案

糍粑我们中国一种传统的美食了&#xff0c;在很多的节日的时候都会制作食用&#xff0c;非常的受人们的喜欢&#xff0c;将糯米蒸熟之后进行捣烂就可以制作出来&#xff0c;糍粑有很多的吃法&#xff0c;但是我们很多时候一次吃不完就是需要保存起来&#xff0c;下次在吃&#…...

dobby主题wordpress/360优化大师安卓下载

1、File类常用方法及应用 创建&#xff1a; createNewFile()在指定位置创建一个空文件&#xff0c;成功就返回true&#xff0c;如果已存在就不创建&#xff0c;然后返回false。 mkdir() 在指定位置创建一个单级文件夹。 mkdirs() 在指定位置创建一个多级文件夹。 renameTo(F…...