【大数据】Hadoop基础
Hadoop是什么
Hadoop是一个开源的大数据框架
Hapdoop是一个分布式计算的解决方案
Hadoop=HDFS(分布式文件系统)+MapReduce(分布式计算)
Hadoop的核心
HDFS分布式文件系用:存储是大数据技术的基础
MapReduce编程模型:分布式计算时大数据应用的解决方案
通俗的理解就是。 如果有一个很大的任务, 单机很难完成, 所以要用到分布式, 就是有一台主节点机器(服务器), 有很多从节点机器(服务器), 然后主节点给多个从节点分配任务, 把一个大任务分成很多小任务, 给每个从节点去完成, 然后主节点机器收集每个从节点的结果, 处理得出最终结果, hadoop就是一个完成了这个事情的框架...
HDFS是这个框架的文件系统,就像平时常见的NTFS、FAT32这种文件系统一样,他对于特别大的文件支持比较好。
然后MapReduce是什么呢, 这个分为Map和Reduce, Map就是分配任务, 把一个大任务分配成小任务, 这个叫map, 然后Reduce就是把每个小任务得到的结果汇总起来, 处理这些结果。
HDFS简介
HDFS可以横跨成百上千的机器,这样可以让操作者感觉到只在对一台机器进行操作一样,它可以存储按TB甚至PB为单位的大量的数据,并且获取存储的文件十分简单便捷。
HDFS的一些概念
数据块
存储在HDFS上的文件是以数据块为单位来进行存储的(数据块是抽象块而非整个文件作为存储单元)
默认大小为64MB,一般设置为128M,备份*3
比如存一个10MB的文件,就需要存一个数据块block,比如存一个300MB的文件,可能需要存3个数据块block。
NameNode
上面讲到的分布式就是一个主从模式,那么NameNode就是主,DataNode就是从。
NameNode管理文件系统的命名空间,存放文件元数据。维护着文件系统的所有文件和目录,文件与数据块的映射。并且它会记录每个文件中各个数据块所在数据节点的信息。
DataNode
DataNode其实就是众多工作节点,它负责存储并检索数据块,NameNode需要的时候它能检索出来,并且它要向NameNode更新它当前存储块的列表,要让NameNode知道数据块都在哪。
HDFS优点
适合大文件存储,支持TB、PB级的数据存储,并有副本策略。
可以构建在廉价的机器上,并有一定的容错和恢复机制。
支持流式数据访问,一次写入,多次读取最高效。
HDFS缺点
不适合大量小文件存储。
不适合并发写入,不支持文件随机修改。
不支持随机读等低延时的访问方式。
HDFS写流程
客户端向 Namenode发起写数据请求。
分块写入 Datanode节点, Datanode自动完成副本备份。
DataNode向Namenode汇报存储完成, Namenode通知客户端。
比如说,现在有一个文件叫xl,客户端发起请求给NameNode说我要存这个文件,备份3份。然后NameNode去检查有DataNode-1和DataNode-2以及DataNode-3这三个节点还有空间去存。于是NameNode就把这个信息反馈给客户端,客户端就把xl这个文件分割成xl-a和xl-b这两个块。然后客户端会根据NameNode的信息把xl-a传给DataNode-1, DataNode-1存下来后一看是要备份三份,然后原模原样再传给DataNode-2和DataNode-3. 三个DataNode都存储完以后,会一起给NameNode发信息,告知NameNode更新元数据信息的列表。NameNode更新完后告知客户端xl-a存储完毕,然后客户端开始重复上面的流程,存储xl-b这个块。
HDFS读流程
客户端向NameNode发起读数据请求。
NameNode找出最近的DataNode节点信息。
客户端从DataNode分块下载文件。
比如说,现在客户端要读刚刚存储的文件xl,客户端发起请求给NameNode说我要读这个文件。然后NameNode告诉客户端这个文件所属块的都在那三个DataNode上, 那么此时客户端就会选择一个最近的比如说是DataNode-1,把数据块xl-a和xl-b读取回来。如果DataNode-1挂了,那么客户端就需要选择DataNode-2来读取数据。
常用HDFS Shell命令
hadoop在linux中安装的教程可参考如下:
https://www.cnblogs.com/pejsidney/p/8875994.html
类linux系统:ls、cat、mkdir、rm、chmod、chown等
HDFS文件交互:copyFromLocal、copyToLocal、get、put
常用HDFS Python API
一个使用python程序操作HDFS的例子
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打开文件,replication表示备份数
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))
# 断言,如果out和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()
# 断言,入如果lines的长度不是2,那么抛出异常
assert len(lines) == 2
if __name__ == ’__main__‘:
hdfs_client = HDFileSystem(host=test_host,port=test_host)
hdfs_exists(hdfs_client)
hdfs_write_read(hdfs_client)
hdfs_readlines(hdfs_client)
hdfs_client.disconnect()
print(”-“*20)
print(”hello hadoop“)
MapReduce 简介
MapReduce是hadoop的第二个核心,是一种编程模型,是一种编程方法,是一种抽象的理论,是一种分而治之的思想。
YARN 概念
YARN是 hadoop2.0 的资源管理器,它负责整个集群的资源管理和调度。所有的MapReduce程序都需要使用YARN来进行调度。
YARN涉及到三个概念:ResourceManager、ApplicationMaster、NodeManager
ResourceManager
分配和调度资源
启动并监控ApplicationMaster
监控NodeManager
ApplicationMater
为MR类型的程序申请资源,并分配给内部任务
负责数据的切分
监控任务的执行及容错
NodeManager
管理单个节点的资源
处理来自ResourceManager的命令
处理来自ApplicationMaster的命令
MapReduce 编程模型
输入一个大文件,通过split之后,将其分成多个分片
每个文件分片由单独的机器去处理,这就是Map方法
将各个机器计算的结果进行汇总并得到最终结果,这就是Reduce方法
MapReduce 实战
hdfs_map.py
import sys
def read_input(file):
"""分行读取"""
for line in file:
yield line.split()
def main():
"""
将读取出来的数据格式化打印
例如:
a 1
b 1
a 1
"""
data = read_input(sys.stdin)
for words in data:
for word in words:
print("%s%s%d" % (word, '\t', 1))
if __name__ == '__main__':
main()
hdfs_reduce.py
import sys
def read_mapper_output(file, separator='\t'):
"""分行读取,并按分割分富符号分割内容"""
for line in file:
yield line.rstrip().split(separator, 1)
def main():
"""
将map的结果进行分组统计
例如:
a 1
b 1
a 1
统计后为
a 2
b 1
"""
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()
Hadoop的生态圈中常用的两个东西
Hbase、Spark
Hbase简介
高可靠、高性能、面向列、可伸缩、实时读写的分布式数据库
利用HDFS作为其文件存储系统,支持MR程序读取数据
存储非结构化和半结构化数据
RowKey:数据唯一标识,按字典排序。
Colunmn Family:列族,多个列的集合,最多不要超过三个。
TimeStamp 时间戳:支持多版本数据同时存在。
Spark简介
基于内存计算的大数据并行计算框架。
Spark是MapReduce的替代方案,兼容HDFS,HIVE等数据源
优势
基于内存计算的分布式计算框架
抽象出分布式内存存储数据结构:弹性分布式数据集RDD
基于事件驱动,通过线程池复用线程提高性能。