极客时间:《从0开始学大数据》

文章目录
  1. 1. 阅读感想
  2. 2. 前言&背景
    1. 2.1. 大数据应用发展史
    2. 2.2. 大数据应用领域
  3. 3. Hadoop大数据原理与架构
    1. 3.1. HDFS
      1. 3.1.1. HDFS 的高可用设计
    2. 3.2. MapReduce
      1. 3.2.1. 编程模型
      2. 3.2.2. 计算框架
      3. 3.2.3. 一些细节
    3. 3.3. Yarn
      1. 3.3.1. 为什么 HDFS 是系统,而 MapReduce 和 Yarn 则是框架?
    4. 3.4. 感想
      1. 3.4.1. 学习新知识的一种途径
  4. 4. 大数据生态体系主要产品原理与架构
    1. 4.1. Hive是如何让MapReduce实现SQL操作的?
    2. 4.2. 我们并没有觉得MapReduce速度慢,直到Spark出现
    3. 4.3. 同样的本质,为何Spark可以更高效?
    4. 4.4. BigTable的开源实现:HBase
      1. 4.4.1. Hbase 总结
    5. 4.5. 感想
  5. 5. 大数据开发实践
    1. 5.1. 如何自己开发一个大数据SQL引擎?
    2. 5.2. Spark的性能优化案例分析
      1. 5.2.1. 软件性能优化
      2. 5.2.2. 大数据软件性能优化
      3. 5.2.3. Spark 调优案例
    3. 5.3. 从阿里内部产品看海量数据处理系统的设计
    4. 5.4. 大数据基准测试可以带来什么好处?
    5. 5.5. 我能从大厂的大数据开发实践中学到什么?
  6. 6. 大数据平台与系统集成
    1. 6.1. 大数据从哪里来?
  7. 7. 大数据分析与运营
    1. 7.1. 互联网运营数据指标与可视化监控
      1. 7.1.1. 互联网运营常用数据指标
    2. 7.2. 如何利用大数据成为“增长黑客”?
      1. 7.2.1. 利用大数据增长用户数量
    3. 7.3. 为什么说数据驱动运营?
  8. 8. 大数据算法
    1. 8.1. 如何对数据进行分类和预测
    2. 8.2. 如何发掘数据之间的关系?
    3. 8.3. 如何预测用户的喜好?
      1. 8.3.1. 基于人口统计的推荐
      2. 8.3.2. 基于商品属性的推荐
      3. 8.3.3. 基于用户的协同过滤推荐
      4. 8.3.4. 基于商品的协同过滤推荐
    4. 8.4. 机器学习的数学原理是什么?
    5. 8.5. 软件工程师如何进入人工智能领域?
  9. 9. 寄语&结束语

阅读感想

知乎上有个同学咨询我极客时间上的一个专栏:《从0开始学大数据》是否值得一读,本着负责任的态度,早上花了两小时过了一遍。整体感受如下:

  1. 专栏内容非常基础,适合0基础的工程师看;
  2. 对大数据开发有一定经验的读者不建议细看;
  3. 文章里会穿插有一些感悟,可以细细品味。

李智慧老师在文中写了一些自己在研发效率、工程管理、个人成长上的经验,这部分内容,我觉的很不错,写的很用心,字里行间里还是能看到诚意的。虽然这些话从部分订阅者看来,是一些「鸡汤」,但对于我这种有几年开发经验的工程师,是非常有感触的。

譬如:

关于学习:

这些年,我自己认识了很多优秀的人,他们各有所长、各有特点,但是无一例外都有个共同的特征,就是对事物的洞察力。他们能够穿透事物的层层迷雾,直指问题的核心和要害,不会犹豫和迷茫,轻松出手就搞定了其他人看起来无比艰难的事情……这种洞察力就是来源于他们对事物的抽象能力……

关于软件开发、成长与熵的关系:

人作为一个系统,从青壮到垂老,熵也在不停增加。要想减缓熵增的速度,必须从外部吸收能量。物质上,合理饮食,锻炼身体;精神上,不断学习,参与有价值的工作。那些热爱生活、好好学习、积极工作的人是不是看起来更年轻,而整日浑浑噩噩的人则老的更快。

关于人生价值的辩证看待:

想通了这一点后,我就不再纠结自己是不是足够的优秀,能够成就什么样的事业。我只要每天都有一点点进步,明白一点点道理,生活就是值得的……

关于数据的价值的定位:

数据比代码的地位要高得多,用途也大得多,做大数据的同学要意识到数据的重要性。

是不是比架构有意思多啦?

其实学习大数据,看看源码和架构,然后上手开发个系统是最快的。

前言&背景

大数据应用发展史

搜索引擎 > 数据仓库 > 数据挖掘 > 机器学习

顶尖的公司和顶尖的高手一样,做事有一种优雅的美感。你可以看 Google 一路走来,从搜索引擎、Gmail、地图、Android、无人驾驶,每一步都将人类的技术边界推向更高的高度。而差一点的公司即使也曾经获得过显赫的地位,但是一旦失去做事的美感和节奏感,在这个快速变革的时代,陨落得比流星还快。

大数据从搜索引擎到机器学习,发展思路其实是一脉相承的,就是想发现数据中的规律并为我们所用。所以很多人把数据称作金矿,大数据应用就是从这座蕴含知识宝藏的金矿中发掘中有商业价值的真金白银出来。

大数据应用领域

大数据在医疗健康领域的应用

  1. 医学影像智能识别:使用大量的图片数据进行深度机器学习训练,机器可以识别出特定的图像元素,比如猫或者人脸,当然也可以识别出病理特征。
  2. 病历大数据智能诊疗:针对同类疾病和其他上下文信息(化验结果、病史、年龄性别、病人回访信息等)可以挖掘出针对同样的疾病情况,哪种治疗手段可以用更低的治疗成本、更少的病人痛苦,获得更好的治疗效果。

大数据在教育领域的应用

  1. AI 外语老师
  2. 智能解题

大数据在社交媒体领域的应用

  1. 舆情监控与分析

大数据在金融领域的应用

  1. 大数据风控
  2. 量化交易

大数据在新零售领域的应用

大数据在交通领域的应用

Hadoop大数据原理与架构

如果一个文件的大小超过了一张磁盘的大小,你该如何存储?

:单机时代,主要的解决方案是 RAID(独立磁盘冗余阵列);分布式时代,主要解决方案是分布式文件系统。

HDFS

DataNode 负责文件数据的存储和读写操作,HDFS 将文件数据分割成若干数据块(Block),每个 DataNode 存储一部分数据块,这样文件就分布存储在整个 HDFS 服务器集群中。

NameNode 负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据块的 ID 以及存储位置等信息,相当于操作系统中文件分配表(FAT)的角色。

DataNode 存储的数据块会进行复制,使每个数据块在集群里有多个备份,保证了数据的可靠性,并通过一系列的故障容错手段实现 HDFS 系统中主要组件的高可用,进而保证数据和整个系统的高可用。

HDFS 的高可用设计

  1. 数据存储故障容错:对于存储在 DataNode 上的数据块,计算并存储校验和(CheckSum)。在读取数据的时候,重新计算读取出来的数据的校验和,如果校验不正确就抛出异常。
  2. 磁盘故障容错:如果 DataNode 监测到本机的某块磁盘损坏,就将该块磁盘上存储的所有 BlockID 报告给 NameNode。
  3. DataNode 故障容错:DataNode 会通过心跳和 NameNode 保持通信
  4. NameNode 故障容错:采用主从热备的方式提供高可用服务,两台服务器通过 ZooKeeper 选举,主要是通过争夺 znode 锁资源,决定谁是主服务器。而 DataNode 则会向两个 NameNode 同时发送心跳数据

MapReduce

MapReduce 既是一个编程模型,又是一个计算框架。也就是说,开发人员必须基于 MapReduce 编程模型进行编程开发,然后将程序通过 MapReduce 计算框架分发到 Hadoop 集群中运行。

编程模型

MapReduce编程模型只包含 Map 和 Reduce 两个过程,map 的主要输入是一对 <Key, Value> 值,经过 map 计算后输出一对 <Key, Value> 值;然后将相同 Key 合并,形成 <Key, Value 集合 >;再将这个 <Key, Value 集合 > 输入 reduce,经过计算输出零个或多个 <Key, Value> 对。

MapReduce 是非常强大的,不管是关系代数运算(SQL 计算),还是矩阵运算(图计算),大数据领域几乎所有的计算需求都可以通过 MapReduce 编程来实现。

很多优秀的人,他们各有所长、各有特点,但是无一例外都有个共同的特征,就是对事物的洞察力,这种洞察力就是来源于他们对事物的抽象能力。

计算框架

MapReduce 如何让数据完成一次旅行,也就是 MapReduce 计算框架是如何运作的?

这个过程有两个关键问题需要处理。

  1. 如何为每个数据块分配一个 Map 计算任务,也就是代码是如何发送到数据块所在服务器的,发送后是如何启动的,启动以后如何知道自己需要计算的数据在文件什么位置(BlockID 是什么)。
  2. 处于不同服务器的 map 输出的 <Key, Value> ,如何把相同的 Key 聚合在一起发送给 Reduce 任务进行处理。

MapReduce 的主服务器就是 JobTracker,从服务器就是 TaskTracker。Hadoop 集群中绝大多数服务器同时运行 DataNode 进程和 TaskTracker 进程。

分布式计算需要将不同服务器上的相关数据合并到一起进行下一步计算,这就是 shuffle。

一些细节

每个 Map 任务的计算结果都会写入到本地文件系统,等 Map 任务快要计算完成的时候,MapReduce 计算框架会启动 shuffle 过程,在 Map 任务进程调用一个 Partitioner 接口,对 Map 产生的每个 <Key, Value> 进行 Reduce 分区选择,然后通过 HTTP 通信发送给对应的 Reduce 进程。这样不管 Map 位于哪个服务器节点,相同的 Key 一定会被发送给相同的 Reduce 进程。Reduce 任务进程对收到的 <Key, Value> 进行排序和合并,相同的 Key 放在一起,组成一个 <Key, Value 集合 > 传递给 Reduce 执行。

map 输出的 <Key, Value>shuffle 到哪个 Reduce 进程是这里的关键,它是由 Partitioner 来实现,MapReduce 框架默认的 Partitioner 用 Key 的哈希值对 Reduce 任务数量取模,相同的 Key 一定会落在相同的 Reduce 任务 ID 上。从实现上来看的话,这样的 Partitioner 代码只需要一行。

Yarn

Yarn 包括两个部分:一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager)。这也是 Yarn 的两种主要进程:ResourceManager 进程负责整个集群的资源调度管理,通常部署在独立的服务器上;NodeManager 进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,基本上跟 HDFS 的 DataNode 进程一起出现

资源管理器又包括两个主要组件:调度器和应用程序管理器。调度器其实就是一个资源分配算法,根据应用程序(Client)提交的资源申请和当前服务器集群的资源状况进行资源分配。应用程序管理器负责应用程序的提交、监控应用程序运行状态等。应用程序启动后需要在集群中运行一个 ApplicationMaster,ApplicationMaster 也需要运行在容器里面。

Yarn 进行资源分配的单位是容器(Container),每个容器包含了一定量的内存、CPU 等计算资源,默认配置下,每个容器包含一个 CPU 核心。容器由 NodeManager 进程启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向 ResourceManger 进程汇报。

为什么 HDFS 是系统,而 MapReduce 和 Yarn 则是框架?

实现 MapReduce 编程接口、遵循 MapReduce 编程规范就可以被 MapReduce 框架调用,在分布式集群中计算大规模数据;实现了 Yarn 的接口规范,比如 Hadoop 2 的 MapReduce,就可以被 Yarn 调度管理,统一安排服务器资源。所以说,MapReduce 和 Yarn 都是框架。

相反地,HDFS 就不是框架,使用 HDFS 就是直接调用 HDFS 提供的 API 接口,HDFS 作为底层模块被直接依赖。

MapReduce 如果想在 Yarn 上运行,就需要开发遵循 Yarn 规范的 MapReduce ApplicationMaster,相应地,其他大数据计算框架也可以开发遵循 Yarn 规范的 ApplicationMaster,这样在一个 Yarn 集群中就可以同时并发执行各种不同的大数据计算框架,实现资源的统一调度管理。

感想

Hadoop 几个主要产品的架构设计,就会发现它们都有相似性,都是一主多从的架构方案。HDFS,一个 NameNode,多个 DataNode;MapReduce 1,一个 JobTracker,多个 TaskTracker;Yarn,一个 ResourceManager,多个 NodeManager。

事实上,很多大数据产品都是这样的架构方案:Storm,一个 Nimbus,多个 Supervisor;Spark,一个 Master,多个 Slave。

大数据领域的一个架构模式,也就是集中管理,分布存储与计算

学习新知识的一种途径

我在学习新知识的时候会遵循一个5-20-2 法则,用 5 分钟的时间了解这个新知识的特点、应用场景、要解决的问题;用 20 分钟理解它的主要设计原理、核心思想和思路;再花 2 个小时看关键的设计细节,尝试使用或者做一个 demo。

如果 5 分钟不能搞懂它要解决的问题,我就会放弃;20 分钟没有理解它的设计思路,我也会放弃;2 个小时还上不了手,我也会放一放。你相信我,一种真正有价值的好技术,你这次放弃了,它过一阵子还会换一种方式继续出现在你面前。这个时候,你再尝试用 5-20-2 法则去学习它,也许就会能理解了。

大数据生态体系主要产品原理与架构

Hive是如何让MapReduce实现SQL操作的?

Hive 本身的技术架构其实并没有什么创新,数据库相关的技术和架构已经非常成熟,只要将这些技术架构应用到 MapReduce 上就得到了 Hadoop 大数据仓库 Hive。但是想到将两种技术嫁接到一起,却是极具创新性的,通过嫁接产生出的 Hive 可以极大降低大数据的应用门槛,也使 Hadoop 大数据技术得到大规模普及。还有哪些创新「嫁接」?

有下面这些例子:

  1. Jekins之类的持续集成工具,集成了非常多的工具及模块,比如sonar,git,mail等
  2. Linux 命令中最常用的管道符 | ,就是运用嫁接最多的地方吧
  3. jupyter notebook应该算是一个
  4. springboot 内置了tomcat 我们无需再为应用配置一个tomcat
  5. Spring Cloud将各种微服务的基础设施集成在一起

我们并没有觉得MapReduce速度慢,直到Spark出现

Hadoop MapReduce 虽然已经可以满足大数据的应用场景,但是其执行速度和编程复杂度并不让人们满意。于是 UC Berkeley 的 AMP Lab 推出的 Spark 应运而生,Spark 拥有更快的执行速度和更友好的编程接口,在推出后短短两年就迅速抢占 MapReduce 的市场份额,成为主流的大数据计算框架。

Hadoop MapReduce 虽然已经可以满足大数据的应用场景,但是其执行速度和编程复杂度并不让人们满意”,这句话其实是错误的。这样说好像可以让你更加清晰地看到事物发展的因果关系,同时也可以暗示别人自己有洞察事物发展规律的能力。然而,这种靠事后分析的因果规律常常是错误的,往往把结果当作了原因。

真实的情况是,人们在 Spark 出现之后,才开始对 MapReduce 不满。原来大数据计算速度可以快这么多,编程也可以更简单。我们常常意识不到问题的存在,直到有人解决了这些问题。

顶尖的产品设计大师和问题解决专家,不会去询问人们想要什么,而是分析和观察人们的做事方式,从而思考到更好的产品设计和问题解决方案。但是这种技巧需要深邃的观察力和洞察力,如果没有深度的思考,做出的东西就会沦为异想天开和自以为是。

有个技巧可以在工作中慢慢练习:不要直接提出你的问题和方案,不要直接说“你的需求是什么?”“我这里有个方案你看一下”。直向曲中求,对于复杂的问题,越是直截了当越是得不到答案。迂回曲折地提出问题,一起思考问题背后的规律,才能逐渐发现问题的本质。


同样的本质,为何Spark可以更高效?

MapReduce 一个应用一次只运行一个 map 和一个 reduce 不同,Spark 可以根据应用的复杂程度,分割成更多的计算阶段(stage),这些计算阶段组成一个有向无环图 DAG,Spark 任务调度器可以根据 DAG 的依赖关系执行计算阶段。

Spark 有三个主要特性使得 Spark 相对 Hadoop MapReduce 可以有更快的执行速度,以及更简单的编程实现。

  1. RDD 的编程模型更简单
  2. DAG 切分的多阶段计算过程更快速
  3. 使用内存存储中间计算结果更高效。

计算阶段划分的依据是 shuffle,不是转换函数的类型。不需要进行 shuffle 的依赖,在 Spark 里被称作窄依赖;相反的,需要进行 shuffle 的依赖,被称作宽依赖。


BigTable的开源实现:HBase

在传统企业的应用领域,许多应用系统设计都是面向数据库设计,也就是先设计数据库然后设计程序,从而导致关系模型绑架对象模型,并由此引申出旷日持久的业务对象贫血模型与充血模型之争

HRegion 是 HBase 负责数据存储的主要进程,应用程序对数据的读写操作都是通过和 HRegion 通信完成。当一个 HRegion 中数据量太多时,这个 HRegion 连同 HFile 会分裂成两个 HRegion,并根据集群中服务器负载进行迁移。如果集群中有新加入的服务器,也就是说有了新的 HRegionServer,由于其负载较低,也会把 HRegion 迁移过去并记录到 HMaster,从而实现 HBase 的线性伸缩。

HBase 列族的数据结构设计,实际上是把字段的名称和字段的值,以 Key-Value 的方式一起存储在 HBase 中。实际写入的时候,可以随意指定字段名称,即使有几百万个字段也能轻松应对。

LSM

为了提高数据写入速度,HBase 使用了一种叫作LSM 树的数据结构进行数据存储。LSM 树的全名是 Log Structed Merge Tree,翻译过来就是 Log 结构合并树。数据写入的时候以 Log 方式连续写入,然后异步对磁盘上的多个 LSM 树进行合并。

LSM 树可以看作是一个 N 阶合并树。数据写操作(包括插入、修改、删除)都在内存中进行,并且都会创建一个新记录(修改会记录新的数据值,而删除会记录一个删除标志)。这些数据在内存中仍然还是一棵排序树,当数据量超过设定的内存阈值后,会将这棵排序树和磁盘上最新的排序树合并。当这棵排序树的数据量也超过设定阈值后,会和磁盘上下一级的排序树合并。合并过程中,会用最新更新的数据覆盖旧的数据(或者记录为不同版本)。

Hbase 总结

  1. 架构上通过数据分片的设计配合 HDFS,实现了数据的分布式海量存储;
  2. 数据结构上通过列族的设计,实现了数据表结构可以在运行期自定义;
  3. 存储上通过 LSM 树的方式,使数据可以通过连续写磁盘的方式保存数据,极大地提高了数据写入性能。

感想

王小波说:“我活在世上,无非想要明白些道理,遇见些有趣的人,做一些有趣的事。倘能如我所愿,我的一生就算成功”。但是,这个好玩、有趣也不是一件容易的事,没有一定的知识、见识,没有有深度的思考,没有经历过足够的困难、挫折,就根本不能理解哪些是真正好玩、有趣的人和事。

所以你必须还是要努力拼搏、锐意进取,然后在这个过程中才能真正明白一些道理,并且会遇到一些有趣的人。“我只愿蓬勃生活在此时此刻,无所谓去哪,无所谓见谁。那些我将要去的地方,都是我从未谋面的故乡。以前是以前,现在是现在。我不能选择怎么生,怎么死;但我能决定怎么爱,怎么活。

在设计的时候,主要要考虑的是当需求变更的时候,如何用最小的代价实现变更。优秀的工程师不应该害怕需求变更,而应该欢迎需求变革,因为优秀的工程师已经为需求变更做好了设计,如果没有需求变更,那就显示不出自己和只会重复的平庸工程师的区别。

大数据开发实践

如何自己开发一个大数据SQL引擎?

SQL 的理论基础是关系代数,而关系代数的主要操作只有 5 种,分别是并、差、积、选择、投影。所有的 SQL 语句最后都能用这 5 种操作组合完成。而一个嵌套子查询可以等价转换成一个连接(join)操作。

SQL的语义远比 Hive AST 丰富,而幸运的是 SQL 丰富的表意逻辑主要源于它的嵌套子语句,这在 Hive AST 中是不存在的。但是 SQL 的嵌套子语句可以等价于若干 Join 操作。

Panthera 的设计思路是保留 Hive 语义分析器不动,替换 Hive 语法解析器,使其将标准 SQL 语句转换成 Hive 语义分析器能够处理的 Hive 抽象语法树

Panthera 项目组合使用了几种经典的设计模式,每个语法点被封装到一个类里去处理,每个类通常不过几十行代码,这样整个程序非常简单、清爽。如果在测试过程中遇到不支持的语法点,只需为这个语法点新增加一个类即可,团队协作与代码维护非常容易。

感觉 Panthera 项目还不错,可以抽空去看看。


Spark的性能优化案例分析

软件性能优化

关于软件性能优化,有个著名的论断。

  1. 你不能优化一个没有经过性能测试的软件。
  2. 你不能优化一个你不了解其架构设计的软件。

大数据软件性能优化

  1. SQL 语句优化
  2. 数据倾斜处理
  3. MapReduce、Spark 代码优化
  4. 配置参数优化。根据公司数据特点,为部署的大数据产品以及运行的作业选择合适的配置参数,是公司大数据平台性能优化最主要的手段,也是大数据运维工程师的主要职责。
  5. 大数据开源软件代码优化

如果性能测试发现,网卡是整个系统的瓶颈,程序运行过程中网卡达到了最大 I/O 能力,整个系统经常在等待网卡的数据传输,请问,你有什么性能优化建议呢?

  1. in网络打满:增加locality,尽量访问本地数据;
  2. out网络打满:优化代码或数据(例子:考虑零拷贝减少copy释放性能,使用大页内存减少页表miss,使用专门核心做收包缓存到软队列等),看能否提前合并减少发送的数据量(例:考虑batch要发送的网络包);
  3. 优化 container 摆放策略或并发数,避免热点。

Spark 调优案例

案例 1:Spark 任务文件初始化调优
案例 2:Spark 任务调度优化
案例 3:Spark 应用配置优化
案例 4:操作系统配置优化
案例 5:操作系统配置优化

这几个案例都比较基础,可以回顾下。

一些其他案例:

我们公司集群作业最多的就是SQL作业约占80%,不管是hive SQL还是spark SQL,presto的SQL引擎都不是完美的,执行任务都有可能卡住99%就不动了。优化业务逻辑,SQL的写法是关键,减少重复计算,共用中间结果,还要有分区表的感念。


从阿里内部产品看海量数据处理系统的设计

当你想做一个新东西,它必须要能解决当前的问题,这是人类社会的基本运行规律。如果当前没有问题呢?你相信我,这个世界不可能没有问题的,重要的是你要能发现问题。就像你做的东西将来也一定会有问题,因为现在的产品在将来一定会落伍,但那已经不再是你的问题。

技术只是手段,技术不落在正确的问题上一点用也没有,而落在错误的问题上甚至会搬起石头砸了自己的脚。而什么是正确的问题,你需要自己去思考和发现。

设计指标的设定,既不能低,如果比目前主流同类产品的指标还要差,自己再开发这样的产品就没有意义;也不能太高,如果设定太高,过度承诺,让老板、用户对你未来交付的产品抱有太高的期望,将来稍有不慎,无法达到期望,不但对产品的发展造成不良影响,甚至大家对你的人品都会产生怀疑。做好对别人的期望管理,让大家对你既充满期待,又不至不切实际,不但对你的职业发展大有帮助,应用到生活中也会获益良多。


大数据基准测试可以带来什么好处?

大数据基准测试工具 HiBench 内置了若干主要的大数据计算程序作为基准测试的负载(workload)。

  • Sort,对数据进行排序大数据程序。
  • WordCount,前面多次提到过,词频统计大数据计算程序。
  • TeraSort,对 1TB 数据进行排序,最早是一项关于软件和硬件的计算力的竞赛,所以很多大数据平 台和硬件厂商进行产品宣传的时候会用 TeraSort 成绩作为卖点。
  • Bayes 分类,机器学习分类算法,用于数据分类和预测。
  • k-means 聚类,对数据集合规律进行挖掘的算法。
  • 逻辑回归,数据进行预测和回归的算法。
  • SQL,包括全表扫描、聚合操作(group by)、连接操作(join)几种典型查询 SQL。
  • PageRank,Web 排序算法。

我能从大厂的大数据开发实践中学到什么?

在 Intel,我发现一些比较厉害的同事,他们学习一样新技术的时候,不会到处乱找资料,而是直接读原始论文。通过原始论文掌握核心设计原理以后,如果需要进一步学习,就去官网看官方文档;如果还需要再进一步参与开发,就去读源代码。

越是优秀的产品,越是厉害的作者,论文反而越是容易读懂,可能是因为这些作者是真的高手,自己理得越清楚,写出来的论文越是脉络清晰、结构合理、逻辑严谨。

大数据平台与系统集成

大数据从哪里来?

大数据平台的数据来源主要有数据库、日志、前端程序埋点、爬虫系统。

从数据库导入

  1. Sqoop 是一个数据库批量导入导出工具,可以将关系数据库的数据批量导入到 Hadoop,也可以将 Hadoop 的数据导出到关系数据库。
  2. 实时导入关系数据库的数据,可以选择 Canal。Canal 是阿里巴巴开源的一个 MySQL binlog 获取工具,binlog 是 MySQL 的事务日志,可用于 MySQL 数据库主从复制,Canal 将自己伪装成 MySQL 从库,从 MySQL 获取 binlog。

从日志文件导入

Flume 是大数据日志收集常用的工具。Flume 最早由 Cloudera 开发,后来捐赠给 Apache 基金会作为开源项目运营。

前端埋点采集

埋点的方式主要有手工埋点和自动化埋点。手工埋点就是前端开发者手动编程将需要采集的前端数据发送到后端的数据采集系统。自动化埋点则是通过一个前端程序 SDK,自动收集全部用户操作事件,然后全量上传到后端服器。自动化埋点有时候也被称作无埋点,意思是无需埋点,实际上是全埋点,即全部用户操作都埋点采集。

爬虫系统

对于企业大数据平台的爬虫,常常被禁止爬取的数据才是真正需要的数据,比如竞争对手的数据。

大数据分析与运营

互联网运营数据指标与可视化监控

互联网运营常用数据指标

  1. 新增用户数。新增用户数有日新增用户数、周新增用户数、月新增用户数等几种统计口径。
  2. 用户留存率。用户留存率 = 留存用户数 / 当期新增用户数,用户留存率是反映用户体验和产品价值的一个重要指标,一般说来,3 日留存率能做到 40% 以上就算不错了。
  3. 活跃用户数
  4. PV
  5. GMV。GMV 即成交总金额(Gross Merchandise Volume),是电商网站统计营业额(流水)、反映网站营收能力的重要指标。和 GMV 配合使用的还有订单量(用户下单总量)、客单价(单个订单的平均价格)等。
  6. 转化率转化率是指在电商网站产生购买行为的用户与访问用户之比。

如何利用大数据成为“增长黑客”?

增长黑客是近几年颇为流行的一个词汇,它是指利用数据、技术、产品等一系列手段为互联网产品获得快速用户增长的人。

关于用户增长有一个著名的 AARRR 模型,它描述了用户增长的 5 个关键环节,分别是:获取用户(Acquisition)、提高活跃度(Activation)、提高留存率(Retention)、获取收入(Revenue)和自传播(Refer)。

  1. 获取用户:通过各种推广手段,使产品触达用户并吸引用户,让用户访问我们的产品。
  2. 提高活跃度:用户访问我们的产品后,如果发现没意思、体验差,就很难再次打开,产品的价值也就无法实现。因此需要结合产品内容、运营活动各种手段吸引用户,提升产品的活跃度。
  3. 提高留存率:留住一个老用户的成本远低于获取一个新用户,而真正为产品带来营收利润的通常是老用户,因此需要提高留存率。提高留存率的常用手段有:针对老用户推出各种优惠和活动;建立会员等级体系,注册时间越长等级越高;对于一段时间没有访问的疑似流失用户进行消息短信推送以实现用户挽回等。
  4. 获取收入:做企业不是做慈善,开发、运营互联网产品的最终目的还是为了赚钱,即获取收入。互联网产品收入主要有用户付费和广告收入,有些互联网产品看起来是用户付费,但其实主要营收是广告收入,比如淘宝。
  5. 自传播:让用户利用利用自己的社交网络进行产品推广就是自传播,几乎所有的互联网产品都有“分享到”这样一个功能按钮,促进用户社交传播。有些产品还会利用“帮我砍价”“帮我抢票”等产品功能推动用户进行分享,实现产品的裂变式传播、病毒式营销。

利用大数据增长用户数量

  1. 利用用户画像进行精准广告获客;
  2. 通过用户分析挽回用户;
  3. A/B 测试决定产品功能;
  4. 大数据反欺诈、反羊毛;
  5. 用户生命周期管理。

为什么说数据驱动运营?

数据比代码的地位要高得多,用途也大得多,做大数据的同学要意识到数据的重要性。数据的作用是无处不在的,不但能做统计分析、精准营销、智能推荐,还能做量化交易帮你自动赚钱,甚至能驱动公司运营,管理整个公司。

公司到了一定规模,产品功能越来越复杂,人员越来越多,不管用什么驱动,最后一定都是数据驱动。没有量化的数据,不足以凝聚团队的目标,甚至无法降低团队间的内耗。这个时候哪个部门能有效利用数据,能用数据说话,能用数据打动老板,哪个部门就能成为公司的驱动核心,在公司拥有更多话语权。我们学大数据,手里用的是技术,眼里要看到数据,要让数据为你所用。数据才是核心才是不可代替的,技术并不是。

大数据算法

如何对数据进行分类和预测

KNN 算法,即 K 近邻(K Nearest Neighbour)算法,是一种基本的分类算法。其主要原理是:对于一个需要分类的数据,将其和一组已经分类标注好的样本集合进行比较,得到距离最近的 K 个样本,K 个样本最多归属的类别,就是这个需要分类数据的类别。

贝叶斯:主要利用贝叶斯公式。

数据的距离

  1. 欧氏距离
  2. 余弦距离:余弦相似度的值越接近 1 表示其越相似,越接近 0 表示其差异越大,使用余弦相似度可以消除数据的某些冗余信息,某些情况下更贴近数据的本质

文本的特征值

TF-IDF 算法是比较常用且直观的一种文本关键词提取算法。这种算法是由 TF 和 IDF 两部分构成。TF 是词频(Term Frequency),表示某个单词在文档中出现的频率,一个单词在一个文档中出现的越频繁,TF 值越高。IDF 是逆文档频率(Inverse Document Frequency),表示这个单词在所有文档中的稀缺程度,越少文档出现这个词,IDF 值越高。


如何发掘数据之间的关系?

PageRank 算法通过挖掘链接关系,发现互联网网页的排名权重;Apriori 算法通过购物篮分析,发现商品的频繁模式;K-means 算法则可以进行自动数据聚类。这些算法不需要人工事先对数据进行标注,一般被称作无监督算法。

如何预测用户的喜好?

常用的推荐算法有:基于人口统计的推荐、基于商品属性的推荐、基于用户的协同过滤推荐、基于商品的协同过滤推荐。

基于人口统计的推荐

基于人口统计的推荐是相对比较简单的一种推荐算法,根据用户的基本信息进行分类,然后将商品推荐给同类用户。

因为这种推荐算法比较简单,对于稍微精细一点的场景,推荐效果就比较差了。可以根据用户画像进行更精细的推荐,并进一步把用户喜好当做标签完善用户画像,再利用更完善的用户画像进行推荐,如此不断迭代优化用户画像和推荐质量。

基于商品属性的推荐

基于商品属性的推荐是将商品的属性进行分类,然后根据用户的历史行为进行推荐。

基于商品属性的推荐需要对商品属性进行全面的分析和建模,难度相对也更大一点,在实践中,一种简单的做法是提取商品描述的关键词和商品的标签作为商品的属性。此外,基于商品属性的推荐依赖用户的历史行为数据,如果是新用户进来,没有历史数据,就没有办法进行推荐了,即存在“冷启动”问题

基于用户的协同过滤推荐

基于用户的协同过滤推荐是根据用户的喜好进行用户分类,常用的就是我前面讲过的 KNN 算法,寻找和当前用户喜好最相近的 K 个用户,然后根据这些用户的喜好为当前用户进行推荐。

基于用户的协同过滤推荐和基于人口统计的推荐都是将用户分类后,根据同类用户的喜好为当前用户进行推荐。

基于商品的协同过滤推荐

基于商品的协同过滤推荐是根据用户的喜好对商品进行分类,如果两个商品,喜欢它们的用户具有较高的重叠性,就认为它们的距离相近,划分为同类商品,然后进行推荐。


机器学习的数学原理是什么?

构建一个机器学习系统,需要有三个关键要素:样本、模型、算法。

  • 样本就是通常我们常说的“训练数据”,包括输入和结果两部分。
  • 模型就是映射样本输入与样本结果的函数,可能是一个条件概率分布,也可能是一个决策函数。
  • 算法就是要从模型的假设空间中寻找一个最优的函数,使得样本空间的输入 X 经过该函数的映射得到的 f(X),和真实的 Y 值之间的距离最小。

机器学习中用损失函数来评估模型是否最接近最优解。损失函数用来计算模型预测值与真实值的差距,常用的有 0-1 损失函数、平方损失函数、绝对损失函数、对数损失函数等。


软件工程师如何进入人工智能领域?

处于上升阶段,即具有长远发展前景的人工智能技术包括:

  1. 人工智能管理
  2. 通用人工智能
  3. 知识图谱
  4. 神经形态硬件
  5. 自然语言生成

处于顶部,被众人期待,但是可能有些过热的人工智能技术包括:

  1. 人工智能平台即服务
  2. 深度神经网络专用芯片
  3. 智能机器人
  4. 语音交互
  5. 智能应用
  6. 图形分析
  7. 目标分析
  8. 深度学习
  9. 自然语言处理
  10. 虚拟助理

经过泡沫洗礼,关注度下滑,进入冷静期的人工智能技术:

  1. 计算机视觉
  2. 预测分析
  3. 自动驾驶
  4. 增强现实 AR

寄语&结束语

这个世界很多事情,都是回头再看的时候,才觉得轰轰烈烈,处在浪潮之巅;而身在其中的时候,只是觉得平淡,甚至煎熬。反而很多一开始就轰轰烈烈的事情,回头再看大多却是一地鸡毛。

有的时候,并不是努力就有回报,越是确定的领域,努力越不重要。这些确定的领域,重要的是资源、关系、等级、资历,蛋糕已经做好,努力并不能多分到蛋糕。而在不确定的领域,有可能做出新的蛋糕,在这些地方重要的是努力、聪明、野心、欲望,努力加上运气,就有可能创出自己的一片天地。