数据分析知识补充:Hadoop、YARN、Spark、Hive

Hadoop

概念

HDFS文件系统+MapReduce数据处理

假如有1T的数据,我想一行一行正则过滤出想要的内容。就需要

  1. 把数据导入HDFS
  2. 定义map方式,也就是把key设置成行数,把value设置为每行内容
  3. 定义reduce:通过正则方式进行匹配,正确的内容通过reduce聚合起来返回

那么Hadoop就会把这个工作自动分配给你已有的n个计算结点去完成

YARN是MapReduce团队对原本框架的重构,可以理解成MapReduce v2

Spark是微软在Hadoop基础上改的,主要是解决了多余的中间结果读写问题,而是用cache来存(貌似?);并且还可以同时包含多个map和reduce。spark用起来比mr方便点

另外spark适用于实时计算,但是Hadoop不大适合,适合离线计算;这肯定也是因为那个鸡肋的中间结果读写

Hive是包在Hadoop外面的壳,Facebook搞的,把MapReduce程序包装成了类SQL,可能不会代码的人用起来方便点吧

HDFS基本原理

原理简单但是……估计操作更简单?

struc
struc

结构:

  1. nameNode负责维护数据block对应的dataNote映射信息
  2. DataNode当然就存具体block了

形式:

  1. 一个block存在3个区域中,这3个区域还要分布在2个主机上,防止数据挂掉(不知道这数据是默认的还是?)
  2. 原始的数据是会被分成小的block的。比如一个100m的数据可能被分成66m的block1和36m的block2
  3. block被写入HDFS的时候,是流式的,即一个block被分为更小的块,第一块写进host1,然后host1把它写给host2,这时候第二块又写进host1,同时host2写完了再把刚刚的第一块写给host3……

MapReduce基本原理

用户自己定义好map和reduce两个函数。

  • map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。
  • reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。

例:统计词频:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
map(String key, String value): 
  // key: document name
  // value: document contents
  for each word w in value:
    EmitIntermediate(w, "1");


reduce(String key, Iterator values):
  // key: a word
  // values: a list of counts
  int result = 0;
  for each v in values:
    result += ParseInt(v);
    Emit(AsString(result));