首页
关于
Search
1
SteamOS安装paru和yay
170 阅读
2
欢迎使用 Typecho
127 阅读
3
徕卡X | 冬日漫步
127 阅读
4
https自动跳转问题终极解决方案
116 阅读
5
Spark3中的Catalog组件设计
104 阅读
默认
摄影
后端开发
大数据
Spark
Flink
登录
Search
标签搜索
转载
ArlenDu
累计撰写
18
篇文章
累计收到
10
条评论
首页
栏目
默认
摄影
后端开发
大数据
Spark
Flink
页面
关于
搜索到
18
篇与
的结果
2025-05-10
【转载】用certbot申请Let's Encrypt泛域名证书
转载来源:https://www.cnblogs.com/oboth-zl/p/14330854.html正文什么是Let's Encrypt?目前世界上就只有为数不多的几家域名证书签发机构得到浏览器的认可,而Let‘s Encrypt就是其中一家,并且你可以申请到免费的证书,当然你如果想要付费也行,很多机构证书动辄几千几万一年。如果我们只想搭建个测试环境有需要https,我们肯定不会去花这个冤枉钱,当然免费的午餐并没有那么好吃,Let's Encrypt申请的证书只有90天有效期,所以到期你得进行续期操作。并且还有各种各样得条件限制,比如一周你只能申请多少次,同一个ip一天只能操作多少次之类,详见https://letsencrypt.org/docs/rate-limits/假如你使用jdk生成的自签证书能不能用呢?当然是可以用的,只不过浏览器会告诉你这个证书我不承认。也就是左上角会给你挂个不安全的警告。什么是泛域名证书?例如:*.xxx.cn 也就是这个证书可以给某个域名的所有二级域名使用,就叫做泛域名证书(也称作通配符证书)。Let's Encrypt 官方推荐我们使用certbot 脚本申请证书(当然也可以使用acme.sh等方式),以下是申请步骤基于Debian10 python3.7.3如果你在操作过程中遇到什么报错,请多考虑python工具包的版本问题之类的。Let's Encrypt自2018年开始支持申请泛域名证书,相比于单域名证书,泛域名证书更利于日常的维护。准备工作下载 certbot,这个很多发行版的源中都已经自带了。比如Debian的:sudo apt install certbot需要有域名的管理权限,因为申请泛解析证书需要使用 DNS 验证,这就需要你能够根据要求操作 DNS 解析记录,以此证明你对域名的权限。开始申请泛域名证书certbot certonly --preferred-challenges dns --manual -d *.xx.cn --server https://acme-v02.api.letsencrypt.org/directorySaving debug log to /var/log/letsencrypt/letsencrypt.logPlugins selected: Authenticator manual, Installer NoneObtaining a new certificatePerforming the following challenges:dns-01 challenge for xx.cn- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -NOTE: The IP of this machine will be publicly logged as having requested thiscertificate. If you're running certbot in manual mode on a machine that is notyour server, please ensure you're okay with that.Are you OK with your IP being logged?- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(Y)es/(N)o: y- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Please deploy a DNS TXT record under the name_acme-challenge.xx.cn with the following value:nI0DhzH-vn0W7STVuLi2O-oIKuFNlqQx5EnjB-zewvsBefore continuing, verify the record is deployed.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Press Enter to Continue #让你的二级域名_acme-challenge.xx.cn用TXT方式解析到nI0DhzH-vn0W7STVuLi2O-oIKuFNlqQx5EnjB-zewvs#可用dig -t txt _acme-challenge.xx.cn验证解析是否生效,然后按下Enter通过验证。 debian可用apt install dnsutils来安装dig命令。 #也可以用nslookup命令来验证。Waiting for verification...Cleaning up challengesIMPORTANT NOTES:- Congratulations! Your certificate and chain have been saved at:/etc/letsencrypt/live/xx.cn/fullchain.pemYour key file has been saved at:/etc/letsencrypt/live/xx.cn/privkey.pemYour cert will expire on 2021-04-26. To obtain a new or tweakedversion of this certificate in the future, simply run certbotagain. To non-interactively renew all of your certificates, run"certbot renew"- If you like Certbot, please consider supporting our work by:Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donateDonating to EFF: https://eff.org/donate-le\#至此证书申请成功参数说明:certonly 表示只申请证书。--no-bootstrap 需要用户同意的系统级操作直接选N。--manual 表示交互式申请。-d 为那些主机申请证书如 *.xxx.cn(此处为泛域名)--preferred-challenges dns,使用 DNS 方式校验域名所有权,可以配置多个--server Let's Encrypt ACME v2 版本使用的服务器不同于 v1 版本(V2版本才支持泛域名解析),需要显示指定。证书签发成功后去Nginx或Apache配置新生成的证书文件即可。撤销证书倘若有不需要的证书了,可撤销删除。sudo certbot revoke --cert-path /etc/letsencrypt/archive/xx.cn/cert1.pemSaving debug log to /var/log/letsencrypt/letsencrypt.log- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Would you like to delete the cert(s) you just revoked, along with all earlierand later versions of the cert?- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(Y)es (recommended)/(N)o: y #是否删除证书自动验证的方式申请证书上面的方式需要手动去到DNS解析服务商更改解析通过验证,其实通过Certbot 官方的插件可以实现自动更新DNS通过验证。https://certbot.eff.org/docs/using.html#manual支持上面这些服务商。准备安装对应的DNS插件sudo apt install python3-certbot-dns-cloudflare #sudo apt install python2-certbot-dns-cloudflare#我用到的服务商是Cloudflare*配置 DNS 插件*在cloudflare获取KEY/TOKEN****两种方式均可,只是token的方式需要2.3.1版本以上的python*-certbot-dns-cloudflare插件。出于安全因素,推荐前者的方式。# Cloudflare API credentials used by Certbot dns_cloudflare_email = cloudflare@example.com dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567将上面的配置信息写入~/cloudflare.ini。申请sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/cloudflare.ini --dns-cloudflare-propagation-seconds 60 --preferred-challenges dns -d *.example.win --server https://acme-v02.api.letsencrypt.org/directory #--dns-cloudflare-propagation-seconds 60 #等待60秒, 等DNS解析生效由于这里的泛域名证书之前已申请过,且存在于服务器,Certbot自动进行了续期操作。至此,泛域名证书申请完成。续期若是通过手动更改DNS解析的方式申请的域名,我们执行certbot renew时会报错。此时只有重新按照申请证书的步骤再来一遍。certbot certonly --preferred-challenges dns --manual -d *.xx.cn --server https://acme-v02.api.letsencrypt.org/directory若是通过API自动验证的方式申请的,则可以直接用cerbot renew的方式更新证书!
2025年05月10日
12 阅读
0 评论
0 点赞
2025-01-06
SQL优化技巧
存储优化1. 行/列存储顾名思义,行存储就是数据的存储按照标准的一行一行的对数据进行存储,而列存储则是一列的数据是连续的存储在一起,这一列存完之后再进行下一列的存储,这样有个好处是当仅需查询某几列的时候能快速读取这几列的数据,减少数据的检索和读取。行存储:由于每行数据都存储在一起,追加数据比较简单,相对来说效率较好;另外如果使用select *的场景比较多,列存储没有什么优势,可以使用行存储。列存储:具有良好的读取性能,能够快速读取需要的列,更适合大数据集的数据查询,比如数据仓库的表一般来说不需要查询全部字段,故绝大部分表都是使用的列存储。另外列存储支持更好的压缩比,能够更好的节省空间。2. 表分区表分区在大数据中是一个非常重要的优化手段,以Hive表为例,每一个分区在存储上都是一个独立的目录,当SQL中,如果使用分区限制条件能快速的定位到这个数据目录,然后进行数据的读取,可以极大的提升查询效率。另外Hive表也需要使用分区目录进行整个目录的覆盖,所以如果表设计成需要能重刷的能力,最好建成分区表以便支持重刷。SQL案例:1,尽早的过滤数据说明:尽早的过滤数据可以减少网络IO,也可以减少不必要的计算,比如尽早加上分区条件,where dt='日期'×:select * from test.test_city_base_info where create_time >='2024-06-11 12:00:00' and create_time<='2024-06-11 13:00:00'√:select * from test.test_city_base_info where dt='2024-06-11' and create_time>='2024-06-11 12:00:00' and create_time<='2024-06-11 13:00:00'2,只查询需要的字段,避免使用Select * 写法说明:数仓表大多数时候都使用列式存储, 查询字段能很快的查到对应的列,并且也可以减少数据量,减少网络IO。×:select * from test.test_city_base_info√:select city_id,province_id from test.test_city_base_info
2025年01月06日
26 阅读
0 评论
0 点赞
2024-12-27
SteamOS安装paru和yay
1.修改配置文件sudo vim /etc/pacman.conf#国内镜像源 [archlinuxcn] Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch2.生成签名keysudo pacman-key --lsign-key "ci-package-builder-1@steamos.cloud" sudo pacman -Syy && sudo pacman -S archlinuxcn-keyring3.安装paru/yay(二选一即可)安装fakeroot注意:最新版yay需要依赖pacman 6.1.0, steamdeck已经无法安装,建议使用parusudo pacman -S paru sudo pacman -S yay sudo pacman -S fakeroot sudo pacman -S --needed base-devel4.附上安装clash-verge命令paru -S clash-verge-rev-binPS:如果安装报错签名问题,修改配置文件禁用签名sudo vim /etc/pacman.conf SigLevel = Never
2024年12月27日
170 阅读
0 评论
0 点赞
2024-12-12
Spark调优
Spark调优你的SQL是如何执行的?Catalyst优化器:逻辑计划解析:Catalyst就是要结合DataFrame的Schema信息,来确认计划中的表名、字段名、字段类型与实际数据是否一致逻辑计划优化:通过启发式规则,将Analyzed Logical Plan转换为Optimized Logical Plan。启发式规则包括以下几类:谓词下推,列裁剪,常量折叠。优化SparkPlan:主要是通过规则,将逻辑计划(要做什么)转换为(怎么做)的过程,其中最重要的则是JoinSelection。生成物理执行计划:主要是确认操作的输入要求,添加Shuffle,Sort等, 存储复用,子查询复用,UDF分发,最终通过Tungsten计划优化(全阶段代码生成)转化成可以执行的RDD分布式任务。Spark的五种Join策略。Tungsten(钨丝计划):数据结构设计: 紧凑的UnsafeRow的二进制数据格式(更低的存储开销,一个对象封装一条记录), 基于内存页的数据管理。全阶段代码生成(WSCG):基于同一Stage内操作符之间的调用关系,生成一份“手写代码”,来把所有计算融合为一个统一的函数。Spark核心概念如何理解弹性分布式数据集?属性名成员类型属性含义RDD特性partitions变量RDD的所有数据分片实体分布式partitioner方法划分数据分区的规则分布式dependencies变量生成该RDD所依赖的父RDD容错性compute方法生成该RDD的计算接口容错性RDD,DataFrame, DataSet的关系RDD,DataFrame, DataSet对比 RDDDataFrameDataSet不可变性✅✅✅分区✅✅✅Schema❌✅✅查询优化器❌✅✅API级别低高 (基于RDD实现)高(DataFrame的扩展)是否存储类型✅❌✅何时检测语法错误编译时编译时编译时何时检测分析错误编译时运行时编译时Spark的内存计算分布式数据缓存: Spark允许将分布式数据集缓存到计算节点的内存中,从而对其进行高效的访问。但是需要注意的是,只有需要频繁访问的数据集才有必要cache,对于一次性访问的数据集,cache不但不能提升执行效率,反而会产生额外的性能开销,让结果适得其反。DAG内部的流水式计算模式:对于我们经常说的Spark比Hive快,是因为Spark是基于内存计算的这种说法,其实是错误的,因为无论是Spark还是Hive,计算都是发生在内存中,真正的说法应该是“在同一个STAGE内,Spark会尽可能的使用内存计算,减少中间结果的落盘,并且通过融合计算来提升数据在内存中的转换效率,从而提升应用的整体性能”。DAG的划分过程:以Actions算子为起点,从后向前回溯DAG,以Shuffle操作为边界去划分Stages。意义:1.根据DAG可以进行任务的调度,无依赖的STAGE可以并行计算;2.构建DAG后当前STAGE发生故障可以根据DAG的血缘的父依赖计算,不用从头重新计算一次;那么,Spark调度如何进行任务的调度呢?工作流程如下:序号流程步骤调度系统组件1将DAG拆分为不同的运行阶段StagesDAGScheduler2创建分布式任务Tasks和任务组TaskSetDAGScheduler3获取集群内可用的硬件资源情况SchedulerBackend4按照调度规则决定优先调度哪些任务/组TaskScheduler5依序将分布式任务分发到执行器ExecutorTaskScheduler对于第5步来说,分发的原则是:Spark调度系统的原则是尽可能地让数据呆在原地(本地性级别)、保持不动,同时尽可能地把承载计算任务的代码分发到离数据最近的地方,从而最大限度地降低分布式系统中的网络开销。Spark调优CPU视角:并行并行指的是为了实现数据的分布式计算,分布式数据集被划分出来的份数。并行度明确了数据划分的粒度:并行度越高,数据的粒度越细,数据分片越多,数据越分散。由两个参数控制:spark.default.parallelism:设置RDD的默认并行度spark.sql.shuffle.partitions:Spark SQL开发框架下,指定了Shuffle Reduce阶段默认的并行度并发基本由下列参数控制:spark.executor.cores:Executor的线程池大小由参数spark.executor.cores (默认为1且基本不用改变) 决定,每个任务在执行期间需要消耗的线程数由spark.task.cpus配置项给定配置建议:首先,在一个Executor中,每个CPU线程能够申请到的内存比例是有上下限的,最高不超过1/N,最低不少于1/N/2,其中N代表线程池大小。其次,在给定线程池大小和执行内存的时候,并行度较低、数据分片较大容易导致CPU线程挂起,线程频繁挂起不利于提升CPU利用率,而并行度过高、数据过于分散会让调度开销更显著,也不利于提升CPU利用率。最后,在给定执行内存M、线程池大小N和数据总量D的时候,想要有效地提升CPU利用率,我们就要计算出最佳并行度P,计算方法是让数据分片的平均大小D/P坐落在(M/N/2, M/N)区间。这样,在运行时,我们的CPU利用率往往不会太差。内存视角:Spark内存模型:Execution Memory:执行内存,堆外内存用于执行分布式任务,如Shuffle、Sort和Aggregate等操作,堆内内存用于存储任务执行过程中产生的临时数据和广播变量;堆外内存则用于执行Shuffle,堆外排序,Netty网络通信等。Storage Memory:用于存储RDD或DataFrame中缓存的数据。对于需要高效序列化和反序列化的数据,可以通过使用堆外内存来减少JVM的GC压力。同时堆外内存还可以存储UnSafe紧凑结构的数据,可以减少内存开销和提高CPU缓存的利用率。Reserved Memory: Spark保留内存,用于存储Spark内部对象User Memeory:用于存储用户定义的数据结构内存分配:调参建议: 对于日常调优来说,使用默认的参数4G即可,如果不够可以增加executor的数量。这里要注意的一点是spark.executor.cores对于参数的影响,同一个executor的内存会根据这个参数进行切分,避免切的太碎导致OOM。硬盘视角:磁盘的作用: 溢出临时文件 存储Shuffle中间文件 缓存分布式数据集调参建议: 一般来说,磁盘是不需要调整的,使用默认的即可。但是如果可以,尽量使用SSD磁盘来提升,通过spark.local.dir指定。Spark性能杀手-ShuffleShuffle介绍1.普通Shuffle2.bypass 运行机制3.Tungsten Sort Shuffle 运行机制Tungsten Sort 是对普通 Sort 的一种优化,Tungsten Sort 会进行排序,但排序的不是内容本身,而是内容序列化后字节数组的指针(元数据),把数据的排序转变为了指针数组的排序,实现了直接对序列化后的二进制数据进行排序。由于直接基于二进制数据进行操作,所以在这里面没有序列化和反序列化的过程。内存的消耗大大降低,相应的,会极大的减少的 GC 的开销。Shuffle慢的原因Shuffle需要消耗所有的硬件资源。数据的分发需要写入内存,内存不够时又需要溢写到磁盘,跨节点的网络分发,也消耗了大量的网络IO。其次,Shuffle消耗的不同硬件资源之间很难达到平衡。资源消耗对比:网络IO>磁盘IO>内存IO如何避免Shuffle?尽可能的延迟shuffle的操作,比如先执行其他的过滤,聚合操作,再去做join。使用广播变量广播变量广播变量是一种分发机制,它一次性封装目标数据结构,以Executors为粒度去做数据分发。使用广播变量,由于本地节点就有全量数据,所以可以再在本地直接进行关联,避免了分布式数据集需要shuffle后再进行join的难题。如何使用?代码中显示指定。Spark代 API中使用broadcast方法进行广播。SparkSQL中使用SQL Hints 指定 /+ broadcast/使用参数自动调参:spark.sql.autoBroadcastJoinThreshold(默认值为10MB),也就是说,低于10M表在使用时,会自动优先选择broadcast join。需要注意的是,这个参数不是越大越好,要考虑到内存中是否放得下这么大的数据避免导致OOM。Spark3新特性介绍AQESparkSQL的优化历程经历了三个阶段:RBO(Rule Based Optimization,基于规则的优化) —> CBO(Cost Based Optimization,基于成本的优化,2.2版本中加入)-> AQE(Adaptive Query Execution,自适应查询执行)RBO和CBO都是静态的优化计划,虽然CBO可以根据表的真实情况进行一定的优化,但是一旦执行计划被提交,就不会再改变,而AQE的出现,则是解决了这个问题。AQE是Spark SQL的一种动态优化机制,在运行时,每当Shuffle Map阶段执行完毕,AQE都会结合这个阶段的统计信息,基于既定的规则动态地调整、修正尚未执行的逻辑计划和物理计划,来完成对原始查询语句的运行时优化。AQE的三大特性:Join策略调整:如果某张表在过滤之后,尺寸小于广播变量阈值,这张表参与的数据关联就会从Shuffle Sort Merge Join降级(Demote)为执行效率更高的Broadcast Hash Join。自动分区合并:在Shuffle过后,Reduce Task数据分布参差不齐,AQE将自动合并过小的数据分区。自动倾斜处理:结合配置项,AQE自动拆分Reduce阶段过大的数据分区,降低单个Reduce Task的工作负载。DPP原理:DPP是基于分区裁剪实现的,如果过滤谓词中包含分区键,那么Spark SQL对分区表做扫描的时候,是完全可以跳过(剪掉)不满足谓词条件的分区目录,这就是分区剪裁,而动态分区裁剪可以根据Join Key中的数据去做分区裁剪。其中,触发DPP的三个条件:事实表必须是分区表,而且分区字段(可以是多个)必须包含Join Key。DPP仅支持等值Joins,不支持大于、小于这种不等值关联关系。维度表过滤之后的数据集要小于广播阈值。Join HintsSpark SQL在生成物理执行计划的时候,会根据规则去选择最优的join selection,但是所谓计划赶不上变化,预置的规则自然很难覆盖多样且变化无常的计算场景。因此,当我们掌握了不同Join策略的工作原理,结合我们对于业务和数据的深刻理解,完全可以自行决定应该选择哪种Join策略。使用方法: 在SQL中使用 /*+ Join Hints /
2024年12月12日
28 阅读
0 评论
0 点赞
2024-11-09
Flink内存模型
Flink的内存分为堆外和堆内内存。假设一个任务的TaskManager的任务配置了4G,内存模型如下图所示。其中托管内存(1.34G)和网络内存(343M)基本没用,那就可以把托管内存和网络内存设置为最小值64M,那就可以省出1340-64+343-64=1555M, 这部分内存就会加到堆内存上面去,此时堆内存的容量就变成了3G,而仅仅使用了1G,完全可以省出1-1.5G出来。堆内内存:FreamworkHeap:框架使用的堆内存(默认固定128M)TaskHeap:任务使用的堆内存堆外内存:ManagedMemory:托管内存,默认情况分配40%,但是不一定使用,是内存治理的重灾区。托管内存的用处有:批处理算法,比如排序,hashjoin等。RocksDB StateBackend,Flink 只会预留一部分空间并扣除预算,但是不介入实际内存分配PyFlink, 与 JNI 类似,在与 Python 进程交互的过程中,也会用到一部分托管内存。Freamwork Off-Heap:框架使用的堆外内存,(默认固定128M)DirectMemory:框架自身(taskmanager.memory.framework.off-heap.size 参数,默认 128M,例如 Sort-Merge Shuffle 算法所需的内存)用户任务(taskmanager.memory.task.off-heap.size 参数,默认设为 0)Netty 对 Network Buffer 的网络传输(taskmanager.memory.network.fraction 等参数,默认 0.1 即 10% 的 Flink 总内存)。JVM Metaspace:JVM Metaspace 主要保存了加载的类和方法的元数据,Flink 配置的参数是 taskmanager.memory.jvm-metaspace.size,默认大小为 256M,JVM 参数是 -XX:MaxMetaspaceSize.JVM OverHead:JVM运行时开销,除了上述描述的内存区域外,JVM 自己还有一小块 “自留地”,用来存放线程栈、编译的代码缓存、JNI 调用的库所分配的内存等等,Flink 配置参数是 taskmanager.memory.jvm-overhead.fraction,默认是 JVM 总内存的 10%。
2024年11月09日
33 阅读
0 评论
0 点赞
1
2
...
4