一,题记
要说当下 IT 行业什么最火?ABC 无出其右。所谓 ABC 者,AI + Big Data + Cloud 也,即人工智能、大数据和云计算 (云平台)。每个领域目前都有行业领袖在引领前行,今天我们来讨论下大数据 Big Data 这个方向。
二,大数据里面的角色
角色一:大数据工程
大数据工程需要解决数据的定义、收集、计算与保存的工作,因此大数据工程师们在设计和部署这样的系统时首要考虑的是数据高可用的问题,即大数据工程系统需要实时地为下游业务系统或分析系统提供数据服务;
角色二:大数据分析
大数据分析角色定位于如何利用数据——即从大数据工程系统中接收到数据之后如何为企业或组织提供有产出的数据分析,并且确实能够帮助到公司进行业务改善或提升服务水平,所以对于大数据分析师来说,他们首要解决的问题是发现并利用数据的价值,具体可能包括:趋势分析、模型建立以及预测分析等。
这两类角色相互依存但又独立运作,何意?没有大数据工程,大数据分析便无从谈起;但倘若没有大数据分析,我也实在想不出大数据工程存在的理由。这就类似于结婚和谈恋爱——恋爱的目的是为了结婚,且不以结婚为目的的谈恋爱都是耍流氓。
简单总结一下,大数据工程角色需要考虑数据的收集、计算 (或是处理) 和保存;大数据分析角色则是执行数据的高级计算。
三,大数据工程师
针对角色一:大数据工程说,对应的工作岗位就叫大数据工程师,对于大数据工程师而言,您至少要掌握以下技能:
linux 基础
因为大数据体系,基本都是开源软件,这些开源软件都是在开源的 linux 系统上运行的,所以你必须会基本的 linux 操作,比如用户管理,权限,shell 编程之类的
一门 JVM 系语言:
当前大数据生态 JVM 系语言类的比重极大,某种程度上说是垄断也不为过。这里我推荐大家学习 Java 或 Scala,至于 Clojure 这样的语言上手不易,其实并不推荐大家使用。另外,如今是“母以子贵”的年代,某个大数据框架会带火它的编程语言的流行,比如 Docker 之于 Go、Kafka 之于 Scala。
因此笔者这里建议您至少要精通一门 JVM 系的语言。值得一提的,一定要弄懂这门语言的多线程模型和内存模型,很多大数据框架的处理模式其实在语言层面和多线程处理模型是类似的,只是大数据框架把它们引申到了多机分布式这个层面。
笔者建议:学习 Java 或 Scala
计算处理框架:
严格来说,这分为离线批处理和流式处理。流式处理是未来的趋势,建议大家一定要去学习;而离线批处理其实已经快过时了,它的分批处理思想无法处理无穷数据集,因此其适用范围日益缩小。事实上,Google 已经在公司内部正式废弃了以 MapReduce 为代表的离线处理。
因此如果要学习大数据工程,掌握一门实时流式处理框架是必须的。当下主流的框架包括:Apache Samza, Apache Storm, Apache Spark Streaming 以及最近一年风头正劲的 Apache Flink。当然 Apache Kafka 也推出了它自己的流式处理框架:Kafka Streams
笔者建议:学习 Flink、Spark Streaming 或 Kafka Streams 中的一个
熟读 Google 大神的这篇文章:《The world beyond batch: Streaming 101》
分布式存储框架:
虽说 MapReduce 有些过时了,但 Hadoop 的另一个基石 HDFS 依然坚挺,并且是开源社区最受欢迎的分布式存储,绝对您花时间去学习。如果想深入研究的话,Google 的 GFS 论文也是一定要读的当然开源世界中还有很多的分布式存储,国内阿里巴巴的 OceanBase 也是很优秀的一个。
笔者建议:学习 HDFS
资源调度框架:
Docker 可是整整火了最近一两年。各个公司都在发力基于 Docker 的容器解决方案,最有名的开源容器调度框架就是 K8S 了,但同样著名的还有 Hadoop 的 YARN 和 Apache Mesos。后两者不仅可以调度容器集群,还可以调度非容器集群,非常值得我们学习。
笔者建议:学习 YARN
分布式协调框架:
有一些通用的功能在所有主流大数据分布式框架中都需要实现,比如服务发现、领导者选举、分布式锁、KV 存储等。这些功能也就催生了分布式协调框架的发展。最古老也是最有名的当属 Apache Zookeeper 了,新一些的包括 Consul,etcd 等。学习大数据工程,分布式协调框架是不能不了解的, 某种程度上还要深入了解。
笔者建议:学习 Zookeeper——太多大数据框架都需要它了,比如 Kafka, Storm, HBase 等
KV 数据库:
典型的就是 memcache 和 Redis 了,特别是 Redis 简直是发展神速。其简洁的 API 设计和高性能的 TPS 日益得到广大用户的青睐。即使是不学习大数据,学学 Redis 都是大有裨益的。
笔者建议:学习 Redis,如果 C 语言功底好的,最好熟读源码,反正源码也不多
列式存储数据库:
笔者曾经花了很长的时间学习 Oracle,但不得不承认当下关系型数据库已经慢慢地淡出了人们的视野,有太多的方案可以替代 rdbms 了。人们针对行式存储不适用于大数据 ad-hoc 查询这种弊端开发出了列式存储,典型的列式存储数据库就是开源社区的 HBASE。实际上列式存储的概念也是出自 Google 的一篇论文:Google BigTable,有兴趣的话大家最好读一下
笔者建议:学习 HBASE,这是目前应用最广泛的开源列式存储
消息队列:
大数据工程处理中消息队列作为“削峰填谷”的主力系统是必不可少的,当前该领域内的解决方案有很多,包括 ActiveMQ,Kafka 等。国内阿里也开源了 RocketMQ。这其中的翘楚当属 Apache Kafka 了。Kafka 的很多设计思想都特别契合分布流式数据处理的设计理念。这也难怪,Kafka 的原作者 Jay Kreps 可是当今实时流式处理方面的顶级大神。
笔者建议:学习 Kafka,不仅仅好找工作 (几乎所有大数据招聘简历都要求会 Kafka:-)),还能触类旁通进一步理解基于备份日志方式的数据处理范型
四,大数据分析师 Or 数据科学家
针对角色二:大数据分析,对应的工作岗位就叫大数据分析师或者数据科学家,作为数据科学家的我们必须要掌握以下技能:
数学功底:
微积分是严格要掌握的。不一定要掌握多元微积分,但一元微积分是必须要熟练掌握并使用的。另外线性代数一定要精通,特别是矩阵的运算、向量空间、秩等概念。当前机器学习框架中很多计算都需要用到矩阵的乘法、转置或是求逆。虽然很多框架都直接提供了这样的工具,但我们至少要了解内部的原型原理,比如如何高效判断一个矩阵是否存在逆矩阵并如何计算等。
重温同济版《高等数学》,有条件可以去 Coursea 学习宾夕法尼亚大学的微积分课程
推荐学习 Strang 的线性代数:《Introduction to Linear Algebra》——这是最经典的教材,没有之一!
数理统计:
概率论和各种统计学方法要做到基本掌握,比如贝叶斯概率如何计算?概率分布是怎么回事?虽不要求精通,但对相关背景和术语一定要了解
找一本《概率论》重新学习下
交互式数据分析框架:
这里并不是指 SQL 或数据库查询,而是像 Apache Hive 或 Apache Kylin 这样的分析交互框架。开源社区中有很多这样类似的框架,可以使用传统的数据分析方式对大数据进行数据分析或数据挖掘。
笔者有过使用经验的是 Hive 和 Kylin。不过 Hive 特别是 Hive1 是基于 MapReduce 的,性能并非特别出色,而 Kylin 采用数据立方体的概念结合星型模型,可以做到很低延时的分析速度,况且 Kylin 是第一个研发团队主力是中国人的 Apache 孵化项目,因此日益受到广泛的关注。
首先学习 Hive,有时间的话了解一下 Kylin 以及背后的数据挖掘思想。
机器学习框架:
机器学习当前真是火爆宇宙了,人人都提机器学习和 AI,但笔者一直认为机器学习恰似几年前的云计算一样,目前虽然火爆,但没有实际的落地项目,可能还需要几年的时间才能逐渐成熟。
不过在现在就开始储备机器学习的知识总是没有坏处的。说到机器学习的框架,大家耳熟能详的有很多种, 信手拈来的就包括 TensorFlow、Caffe8、Keras9、CNTK10、Torch711 等,其中又以 TensorFlow 领衔。
笔者当前建议大家选取其中的一个框架进行学习,但以我对这些框架的了解,这些框架大多很方便地封装了各种机器学习算法提供给用户使用,但对于底层算法的了解其实并没有太多可学习之处。因此笔者还是建议可以从机器学习算法的原理来进行学习,比如:
目前机器学习领域最 NB 的入门课程:吴恩达博士的 Machine Learning
五,大数据必备技能详细
因为笔者本身是偏 Java 应用方向的,所以整理的大数据必备技能详细,也是偏向于大数据工程师方向。总共分为五大部分,分别是:
大数据技术基础
离线计算 Hadoop
流式计算 Storm
内存计算 Spark
机器学习算法
大数据技术基础
linux 操作基础
linux 系统简介与安装
linux 常用命令–文件操作
linux 常用命令–用户管理与权限
linux 常用命令–系统管理
linux 常用命令–免密登陆配置与网络管理
linux 上常用软件安装
linux 本地 yum 源配置及 yum 软件安装
linux 防火墙配置
linux 高级文本处理命令 cut、sed、awk
linux 定时任务 crontab
shell 编程
shell 编程–基本语法
shell 编程–流程控制
shell 编程–函数
shell 编程–综合案例–自动化部署脚本
内存数据库 redis
redis 和 nosql 简介
redis 客户端连接
redis 的 string 类型数据结构操作及应用 - 对象缓存
redis 的 list 类型数据结构操作及应用案例 - 任务调度队列
redis 的 hash 及 set 数据结构操作及应用案例 - 购物车
redis 的 sortedset 数据结构操作及应用案例 - 排行榜
布式协调服务 zookeeper
zookeeper 简介及应用场景
zookeeper 集群安装部署
zookeeper 的数据节点与命令行操作
zookeeper 的 java 客户端基本操作及事件监听
zookeeper 核心机制及数据节点
zookeeper 应用案例–分布式共享资源锁
zookeeper 应用案例–服务器上下线动态感知
zookeeper 的数据一致性原理及 leader 选举机制
java 高级特性增强
Java 多线程基本知识
Java 同步关键词详解
java 并发包线程池及在开源软件中的应用
Java 并发包消息队里及在开源软件中的应用
Java JMS 技术
Java 动态代理反射
轻量级 RPC 框架开发
RPC 原理学习
Nio 原理学习
Netty 常用 API 学习
轻量级 RPC 框架需求分析及原理分析
轻量级 RPC 框架开发
离线计算 Hadoop
hadoop 快速入门
hadoop 背景介绍
分布式系统概述
离线数据分析流程介绍
集群搭建
集群使用初步
HDFS 增强
HDFS 的概念和特性
HDFS 的 shell(命令行客户端) 操作
HDFS 的工作机制
NAMENODE 的工作机制
java 的 api 操作
案例 1:开发 shell 采集脚本
MAPREDUCE 详解
自定义 hadoop 的 RPC 框架
Mapreduce 编程规范及示例编写
Mapreduce 程序运行模式及 debug 方法
mapreduce 程序运行模式的内在机理
mapreduce 运算框架的主体工作流程
自定义对象的序列化方法
MapReduce 编程案例
MAPREDUCE 增强
Mapreduce 排序
自定义 partitioner
Mapreduce 的 combiner
mapreduce 工作机制详解
MAPREDUCE 实战
maptask 并行度机制 - 文件切片
maptask 并行度设置
倒排索引
共同好友
federation 介绍和 hive 使用
Hadoop 的 HA 机制
HA 集群的安装部署
集群运维测试之 Datanode 动态上下线
集群运维测试之 Namenode 状态切换管理
集群运维测试之数据块的 balance
HA 下 HDFS-API 变化
hive 简介
hive 架构
hive 安装部署
hvie 初使用
hive 增强和 flume 介绍
HQL-DDL 基本语法
HQL-DML 基本语法
HIVE 的 join
HIVE 参数配置
HIVE 自定义函数和 Transform
HIVE 执行 HQL 的实例分析
HIVE 最佳实践注意点
HIVE 优化策略
HIVE 实战案例
Flume 介绍
Flume 的安装部署
案例:采集目录到 HDFS
案例:采集文件到 HDFS
流式计算 Storm
Storm 从入门到精通
Storm 是什么
Storm 架构分析
Storm 架构分析
Storm 编程模型、Tuple 源码、并发度分析
Storm WordCount 案例及常用 Api 分析
Storm 集群部署实战
Storm+Kafka+Redis 业务指标计算
Storm 源码下载编译
Strom 集群启动及源码分析
Storm 任务提交及源码分析
Storm 数据发送流程分析
Storm 通信机制分析
Storm 消息容错机制及源码分析
Storm 多 stream 项目分析
编写自己的流式任务执行框架
Storm 上下游及架构集成
消息队列是什么
Kakfa 核心组件
Kafka 集群部署实战及常用命令
Kafka 配置文件梳理
Kakfa JavaApi 学习
Kafka 文件存储机制分析
Redis 基础及单机环境部署
Redis 数据结构及典型案例
Flume 快速入门
Flume+Kafka+Storm+Redis 整合
内存计算 Spark
scala 编程
scala 编程介绍
scala 相关软件安装
scala 基础语法
scala 方法和函数
scala 函数式编程特点
scala 数组和集合
scala 编程练习(单机版 WordCount)
scala 面向对象
scala 模式匹配
actor 编程介绍
option 和偏函数
实战:actor 的并发 WordCount
柯里化
隐式转换
AKKA 与 RPC
Akka 并发编程框架
实战:RPC 编程实战
Spark 快速入门
spark 介绍
spark 环境搭建
RDD 简介
RDD 的转换和动作
实战:RDD 综合练习
RDD 高级算子
自定义 Partitioner
实战:网站访问次数
广播变量
实战:根据 IP 计算归属地
自定义排序
利用 JDBC RDD 实现数据导入导出
WorldCount 执行流程详解
RDD 详解
RDD 依赖关系
RDD 缓存机制
RDD 的 Checkpoint 检查点机制
Spark 任务执行过程分析
RDD 的 Stage 划分
Spark-Sql 应用
Spark-SQL
Spark 结合 Hive
DataFrame
实战:Spark-SQL 和 DataFrame 案例
SparkStreaming 应用实战
Spark-Streaming 简介
Spark-Streaming 编程
实战:StageFulWordCount
Flume 结合 Spark Streaming
Kafka 结合 Spark Streaming
窗口函数
ELK 技术栈介绍
ElasticSearch 安装和使用
Storm 架构分析
Storm 编程模型、Tuple 源码、并发度分析
Storm WordCount 案例及常用 Api 分析
Spark 核心源码解析
Spark 源码编译
Spark 远程 debug
Spark 任务提交行流程源码分析
Spark 通信流程源码分析
SparkContext 创建过程源码分析
DriverActor 和 ClientActor 通信过程源码分析
Worker 启动 Executor 过程源码分析
Executor 向 DriverActor 注册过程源码分析
Executor 向 Driver 注册过程源码分析
DAGScheduler 和 TaskScheduler 源码分析
Shuffle 过程源码分析
Task 执行过程源码分析
机器学习算法
python 及 numpy 库
机器学习简介
机器学习与 python
python 语言–快速入门
python 语言–数据类型详解
python 语言–流程控制语句
python 语言–函数使用
python 语言–模块和包
phthon 语言–面向对象
python 机器学习算法库–numpy
机器学习必备数学知识–概率论
常用算法实现
knn 分类算法–算法原理
knn 分类算法–代码实现
knn 分类算法–手写字识别案例
lineage 回归分类算法–算法原理
lineage 回归分类算法–算法实现及 demo
朴素贝叶斯分类算法–算法原理
朴素贝叶斯分类算法–算法实现
朴素贝叶斯分类算法–垃圾邮件识别应用案例
kmeans 聚类算法–算法原理
kmeans 聚类算法–算法实现
kmeans 聚类算法–地理位置聚类应用
决策树分类算法–算法原理
决策树分类算法–算法实现
来源:架构师小秘圈
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。