Hadoop/Spark入门学习笔记(完结)

Hadoop基础及演练

---第1章 初识大数据

  • 大数据是一个概念也是一门技术,是在以Hadoop为表明的大数据平台框架上进行各类数据分析的技术.

---第2章 Hadoop核心HDFS

  • Hadoop是一个开源的大数据框架,是一个分布式计算的解决方案,Hadoop=HDFS(分布式文件系统)+MapReduce(分布式计算)
  • 存储是大数据技术的基础,分布式计算是大数据应用的解决方案
  • HDFS基础架构:
  1. 数据块:是抽象块,通常设置为128MB,备份3个.
  2. NameNode:主数据块,管理文件系统的命名空间,存放文件元数据,维护文件系统的全部文件和目录,文件与数据块的映射,记录每一个文件各个块所在数据节点的信息
  3. DataNode:从数据块,存储并检索数据块,向NameNode更新所存储块的列表
  • HDFS优势:
  1. 适合大文件存储,并有副本策略
  2. 能够构建在廉价的机器上,并有必定的容错和恢复机制
  3. 支持流式数据访问,一次写入,屡次读取最高效
  • HDFS缺点:
  1. 不适合大量小文件存储
  2. 不适合并发写入,不支持文件随机修改
  3. 不支持随机读等低延时的访问方式
  • 数据块的大小多少合适:64MB或128MB,过小会增长硬盘寻道时间,太大会影响MapReduce
  • NameNode若是挂了怎么办:设置备用节点,失效后自动激活
  • HDFS写流程:
  1. 客户端向NameNode发起写数据请求
  2. 分块写入DataNode节点,DataNode自动完成副本备份
  3. DataNode向NameNode汇报存储完成,NameNode通知客户端

 

  • HDFS读流程:
  1. 客户端向NameNode发起读数据请求
  2. NameNode找出距离最近的DataNode节点信息
  3. 客户端从DataNode分块下载文件

  • 经常使用HDFS Shell命令:
  1. 类Linux系统:ls,cat,mkdir,rm,chmod,chown等
  2. HDFS文件交互:copyFromLocal,copyToLocal,get,put
  3. 上传文件:hdfs dfs -copyFromLocal 目标文件 目标路径
  4. 下载文件:hdfs dfs -copyToLocal 源文件 目标文件
  • python的hdfs3库能够用python进行文件的写入和读取
from hdfs3 import HDFileSystem test_host = 'localhost' test_port = 9000


def hdfs_exists(hdfs_client): path = '/tmp/test'
    if hdfs_client.exists(path): hdfs_client.rm(path) hdfs_client.makedirs(path) def hdfs_write_read(hdfs_client): data = b'hello hadoop' * 20 file_a = 'tmp/test/file_a' with hdfs_client.open(file_a, 'wb', replication=1) as f: f.write(data) with hdfs_client.open(file_a, 'rb') as f: out = f.read(len(data)) assert out == data def hdfs_readlines(hdfs_client): file_b = '/tmp/test/file_b' with hdfs_client.open(file_b, 'wb', replication=1) as f: f.write(b'hello\nhadoop') with hdfs_client.open(file_b, 'rb') as f: lines = f.readlines() assert len(lines) == 2


if __name__ == '__main__': #建立客户端
    hdfs_client = HDFileSystem(host=test_host, port=test_port) hdfs_exists(hdfs_client) hdfs_write_read(hdfs_client) hdfs_readlines(hdfs_client) hdfs_client.disconnect() print('-' * 20) print('hello hadoop')
python操做HDFS

 

---第3章 Hadoop核心MapReduce

  • YARN:资源管理器,负责集群资源的管理和调度.
  1. ResourceManager:分配和调度资源,启动并监控ApplicationMaster,监控NodeManager
  2. ApplicationMaster:为MR类型的程序申请资源并分配给内部任务,负责数据切分,监控任务的执行及容错
  3. NodeManager:管理单个节点的资源,处理来自ResourceManager和ApplicationMaster的命令
  • MapReduce(MR)是一种编程模型和方法:
  1. split:输入一个大文件,将其分片
  2. map:每一个分片由单独的机器处理
  3. reduce:将各个机器计算的结果进行汇总并获得最终结果
import sys def read_input(file): for line in file: yield line.split() def main(): data = read_input(sys.stdin) for words in data: for word in words: print("%s%s%d"%(word, '\t', 1)) if __name__ == '__main__': main()
python map
import sys from operator import itemgetter from itertools import groupby def read_mapper_output(file, separator='\t'): for line in file: yield line.rstrip().split(separator, 1) def main(): data = read_mapper_output(sys.stdin) for current_word, group in groupby(data, itemgetter(0)): total_count = sum(int(count) for current_word, count in group) print("%s%s%d"%(current_word, '\t', total_count)) if __name__ == '__main__': main()
python reduce

 

---第4章 Hadoop生态圈介绍

  • 如何经过Hadoop存储小文件:能够利用HDFS将小文件合并为大文件,或者利用某种方式对文件进行分组(Hadoop Archives,SequenceFile,HBase)
  • 当有节点故障时,集群如何继续提供服务:NameNode会让其余DataNode从现有副本复制这些数据块.若是又恢复正常,则随机选择要删除的副本
  • 哪些是影响MapReduce性能的因素:算法,硬件,底层存储系统,输入数据的大小
  • HBase是一个分布式数据库.利用HDFS做为文件存储系统,支持MR程序读取数据.能够存储非结构化半结构化数据.核心概念是RowKey(数据惟一标识,按字典排序),Column Family(列族,多个列的集合,不能超过3个),TimeStamp(时间戳,支持多版本数据同时存在).
  • Spark是一个基于内存计算的大数据并行计算框架.是MapReduce的替代方案,兼容HDFS,HIVE等数据源.优点是抽象出分布式内存存储数据结构(弹性分布式数据集RDD),基于事件驱动,经过线程池复用线程提升性能.

Hadoop进阶

---第1章 概述

  • 大数据能够用于精准营销,用户画像,商品推荐等功能的实现.
  • 一个NameNode对应多个DataNode.全部DataNode按期向NameNode发送心跳,若是NameNode没有收到就认为该DataNode已经挂掉,会将数据发送到其余节点.还有一个Secondary NameNode用于备份NameNode.
  • Hadoop2.0移除了JobTracker和TaskTracker,该由Yarn负责集群中全部资源的管理和分配,NodeManager管理单个计算节点.

---第2章 深刻探索MapReduce过程

  • WordCount为例的MapReduce:
  1. Split:将多个文本分为不一样的分片
  2. Map:以<key,value>形式输入,其中key是行号,value是文本,利用map将其拆分,key为单词,value为1(表明该单词出现一次).
  3. Shuffle:以map的输出做为输入,将相同的单词归到一块儿,但不进行次数累加.
  4. Reduce:以shuffle的输出做为输入,对单词次数进行累加求和,输出key为单词,value为次数.
  • 输入文件保存在DataNodeblock(数据块)中,每个文件都会增长分片数量,并映射在NameNode中,而NameNode内存有限,因此HDFS适合存放大文件.
  • 节点Map任务的个数能够经过增大mapred.map.tasks来增长,也能够经过增大mapred.min.split.size或合并小文件来减小.
  • Combine是指本地优化,在本地先按照key进行一轮排序和合并,在进行网络混洗.在多数状况下Combine的逻辑和Reduce的逻辑是一致的,能够认为Combine是对本地数据的Reduce.
  • map先将文件放入内存缓冲区,而后将其中的小文件合并为大文件,进行网络传输.key值相同的文件会进行partition(合并),再进行reduce.
  • 一个MapReduce中,如下三者的数量老是相等的:partitioner的数量,redue任务的数量,最终输出文件.
  • 在数据量大的状况下,应该将reduce任务数设为较大值.能够经过调节参数mapred.reduce.tasks和job.setNumReduceTasks(int n)方法进行设置

---第3章 Hadoop的分布式缓存

  • 在执行MapReduce时,Mapper之间须要共享信息,若是信息量不大,能够将其从HDFS加载到内存中,这就是Hadoop分布式缓存机制(DistributedCache).若是共享数据太大,能够将共享数据分批缓存,重复执行做业.
  • MapReduce进行矩阵相乘:
  1. 将右侧矩阵转置
  2. 将右矩阵载入分布式缓存
  3. 将左矩阵的行做为Map输入
  4. 在Map执行以前将缓存的右矩阵以行为单位放入List
  5. 在Map计算时从List中取出全部行分别与输入行相乘

---第4章 推荐算法

  • 有余弦类似度,切比雪夫距离,欧氏距离,皮尔森系数等描述向量类似程度的度量方法
  • 基于物品的推荐算法(ItemCF):
  1. 用户行为与权重(点击,搜索,收藏,付款)
  2. 算法思想是给用户推荐那些和他们以前喜欢的物品类似的物品
  3. 根据用户行为列表计算用户,物品的评分矩阵
  4. 根据评分矩阵计算物品的类似度矩阵
  5. 类似度矩阵*评分矩阵=推荐列表
  6. 在推荐列表中将用户产生过行为的物品置0
  • 基于用户的推荐算法(UserCF):
  1. 根据用户行为列表计算物品,用户的评分矩阵.
  2. 根据评分矩阵计算用户的类似度矩阵.
  3. 类似度矩阵*评分矩阵=推荐列表
  4. 在推荐列表中将用户产生过行为的物品置0
  • 基于内容的推荐算法:
  1. 给用户推荐和他们以前喜欢的物品在内容上类似的其余物品
  2. 物品特征建模
  3. 构建Item Profile矩阵(0,1矩阵)
  4. 构建Item User评分矩阵
  5. 将两个矩阵相乘获得User Profile矩阵.表示用户对特征的兴趣权重.
  6. 对Item Profile和User Profile求余弦类似度
  7. 在推荐列表中将用户产生过行为的物品置0

Spark从零开始

---第1章 Spark介绍

  • Spark是一个快速(扩充了流行的MapReduce计算模型,基于内存计算)且通用(容纳了其余分布式系统拥有的功能)的集群计算平台.
  • Spark的组件:
  1. Spark Core:包含Spark的基本功能,好比任务调度,内存管理,容错机制.定义了RDD(弹性分布式数据集),提供了API来建立和操做RDD.
  2. Spark SQL:处理结构化数据的库.
  3. Spark Streaming:实时数据流组件.
  4. Mlib:包含通用机器学习功能的包.
  5. Graphx:处理的库,并进行图的并行计算.
  6. Cluster Managers:集群管理.
  • 相比Hadoop,Spark能够用于时效性要求高的场景和机器学习等领域.

---第2章 Spark的下载和安装

  • Spark是Scala写的,运行在JVM上.
  • Spark的shell可以处理分布在集群上的数据,把数据加载到节点的内存中.分为Python shellsScala shells.

---第3章 开发第一个Spark程序

  • WordCount:
  1. 建立一个Spark Context
  2. 加载数据
  3. 把每一行分割成单词
  4. 转换成pairs而且计数
  • 打包程序-启动集群-提交任务-执行任务  

---第4章 RDDs

  • Driver program包含程序main方法,RDDs的定义和操做.它管理不少executors(节点).python

  • 经过SparkContext访问Spark,它表明和一个集群的链接.在Shell中是自动建立好的.算法

  • RDDs弹性分布式数据集的简写.它们并行分布在整个集群中.无论整个数据集被切分成几块,均可以用它来访问整个数据集.一个RDD是一个不可改变的分布式集合对象.全部计算都是经过RDDs的建立,转换,操做完成的.一个RDD内部由不少partitions(分片)构成,每一个分片包括一部分数据,是Spark并行处理的单元.RDD的建立能够用parelleilzie()加载外部数据集.
  • RDD基本操做:
  1. Transformations指的是从以前的RDD构建一个新RDD的过程.如map(接收函数,把函数应用到RDD,返回新RDD),filter(接收函数,返回只包含知足filter函数的元素的RDD),flatMap(对每一个输入元素,输出多个输出元素).
  2. RDD支持数学集合计算,如并集,交集.
  3. Action是在RDD上计算出一个结果,把结果返回给driver program或保存在文件系统.如reduce(接收一个函数,做用在RDD两个类型相同的元素上,返回新元素),collect(遍历整个RDD,返回RDD的内容,注意内容须要单机内存可以容纳下),take(返回RDD的n个元素,返回结果无序),top(返回排序后的topN值),foreach(计算RDD中的每一个元素,但不返回到本地).
  • Spark维护着RDDs之间的依赖关系和建立关系,叫作血统关系图,能够用于计算RDD的需求和恢复丢失数据.
  • 延迟计算:Spark对RDD的计算是在第一次使用action操做的时候.这能够减小数据的传输.
  • 使用map()函数能够建立KeyValue对RDDs.KeyValue对RDDs的Transformations操做有reduceByKey(把相同key的结合),groupByKey(把相同的key的values分组),mapValues(对value进行map操做).
  • combineByKey最经常使用基于key聚合函数,接收四个参数.返回类型能够与输入类型不同.它遍历元素的key,若是是新元素就使用createCombiner函数,若是已存在就使用mergeValue函数.合计每一个分片结果的时候使用mergeCombiners函数.
相关文章
相关标签/搜索