文章目录
- 一. 可扩展计算
- 数据集规模
- 调度,扩展,并发和恢复
- 二. Dask
- Dask 组件和层次
- Dask 入门
- 三. Dask DataFrame
- Dask 和 Pandas
- 数据:读取
- 数据:清理转换
- 数据:聚合分析
- 数据:可视化
- 四. Dask 部署
一. 可扩展计算
数据集规模
- 小规模数据集,可以装入内存,可以装入本地磁盘
- Pandas,NumPy,scikit-learn
- 中规模数据集,不可以装入内存,可以装入本地磁盘
- Dask 本地任务调度器
- 大规模数据集,不可以装入内存,不可以装入本地磁盘
- Dask 分布式任务调度器
- 集群资源管理器:
- Hadoop Yarn
- Mesos
- Kubernetes
调度,扩展,并发和恢复
- 任务调度器:有向无环图 DAG
- 扩展:
- 横向扩展:雇佣更多工人,需要在不同工人之间编排复杂任务
- 纵向扩展:升级设备,技术升级总会达到极限
- 并发和资源管理:任务调度器来决定如何处理资源的争用和锁定,避免资源的争用影响性能
- 失败中恢复:只运行失败的任务,已经完成的任务不需要重新运行
二. Dask
Dask 组件和层次
- 顶层 API:
- Dask Array:NumPy
- Dask Bag:Python List,非结构化数据
- Dask DataFrame:Pandas
- Dask ML:scikit-learn
- 序列化模型:pickle,dill
- 底层 API:
- Dask delayed:lazy parallel objects
- Dask Future:Eager parallel objects
- Dask 子系统:调度器
Dask 入门
- 数据类型:
- 自动从数据推断数据类型,随机抽样
- 最好显式指定数据类型;或者使用显式指定数据类型的二进制文件格式存储数据(parquet)
- 跟踪正在运行的任务:from dask.diagnostics import ProgressBar
- compute:运行计算任务 DAG 并输出结果
- persist:将中间结果保存在内存中,不需要重新计算,persist 之前的计算任务会在 DAG 中删除
- DAG 可视化:dd.visualiuze
- 任务调度:
- 跟踪中间结果的存储位置,将计算任务放在数据节点上运行,避免在网络上传输中间结果,提高运行效率
- 数据本地话,避免将数据在 worker 之间移动,使用分布式文件系统(S3,HDFS)
三. Dask DataFrame
Dask 和 Pandas
- 索引和轴:
- 索引:每行的标识符
- 轴:0轴沿着行,1轴沿着列
- Pandas 经过高度优化,可以高效处理内存中的数据
- Dask 分区:
- npartitions
- divisions:分区的边界
- map_partitions:方法应用到每个分区
- 混洗 shuffle:将所有分区广播给所有 worker,发生于排序,分组和索引操作时,预先对数据进行排序,尽可能减少混洗操作
- Dask 的局限性:没有扩展 Pandas 的所有操作
- 不支持更改 DataFrame 结构:stack,unstack,melt
- 关系操作涉及混洗成为性能瓶颈:join,merge,groupby,rolling
- 创建索引需要排序混洗
- reset_index:不以分区感知的方式建立索引
数据:读取
- 数据类型:
- 显式指定,禁用类型推断
- 首先全部假定为 np.str 类型,读取后再 head 分析具体类型
- np.nan 为 float32 类型,uint 无法存储
- dask 只显示数字数据类型,非数字数字类型显示为 object
- csv:带分隔符的文本文件
- sql:关系型数据库
- HDFS:可以在数据节点上运行计算
- S3:仅作为数据存储服务
- Parquet:
- 读写:fasetparquet,pyarrow
- 压缩:gzip,lzo,snappy
数据:清理转换
- 列操作:
- 选择列,删除列,重命名
- 创建新列:apply,assign
- 行操作:
- 选择行,loc,可以切片
- 缺失值:
- 》50%:删除列
- 5%~50%:缺失值填充
- 《5%:删除行
- 数据重编码:
- where:替换 False 行
- mask:替换 True 行
- 索引,排序,连接
- 索引已排序:search,filter
- 两表的索引已对齐:join
- 列轴连接:join
- 行轴连接:append
数据:聚合分析
相关性不意味着因果关系。
- 统计信息:
- mean,std,min,max
- 偏度:
- 正偏度:大于中位数,减缓
- 负偏度:大于中位数,陡峭
- dask_stats.skew
- 中位数:quantile(0.5)
- describe
- 相关性:corr
- 聚合分组:
- groupby
- agg
- 自定义聚合对象:dd.Aggregation:
- 应用于每个分区的函数
- 聚合每个分区结果的函数
- 滑动窗口:
- 窗口大小不能跨越分区
- 默认前n个窗口,可以设置center=True
数据:可视化
- 安斯科姆四重奏:四个数据集具有相同的统计变量,但是具有不同的数据分布
- Seaborn 可视化:基于 Matplotlib 的封装
- 可视化的价值在于能够快速直观地从数据中识别和洞察的能力,当可视化大量数据时,则难以观察
- Datashader 可视化:
- 仅限位置数据
- 不需要降低采样
- 直接接受 Dask 对象
- 可以交互式可视化:holoviews,geoviews,bokeh
四. Dask 部署
Dask 集群在 AWS 中的架构:
- Scheduler 调度器:从 Notebook 接受作业,协调工作节点
- Worker 工作节点:接受任务并计算
- Jupyter Notebook 服务器:提供前端允许用户运行代码
- 客户端:向用户展示结果
配置 AWS 集群:
- 生成安全密钥 Access Key
- 创建 ECS 集群
- 配置集群网络,安全组
- 配置文件系统 EFS
- 配置 Docker 镜像 ECR
- 创建调度器,工作节点,Notebook 服务器镜像
- 连接到集群
- scheduler hostname:8787
- notebook hostname:8888
- 显式传递调度器 URI,或者配置 DASK_SCHEDULER_ADDRESS 环境变量