自我技术介绍

  • 刘辉/Peter
  • 写过几年的 C/C++
  • 后来写了好几年的 Ruby
  • 现在开写 R/Python/Ruby
  • 喜欢折腾(开源)技术,解决问题
  • liuhui998.com

最近的工作主要是处量数据相关的工作

我会以一个虚拟人物角度来分享一些我的经验

小明的数据分析之旅

小明到了一个创业(快速发展)公司
工作是搭建公司的数据分析平台

如何快速分析10亿条销售数据

  • 每天产生超百万条记录
  • 数据分析师要标准 SQL 接口灵活查询
  • 前端业务人员需要秒级响应
  • 人员投入有限
程序员出身的他如何应对呢?

鸭梨山大

如何进行数据仓库的选择

  • 社区成熟,无深坑
  • 最好能弹性计费, 快速试错
  • MPP(SQL兼容好)
  • 云平台技术节约运维成本

云端数据分析利器

把数据从S3加载到Redshift有多快

使用 dc2.largeX4 单结点可以跑到 40MB/s 以上
100GB的数据大约40分钟可以加载完

只要 1美刀/小时

查询速度

由于时间关系,我们用的是第三方数据
但是我保证实际速度比这更快

transactions 交易表

  • 10亿条记录
  • 5千万唯一用户(user_id)
  • 1万个唯一商品(product)
  • 交易流水跨越一年(created_at)
  • 同时还有很多属性字段
我们各开了一台同价位 Postgres, Redshift

### 业务示例SQL ``` -- 每天收入 -- Daily Revenue select date(created_at), sum(amount) from transactions group by 1 ``` ``` -- 每天活跃用户数 -- Daily Active Users select date(created_at), count(distinct user_id) from transactions group by 1 ``` ``` -- 每天平均活跃用户收入 -- Daily ARPU select date(created_at), sum(amount) / count(distinct user_id) from transactions group by 1 ```

查询速度对比

最大 1000倍 差距

Amazon Redshift 技术简单分析

他为什么这么快?
为什么?
为什么?
为什么?

技术架构

Redshift所有的都并行

  • 查询(所以计算结点并行查询)
  • 加载(所有计算结点可以并行加载)
  • Backup/Restore
  • Resize

列式存储

其它IO优化

  • Direct-attched Storage
  • Large data block sizes
  • Data Compression
  • Zone maps

费用问题

所有不谈成本的性能都是没有意义的

  • 按使用量进行计费, 弹性伸缩
  • 和S3配合使用,冷数据卸出
  • 节约运维成本

Redshift缺点

  • 由于设计问题,并发较低
  • 没有对应的开源版,没有办法私有云部署

Postgres生态

  • Redshift (fork)
  • Greenplum (fork)
  • Citus (插件)

小明的下一个问题 ETL

ETL的思考

  • 大量数据需要清洗
  • 导出、转换、加载 任务之间存在很多的依赖
  • 本质上是一个个有向无环图
  • 任务要能定时执行
  • 出现错误后要重试

AirFlow

为什么选择Airflow

  • Python base
  • Airbnb出品
  • 社区活跃

有向无环图 DAG

用 DAGs 来管理复杂任务

用 DAGs 来管理复杂任务

用 Python 代码生成DAG

AirFlow总结

  • DAG structure as code
  • 丰富的命令行接口
  • 有Web界面了解整个过程
  • 基于Celery的后台任务workers
  • 计划执行模块(scheduler)

如何快速的导大量数据

  • 数据要导全量 1TB?
  • csvkit ?
  • python脚本 ?
Sqoop Under AWS EMR

Sqoop 特点

  • 利用MapReduce多节点并发导数
  • Using JDBC 支持多种数据库
Sqoop Under AWS EMR
  • 启动方便,低运维
  • 数据可直接导到S3, 成本低
  • 使用 Spot Instance 节约费用

Sqoop 的一些坑

  • Oracle 相关
  • 分隔符的选择
  • MySQL tinyInt 的处理

我们猜一下这个错误是什么

ERROR manager.SqlManager: Error reading database metadata: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1 ORA-01882: timezone region not found
JDBC Oracle 驱动
我们习惯认为最新的驱动是向下兼容的,其实不是 Oracle 11g R2: ojdbc6.jar – Supports JDK 6, 7, and 8 Oracle 12c R1: ojdbc7.jar – Supports JDK 7 and 8

分隔符的选择 ^A

  • , \t 冲突概率比较大
  • ^A 是不可直接输入ASCII字符

delims_char=$( printf "\x01" );

sqoop import --fields-terminated-by ${delims_char} --hive-delims-replacement ' ' --target-dir s3://$bucket/$table --connect $connect_str --table $table --username $user --password $password -z

MySQL tinyInt 的处理

  • JDBC会把1个字节的tinyInt导出成 Boolean
  • jdbc:mysql://db_uri/db?tinyInt1isBit=false

学习资源分享

  • udemy.com
  • aws 最新文档
  • slideshare.net

udemy.com

  • 资料全
  • 价格便宜
  • 短视频,手把手

我买的部分udemy.com的课程

BigData建议先入坑AWS

  • 技术生态成熟
  • 了解最佳实践
  • 降低初学门槛
  • 其它厂家以它为模板
  • 善用免费套餐
  • udemy有很多课程

Q&A

PPT