文章目录

  • 一. 可扩展计算
  • 数据集规模
  • 调度,扩展,并发和恢复
  • 二. 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 中的架构:

  1. Scheduler 调度器:从 Notebook 接受作业,协调工作节点
  2. Worker 工作节点:接受任务并计算
  3. Jupyter Notebook 服务器:提供前端允许用户运行代码
  4. 客户端:向用户展示结果

配置 AWS 集群:

  1. 生成安全密钥 Access Key
  2. 创建 ECS 集群
  3. 配置集群网络,安全组
  4. 配置文件系统 EFS
  5. 配置 Docker 镜像 ECR
  6. 创建调度器,工作节点,Notebook 服务器镜像
  7. 连接到集群
  1. scheduler hostname:8787
  2. notebook hostname:8888
  3. 显式传递调度器 URI,或者配置 DASK_SCHEDULER_ADDRESS 环境变量