Tips
Go
(18条消息) Go语言自学系列 | golang包_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之channel的遍历_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之select switch_COCOgsta的博客-CSDN博客_golang select switch
(18条消息) Go语言自学系列 | golang并发编程之runtime包_COCOgsta的博客-CSDN博客_golang runtime包
(18条消息) Go语言自学系列 | golang接口值类型接收者和指针类型接收者_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之Timer_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang方法_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之WaitGroup实现同步_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang构造函数_COCOgsta的博客-CSDN博客_golang 构造函数
(18条消息) Go语言自学系列 | golang方法接收者类型_COCOgsta的博客-CSDN博客_golang 方法接收者
(18条消息) Go语言自学系列 | golang接口_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang接口和类型的关系_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang结构体_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang结构体_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang标准库os模块 - File文件读操作_COCOgsta的博客-CSDN博客_golang os.file
(18条消息) Go语言自学系列 | golang继承_COCOgsta的博客-CSDN博客_golang 继承
(18条消息) Go语言自学系列 | golang嵌套结构体_COCOgsta的博客-CSDN博客_golang 结构体嵌套
(18条消息) Go语言自学系列 | golang并发编程之Mutex互斥锁实现同步_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发变成之通道channel_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之原子操作详解_COCOgsta的博客-CSDN博客_golang 原子操作
(18条消息) Go语言自学系列 | golang并发编程之原子变量的引入_COCOgsta的博客-CSDN博客_go 原子变量
(18条消息) Go语言自学系列 | golang并发编程之协程_COCOgsta的博客-CSDN博客_golang 协程 并发
(18条消息) Go语言自学系列 | golang接口嵌套_COCOgsta的博客-CSDN博客_golang 接口嵌套
(18条消息) Go语言自学系列 | golang包管理工具go module_COCOgsta的博客-CSDN博客_golang 包管理器
(18条消息) Go语言自学系列 | golang标准库os模块 - File文件写操作_COCOgsta的博客-CSDN博客_go os模块
(18条消息) Go语言自学系列 | golang结构体的初始化_COCOgsta的博客-CSDN博客_golang 结构体初始化
(18条消息) Go语言自学系列 | golang通过接口实现OCP设计原则_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang标准库os包进程相关操作_COCOgsta的博客-CSDN博客_golang os包
(18条消息) Go语言自学系列 | golang标准库ioutil包_COCOgsta的博客-CSDN博客_golang ioutil
(18条消息) Go语言自学系列 | golang标准库os模块 - 文件目录相关_COCOgsta的博客-CSDN博客_go语言os库
Golang技术栈,Golang文章、教程、视频分享!
(18条消息) Go语言自学系列 | golang结构体指针_COCOgsta的博客-CSDN博客_golang 结构体指针
Ansible
太厉害了,终于有人能把Ansible讲的明明白白了,建议收藏_互联网老辛
ansible.cfg配置详解
Docker
Docker部署
linux安装docker和Docker Compose
linux 安装 docker
Docker中安装Docker遇到的问题处理
Docker常用命令
docker常用命令小结
docker 彻底卸载
Docker pull 时报错:Get https://registry-1.docker.io/v2/library/mysql: net/http: TLS handshake timeout
Docker 拉镜像无法访问 registry-x.docker.io 问题(Centos7)
docker 容器内没有权限
Linux中关闭selinux的方法是什么?
docker run 生成 docker-compose
Docker覆盖网络部署
docker pull后台拉取镜像
docker hub
Redis
Redis 集群别乱搭,这才是正确的姿势
linux_离线_redis安装
怎么实现Redis的高可用?(主从、哨兵、集群) - 雨点的名字 - 博客园
redis集群离线安装
always-show-logo yes
Redis集群搭建及原理
[ERR] Node 172.168.63.202:7001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some - 亲爱的不二999 - 博客园
Redis daemonize介绍
redis 下载地址
Redis的redis.conf配置注释详解(三) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(一) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(二) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(四) - 云+社区 - 腾讯云
Linux
在终端连接ssh的断开关闭退出的方法
漏洞扫描 - 灰信网(软件开发博客聚合)
find 命令的参数详解
vim 编辑器搜索功能
非root安装rpm时,mockbuild does not exist
Using a SSH password instead of a key is not possible because Host Key checking
(9条消息) 安全扫描5353端口mDNS服务漏洞问题_NamiJava的博客-CSDN博客_5353端口
Linux中使用rpm命令安装rpm包
ssh-copy-id非22端口的使用方法
How To Resolve SSH Weak Key Exchange Algorithms on CentOS7 or RHEL7 - infotechys.com
Linux cp 命令
yum 下载全量依赖 rpm 包及离线安装(终极解决方案) - 叨叨软件测试 - 博客园
How To Resolve SSH Weak Key Exchange Algorithms on CentOS7 or RHEL7 - infotechys.com
RPM zlib 下载地址
运维架构网站
欢迎来到 Jinja2
/usr/local/bin/ss-server -uv -c /etc/shadowsocks-libev/config.json -f /var/run/s
ruby 安装Openssl 默认安装位置
Linux 常用命令学习 | 菜鸟教程
linux 重命名文件和文件夹
linux命令快速指南
ipvsadm
Linux 下查找日志中的关键字
Linux 切割大 log 日志
CentOS7 关于网络的设置
rsync 命令_Linux rsync 命令用法详解:远程数据同步工具
linux 可视化界面安装
[问题已处理]-执行yum卡住无响应
GCC/G++升级高版本
ELK
Docker部署ELK
ELK+kafka+filebeat+Prometheus+Grafana - SegmentFault 思否
(9条消息) Elasticsearch设置账号密码_huas_xq的博客-CSDN博客_elasticsearch设置密码
Elasticsearch 7.X 性能优化
Elasticsearch-滚动更新
Elasticsearch 的内存优化_大数据系统
Elasticsearch之yml配置文件
ES 索引为Yellow状态
Logstash:Grok filter 入门
logstash grok 多项匹配
Mysql
Mysql相关Tip
基于ShardingJDBC实现数据库读写分离 - 墨天轮
MySQL-MHA高可用方案
京东三面:我要查询千万级数据量的表,怎么操作?
OpenStack
(16条消息) openstack项目中遇到的各种问题总结 其二(云主机迁移、ceph及扩展分区)_weixin_34104341的博客-CSDN博客
OpenStack组件介绍
百度大佬OpenStack流程
openstack各组件介绍
OpenStack生产实际问题总结(一)
OpenStack Train版离线部署
使用Packstack搭建OpenStack
K8S
K8S部署
K8S 集群部署
kubeadm 重新 init 和 join-pudn.com
Kubernetes 实战总结 - 阿里云 ECS 自建 K8S 集群 Kubernetes 实战总结 - 自定义 Prometheus
【K8S实战系列-清理篇1】k8s docker 删除没用的资源
Flannel Pod Bug汇总
Java
Jdk 部署
JDK部署
java线程池ThreadPoolExecutor类使用详解 - bigfan - 博客园
ShardingJDBC实现多数据库节点分库分表 - 墨天轮
Maven Repository: Search/Browse/Explore
其他
Git在阿里,我们如何管理代码分支?
chrome F12调试网页出现Paused in debugger
体验IntelliJ IDEA的远程开发(Remote Development) - 掘金
Idea远程调试
PDF转MD
强哥分享干货
优秀开源项目集合
vercel 配合Github 搭建项目Doc门户
如何用 Github Issues 写技术博客?
Idea 2021.3 Maven 3.8.1 报错 Blocked mirror for repositories 解决
列出maven依赖
[2022-09 持续更新] 谷歌 google 镜像 / Sci-Hub 可用网址 / Github 镜像可用网址总结
阿里云ECS迁移
linux访问github
一文教你使用 Docker 启动并安装 Nacos-腾讯云开发者社区-腾讯云
Nginx
Nginx 部署
Nginx 部署安装
Nginx反向代理cookie丢失的问题_longzhoufeng的博客-CSDN博客_nginx 代理后cookie丢失
Linux 系统 Https 证书生成与Nginx配置 https
数据仓库
实时数仓
松果出行 x StarRocks:实时数仓新范式的实践之路
实时数据仓库的一些分层和分层需要处理的事情,以及数据流向
湖仓一体电商项目
湖仓一体电商项目(一):项目背景和架构介绍
湖仓一体电商项目(二):项目使用技术及版本和基础环境准备
湖仓一体电商项目(三):3万字带你从头开始搭建12个大数据项目基础组件
数仓笔记
数仓学习总结
数仓常用平台和框架
数仓学习笔记
数仓技术选型
尚硅谷教程
尚硅谷学习笔记
尚硅谷所有已知的课件资料
尚硅谷大数据项目之尚品汇(11数据质量管理V4.0)
尚硅谷大数据项目之尚品汇(10元数据管理AtlasV4.0)
尚硅谷大数据项目之尚品汇(9权限管理RangerV4.0)
尚硅谷大数据项目之尚品汇(8安全环境实战V4.0)
尚硅谷大数据项目之尚品汇(7用户认证KerberosV4.1)
尚硅谷大数据项目之尚品汇(6集群监控ZabbixV4.1)
尚硅谷大数据项目之尚品汇(5即席查询PrestoKylinV4.0)
尚硅谷大数据项目之尚品汇(4可视化报表SupersetV4.0)
尚硅谷大数据项目之尚品汇(3数据仓库系统)V4.2.0
尚硅谷大数据项目之尚品汇(2业务数据采集平台)V4.1.0
尚硅谷大数据项目之尚品汇(1用户行为采集平台)V4.1.0
数仓治理
数据中台 元数据规范
数据中台的那些 “经验与陷阱”
2万字详解数据仓库数据指标数据治理体系建设方法论
数据仓库,为什么需要分层建设和管理? | 人人都是产品经理
网易数帆数据治理演进
数仓技术
一文看懂大数据生态圈完整知识体系
阿里云—升舱 - 数据仓库升级白皮书
最全企业级数仓建设迭代版(4W字建议收藏)
基于Hue,Dolphinscheduler,HIVE分析数据仓库层级实现及项目需求案例实践分析
详解数据仓库分层架构
数据仓库技术细节
大数据平台组件介绍
总览 2016-2021 年全球机器学习、人工智能和大数据行业技术地图
Apache DolphinScheduler 3.0.0 正式版发布!
数据仓库面试题——介绍下数据仓库
数据仓库为什么要分层,各层的作用是什么
Databend v0.8 发布,基于 Rust 开发的现代化云数据仓库 - OSCHINA - 中文开源技术交流社区
数据中台
数据中台设计
大数据同步工具之 FlinkCDC/Canal/Debezium 对比
有数数据开发平台文档
Shell
Linux Shell 命令参数
shell 脚本编程
一篇教会你写 90% 的 Shell 脚本
Kibana
Kibana 查询语言(KQL)
Kibana:在 Kibana 中的四种表格制作方式
Kafka
Kafka部署
canal 动态监控 Mysql,将 binlog 日志解析后,把采集到的数据发送到 Kafka
OpenApi
OpenAPI 标准规范,了解一下?
OpenApi学术论文
贵阳市政府数据开放平台设计与实现
OpenAPI简介
开放平台:运营模式与技术架构研究综述
管理
技术部门Leader是不是一定要技术大牛担任?
华为管理体系流程介绍
DevOps
*Ops
XOps 已经成为一个流行的术语 - 它是什么?
Practical Linux DevOps
Jenkins 2.x实践指南 (翟志军)
Jenkins 2权威指南 ((美)布伦特·莱斯特(Brent Laster)
DevOps组件高可用的思路
KeepAlived
VIP + KEEPALIVED + LVS 遇到Connection Peer的问题的解决
MinIO
MinIO部署
Minio 分布式集群搭建部署
Minio 入门系列【16】Minio 分片上传文件 putObject 接口流程源码分析
MinioAPI 浅入及问题
部署 minio 兼容 aws S3 模式
超详细分布式对象存储 MinIO 实战教程
Hadoop
Hadoop 部署
Hadoop集群部署
windows 搭建 hadoop 环境(解决 HADOOP_HOME and hadoop.home.dir are unset
Hadoop 集群搭建和简单应用(参考下文)
Hadoop 启动 NameNode 报错 ERROR: Cannot set priority of namenode process 2639
jps 命令查看 DataNode 进程不见了 (hadoop3.0 亲测可用)
hadoop 报错: Operation category READ is not supported in state standby
Spark
Spark 部署
Spark 集群部署
spark 心跳超时分析 Cannot receive any reply in 120 seconds
Spark学习笔记
apache spark - Failed to find data source: parquet, when building with sbt assembly
Spark Thrift Server 架构和原理介绍
InLong
InLong 部署
Apache InLong部署文档
安装部署 - Docker 部署 - 《Apache InLong v1.2 中文文档》 - 书栈网 · BookStack
基于 Apache Flink SQL 的 InLong Sort ETL 方案解析
关于 Apache Pulsar 在 Apache InLong 接入数据
zookeeper
zookeeper 部署
使用 Docker 搭建 Zookeeper 集群
美团技术团队
StarRocks
StarRocks技术白皮书(在线版)
JuiceFS
AI 场景存储优化:云知声超算平台基于 JuiceFS 的存储实践
JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践
JuiceFS format
元数据备份和恢复 | JuiceFS Document Center
JuiceFS 元数据引擎选型指南
Apache Hudi 使用文件聚类功能 (Clustering) 解决小文件过多的问题
普罗米修斯
k8s 之 Prometheus(普罗米修斯)监控,简单梳理下 K8S 监控流程
k8s 部署 - 使用helm3部署监控prometheus(普罗米修斯),从零到有,一文搞定
k8s 部署 - 使用 helm3 部署监控 prometheus(普罗米修斯),从零到有,一文搞定
k8s 部署 - 如何完善 k8s 中 Prometheus(普罗米修斯)监控项目呢?
k8s 部署 - k8s 中 Prometheus(普罗米修斯)的大屏展示 Grafana + 监控报警
zabbix
一文带你掌握 Zabbix 监控系统
Stream Collectors
Nvidia
Nvidia API
CUDA Nvidia驱动安装
NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.
ubuntu 20 CUDA12.1安装流程
nvidia开启持久化模式
nvidia-smi 开启持久化
Harbor
Harbor部署文档
Docker 爆出 it doesn't contain any IP SANs
pandoc
其他知识
大模型
COS 597G (Fall 2022): Understanding Large Language Models
如何优雅的使用各类LLM
ChatGLM3在线搜索功能升级
当ChatGLM3能用搜索引擎时
OCR神器,PDF、数学公式都能转
Stable Diffusion 动画animatediff-cli-prompt-travel
基于ERNIE Bot自定义虚拟数字人生成
pika负面提示词
开通GPT4的方式
GPT4网站
低价开通GPT Plus
大模型应用场景分享
AppAgent AutoGPT变体
机器学习
最大似然估计
权衡偏差(Bias)和方差(Variance)以最小化均方误差(Mean Squared Error, MSE)
伯努利分布
方差计算公式
均值的高斯分布估计
没有免费午餐定理
贝叶斯误差
非参数模型
最近邻回归
表示容量
最优容量
权重衰减
正则化项
Sora
Sora官方提示词
看完32篇论文,你大概就知道Sora如何炼成? |【经纬低调出品】
Sora论文
Sora 物理悖谬的几何解释
Sora 技术栈讨论
RAG垂直落地
DB-GPT与TeleChat-7B搭建相关RAG知识库
ChatWithRTX
ChatRTX安装教程
ChatWithRTX 踩坑记录
ChatWithRTX 使用其他量化模型
ChatWithRTX介绍
RAG 相关资料
英伟达—大模型结合 RAG 构建客服场景自动问答
又一大模型技术开源!有道自研RAG引擎QAnything正式开放下载
收藏!RAG入门参考资料开源大总结:RAG综述、介绍、比较、预处理、RAG Embedding等
RAG调研
解决现代RAG实际生产问题
解决现代 RAG 系统中的生产问题-II
Modular RAG and RAG Flow: Part Ⅰ
Modular RAG and RAG Flow: Part II
先进的Retriever技术来增强你的RAGs
高级RAG — 使用假设文档嵌入 (HyDE) 改进检索
提升 RAG:选择最佳嵌入和 Reranker 模型
LangGraph
增强型RAG:re-rank
LightRAG:使用 PyTorch 为 LLM 应用程序提供支持
模型训练
GPU相关资料
[教程] conda安装简明教程(基于miniconda和Windows)
PyTorch CUDA对应版本 | PyTorch
资料
李一舟课程全集
零碎资料
苹果各服共享ID
数据中心网络技术概览
华为大模型训练学习笔记
百度AIGC工程师认证考试答案(可换取工信部证书)
百度智能云生成式AI认证工程师 考试和证书查询指南
深入理解 Megatron-LM(1)基础知识
QAnything
接入QAnything的AI问答知识库,可私有化部署的企业级WIKI知识库
wsl --update失效Error code: Wsl/UpdatePackage/0x80240438的解决办法
Docker Desktop 启动docker engine一直转圈解决方法
win10开启了hyper-v,docker 启动还是报错 docker desktop windows hypervisor is not present
WSL虚拟磁盘过大,ext4迁移 Windows 中创建软链接和硬链接
WSL2切换默认的Linux子系统
Windows的WSL子系统,自动开启sshd服务
新版docker desktop设置wsl(使用windown的子系统)
WSL 开启ssh
Windows安装网易开源QAnything打造智能客服系统
芯片
国内互联网大厂自研芯片梳理
超算平台—算力供应商
Linux 磁盘扩容
Linux使用growpart工具进行磁盘热扩容(非LVM扩容方式)
关于centos7 扩容提示no tools available to resize disk with 'gpt' - o夜雨随风o - 博客园
(小插曲)neo4j配置apoc插件后检查版本发现:Unknown function ‘apoc.version‘ “EXPLAIN RETURN apoc.version()“
vfio-pci与igb_uio映射硬件资源到DPDK的流程分析
KubeVirt
vnc server配置、启动、重启与连接 - 王约翰 - 博客园
虚拟机Bug解决方案
kubevirt 如何通过CDI上传镜像文件
在 K8S 上也能跑 VM!KubeVirt 簡介與建立(部署篇) | Cloud Solutions
KubeVirt 04:容器化数据导入 – 小菜园
Python
安装 flash_attn
手把手教你在linux上安装pytorch与cuda
AI
在启智社区基于PyTorch运行国产算力卡的模型训练实验
Scaling law
免费的GPT3.5 API
AI Engineer Roadmap & Resources 🤖
模型排行
edk2
K8S删除Evicted状态的pod
docker 中启动 docker
远程本地多用户桌面1.17(一种不让电脑跟你抢键鼠的思路) - 哔哩哔哩
-
+
首页
Spark学习笔记
# 一、Spark概述 ## Spark 风雨十年 ### 1.1 十年发展 加州伯克利分校AMP实验室开发的通用大数据处理框架。 ![image-20220903121109356](http://kmgy.top:9090/image/2022/9/3/image-20220903121109356_repeat_1662178273065__392842.png) ### 1.2 Spark 风雨十年 Spark从2016年开始后开源问题提交量最多的项目。 ![image-20220903122723773](http://kmgy.top:9090/image/2022/9/3/image-20220903122723773_repeat_1662179243940__490036.png) ## Sparak和Hadoop区别 ### 1.1 技术栈区别 | | Hadoop | Spark | | ------------ | ----------------------------------------- | ---------------------------------------------------------- | | 类型 | 基础平台,包含计算,存储,调度 | 纯计算工具 | | 场景 | 海量数据批处理(磁盘迭代计算) | 海量数据批处理(内存迭代几段、交互式计算)、海量数据流计算 | | 价格 | 便宜 | 对内存有要求,价格高 | | 编程范式 | MR,API较为底层,算法适应性差 | RDD组成DAG有向无环图,API较为顶层,方便使用 | | 数据存储结构 | MapReduce中间计算结果在HDFS磁盘上,延迟大 | RDD中间运算结果在内存中,延迟小 | | 运行方式 | Task以进程方式维护,任务启动慢 | Task以线程方式维护,任务启动快,可批量创建提高并行能力。 | ## Spark 4大特点 ### 特点 - 速度快 - Spark比MR快100倍,硬盘快10倍 - 1.可以将结果放在内存中处理 - 2.提供了丰富的API算子,做到在一个Spark程序中完成 - 易于使用 - 通用性强 - Spark 提供了Spark SQL、Spark Streaming 、MLib及GraphX在内的多个工具库,我们可以在一个应用中无缝地使用这些工具库。 - ![image-20220903135147353](http://kmgy.top:9090/image/2022/9/3/image-20220903135147353_repeat_1662184307963__042022.png) - 运行方式 - Spark支持多种运行方式,包括在Hasoop和Mesos上,也支持Standalone的独立运行模式,同时也可以运行在K8S上。 - Sprak可以读取多种数据源 - ![image-20220903135518793](http://kmgy.top:9090/image/2022/9/3/image-20220903135518793_repeat_1662184518997__195987.png) ## Spark 框架模块 ### 模块组成 - Spark Core - Spark的核心,提供结构化数据处理模块。以RDD为数据抽象提供各种语言API,实现海量离线数据批处理计算。 - Spark SQL - 基于Core,支持以Core对数据进行处理,针对的是离线场景。Spark提供了StructuredStreaming,可以用SparkSQL为基础进行流式计算。 - Spark Streaming - 基于Core为基础,提供流式计算(诞生较早。有一定缺陷) - Spark GraphX - 图计算 - Spark MLib - 机器学习模块 ## Spark 运行模式 ### 运行模式 ![image-20220903140838277](http://kmgy.top:9090/image/2022/9/3/image-20220903140838277_repeat_1662185318459__465906.png) - 本地模式(Local 开发和测试) - 以一个独立的进程,通过内部的多个线程来模拟整个Spark运行时环境。 - Standalone(集群) - 各个角色独立进程形式的存在,并组成Spark集群环境。 - Hadoop Yarn模式 - 各个角色运行在Yarn容器内部,并组成Spark集群环境。 - K8S(容器集群) - 各个角色运行在K8S容器内部,并组成Spark集群环境 - 云服务模式(运行在云平台上) ## Spark 节点角色 ![image-20220903141439654](http://kmgy.top:9090/image/2022/9/3/image-20220903141439654_repeat_1662185679837__111626.png) ### 资源层面 - Master角色:集群资源管理 - Worker的角色:单机资源管理 ### Worker中任务运行层面 - Driver:单个任务的管理者 - Executor: 任务运行功能 ## 总结 Spark 解决了海量数据的计算,可以进行理想批处理以及实时流计算。 Spark 5大模块 Spark 4大特点 Spark 3大运行模式 Spark 4种运行角色 # 二、Spark部署 ## Spark Local模式 ![image-20220904095541173](http://kmgy.top:9090/image/2022/9/4/image-20220904095541173_repeat_1662256541301__117423.png) ### Local模式下角色分布: 资源管理: - Master:Local进程本身 - Worker:Local进程本身 任务执行: - Driver:Local进程本身 - Executor:不存在,没有独立的Executor角色,由Local进程内的线程提供计算能力 **注意:Driver也是一直特殊的Executor,只不过多数时候,我们将Executor当做纯Worker来对待。** ![image-20220904100015803](http://kmgy.top:9090/image/2022/9/4/image-20220904100015803_repeat_1662256815898__073951.png) ## Spark Standalone 模式 ![image-20220904100518841](http://kmgy.top:9090/image/2022/9/4/image-20220904100518841_repeat_1662257119031__197795.png) StandAlone是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多个机器集群,用于实际的大数据处理。 ### Standalone模式下角色分布: - 主节点 - Master角色,管理整个集群资源,并托管运行各个任务的Driver - 从节点Workers - 管理每个极其的资源,分配对应的资源来运行Executor - 每个从节点分配资源信息给Worker,资源信息包含内存Memory和CPU Cores核数 - 历史服务器HistorySever(可选) - 保存事件日志数据至HDFS,启动HistoryServer可以查看应用运行和相关信息 - ![image-20220904183429392](http://kmgy.top:9090/image/2022/9/4/image-20220904183429392_repeat_1662287670639__339802.png) ## 其他 ### 1. RDD: #### 1.2.1 RDD概念 ![Spark 理论基石 —— RDD](http://kmgy.top:9090/image/2022/9/3/v2-f20bd6bce4094ea7800dbcf1ed56504d_1440w.jpg_repeat_1662179793710__715449.jpeg) - RDD学名可伸缩的分布式数据集(Resilient Distributed Dataset)。是一种对数据集形态的抽象,基于此抽象,使用者可以在集群中执行一系列计算,而不用将中间结果落盘。 - 对于分布式系统,容错支持是必不可少的。为了支持容错,RDD 只支持粗粒度的变换。即,输入数据集是 immutable (或者说只读)的,每次运算会产生新的输出。不支持对一个数据集中细粒度的更新操作。这种约束,大大简化了容错支持,并且能满足很大一类的计算需求。 - RDD 是一个基于分区的、只读的数据记录集抽象。RDD 只可以通过对持久存储或其他 RDD 进行确定性运算得来,这种运算被称为**变换**。常用的**变换**算子包括:map,filter 和 join。 - RDD 没有选择不断的做检查点以进行容错,而是会记下 RDD 从最初的外存的数据集变化而来的变化路径,也就是其**谱系**(lineage)。理论上所有的 RDD 都可以在出错后从外存中依据谱系图进行重建。一般来说,重建的粒度是分区(Partition)而非整个数据集,一来代价更小,二来不同分区可能在不同机器上。 - **用户可以对 RDD 的两个方面进行控制:持久化和分区控制。**对于前者,如果某些 RDD 需要复用,那么用户可以指示系统按照某种策略将其进行持久化。后者来说,用户可以定制分区路由函数,将数据集合中的记录按照某个键值路由到不同分区。比如进行 Join 操作的时候,可以讲待 Join 数据集按照相同的策略进行分区,以并行 Join。 - **数据落盘** - 在很多的场景中,我们经常要确保数据已经安全的写到磁盘,以便在系统宕机或重启之后还能读到这些数据。但是我们知道,linux系统的IO路径很复杂,并且分为很多层,每一层可能都会有buffer来加速IO读写。因此,想要将数据安全的写到磁盘,并不是简单调一个write/fwrite就可以搞定的。 #### 1.2.2 举例 假设我们利用 Spark 接口相对存在于 HDFS 上的日志文件,找出错误条目,针对出现 hdfs 关键字的具体条目进行分析。 ```scala //基于某个 hdfs 上的文件定义一个 rdd(每一行作为集合中的一个条目) lines = spark.textFile("hdfs://...") //第二行通过 filter 变换生成新的 rdd errors = lines.filter(_.startsWith("ERROR")) //第三行请求 spark 将其结果进行暂存 errors.persist() // 以一个 collect 的动作结尾,求出包含 HDFS 关键字的所有行数的各个字段。 //(assuming time is field // number 3 in a tab-separated format): errors.filter(_.contains("HDFS")) .map(_.split(’\t’)(3)) .collect() ``` - 第一行基于某个 hdfs 上的文件定义一个 rdd(每一行作为集合中的一个条目)。 - 第二行通过 filter 变换生成新的 rdd - 第三行请求 spark 将其结果进行暂存 - 最后一行以一个 collect 的动作结尾,求出包含 HDFS 关键字的所有行数的各个字段。 其计算谱系图如下: ![img](http://kmgy.top:9090/image/2022/9/3/v2-7f65c0b745407804523f4df6bd14fb58_b.jpg_repeat_1662180709217__667273.jpeg) 有两点需要注意: 1. **直到遇到 collect 这个动作(Action)之前都没有发生实际的运算。** 2. **链式操作时不保存中间结果;** 由于第三行将结果在内存中进行了缓存,因此还可以基于此做其他动作。比如,计算包含 'MySQL' 关键字的错误条数: ```scala // Count errors mentioning MySQL: errors.filter(_.contains("MySQL")).count() ``` #### 1.2.3 **RDD 模型的优点** 1. 使用 lineage 来按需恢复数据,而不用定期 snapshot,减小了不必要开销。 2. 每个 Partition 出错后可以单独进行恢复,而不用进行全数据集的重建。 3. RDD 舍弃了对任意内存位置进行更新,只允许批量的写入数据,从而提高了容错效率 4. RDD 的不可变的特点允许系统叫较容易的对某些计算进行迁移,不用考虑一致性的问题。 5. 由于只支持批量计算,因此调度系统可以比较好的利用数据局部性的特点加快运算速度。 6. 由于只支持批量计算,因此调度系统可以比较好的利用数据局部性的特点加快运算速度。 #### 1.2.4 Spark编程接口 - Spark 通过暴露与编程语言集成的算子来提供操作 RDD 的接口。 **其中 RDD 表现为编程语言中的类,而 RDD 的算子为作用于这些类上的函数。**之前的系统如 DryadLINQ 和 FlumeJava 也使用了类似的形式。 - 用户使用 RDD 时,首先将数据从持久化存储中通过*变换*(**Transformations**,如 *map* 或者 *filter*)将其载入内存,然后可以对 RDD 施加任何系统支持的一系列变换,最后利用*动作*(**Action**)算子,将 RDD 重新持久化到外存中或者将控制权交还用户。 - 这个加载-变换-落盘的过程是**声明式**(Declarative,或者说是惰式[2])的,Spark 在拿到整个拓扑后会利用执行引擎进行执行优化(比如将并行化、流水线化,之后会进一步讨论)。 - 此外很重要的一个接口是 *persist*,可以由用户来告诉系统**哪些** RDD 需要持久化,**如何**持久化(本机硬盘还是跨机器存储),如果有多个 RDD 需要持久化,那么**优先级**如何确定。Spark 默认将 RDD 保存在内存中,如果内存不够用了会根据用户配置将数据溢出(spill)到硬盘上。 - **声明式** - 它可以看作是命令式的反面。曾有人言:一切非命令式,皆是声明式。从这个意义上说,越是偏离图灵机的图像越远的,就越是声明式的。 - 所以,**函数式编程(Functional Programming)是声明式的,因为它不使用可变状态,也不需要指定任何的执行顺序关系(**可以假定所有的函数都是同时执行的,因为存在引用透明性,所谓的参数和变量都只是一堆符号的别名而已)。逻**辑式编程(Logical Programming)也是声明式的,因为我们只需要通过facts和rules描述我们所需要解决的问题,具体的求解路径由编译器和程序运行时自动决定。** - Spark 利用 Scala 语言作为 RDD 抽象的接口,因为 Scala 兼顾了精确(其函数式语义适合交互式场景)与高效(使用静态类型)。 - 开发者利用 Spark 提供的库编写*驱动程序* (driver programe)以使用 Spark。**驱动程序会定义一到多个 RDD,并对其进行各种变换。Spark 提供的库会连接 Spark 集群,生成计算拓扑,并将拓扑分散到多个 workers 上去进行执行,同时记下变换的谱系(lineage)。**这些 workers 是分散在 Spark 集群内各个机器上的常驻进程,它们在内存里保存计算过程中生成的 RDD 的各个分区。 - ![img](http://kmgy.top:9090/image/2022/9/3/v2-280401515a5506cd19592550ca434e4e_b.jpg_repeat_1662182083407__703476.jpeg) #### 1.2.5 RDD的表示 RDD 抽象的核心组成主要有以下五个部分: 1. **分区集**(partition set)。分区是每个 RDD 的最小构成单元。 2. **依赖集**(dependencies set)。主要是 RDD 间的父子依赖关系。 3. **变换函数**(compute function)。作用于分区上的变换函数,可以由几个父分区计算得到一个子分区。 4. **分区模式**(partition scheme)。该 RDD 的分区是基于**哈希分片**的还是**直接切分**的。 5. **数据放置**(data placement)。知道分区的存放位置可以进行计算优化。 在 RDD 的接口设计中最有趣的一个点是如何对 RDD 间的**依赖关系**进行规约。最后发现可以将所有依赖归纳为两种类型: 1. **窄依赖**(narrow dependencies):父 RDD 的分区最多被一个子 RDD 的分区所依赖,比如 *map*。 2. **宽依赖**(wide dependencies):父 RDD 的分区可能被多个子 RDD 的分区所依赖,比如 *join*。 ![preview](http://kmgy.top:9090/image/2022/9/3/v2-8ebc0b892f5de7ededd99eb561520816_r.jpg_repeat_1662183341861__717513.jpeg) **调度优化**。对于窄依赖,可以对分区间进行并行**流水化**调度,先计完成某个窄依赖算子(比如说 map)的分区不用等待其他分区而直接进行下一个窄依赖算子(比如 filter )的运算。与之相对,宽依赖的要求父 RDD 的所有分区就绪,并进行跨节点的传送后,才能进行计算。类似于 MapReduce 中的 shuffle。 **数据恢复**。在某个分区出现错误或者丢失时,窄依赖的恢复更为高效。因为涉及到的父分区相对较少,并且可以并行恢复。而对于宽依赖,由于依赖复杂(如上图,子 RDD 的每个分区都会依赖父 RDD 的所有分区),一个分区的丢失可能就会引起全盘的重新计算。 **HDFS 文件**:*partitions* 函数返回 HDFS 文件的所有 block,每个 block 被当做一个 partition。 *preferredLocations* 返回每个 block 所在的位置,*Iterator* 会对每个 block 进行读取。 **map**:在任意 RDD 上调用 map 会返回一个 MappedRDD 对象,该对象的 *partitions* 函数和 *preferredLocations* 与父 RDD 保持一致。对于 *iterator*,只需要将传给 map 算子的函数以此作用到其父 RDD 的各个分区即可。 **union**: 在两个 RDD 上调用 union 会返回一个新的 RDD,该 RDD 的每个分区由对应的两个父 RDD 通过窄依赖计算而来。 **sample**:抽样函数和 map 大体一致。但该函数会给每个分区保存一个随机数种子来决定父 RDD 的每个记录是否保留。 **join**:在两个 RDD 上调用 join 操作可能会导致两个窄依赖(比如其分区都是按待 join 的key 哈希的),两个宽依赖,或者混合依赖。每种情况下,子 RDD 都会有一个 *partitioner* 函数,或继承自父分区,或是默认的hash 分区函数。 ##
yg9538
2022年9月4日 23:01
531
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码