Hadoop
一个开源的大数据框架
一个分布式计算的解决方案
Hadoop = HDFS(分布式文件系统)+MapReduce(分布式计算)
Hadoop核心
HDFS分布式文件系统:存储是大数据技术的基础
MapReduce变成模型:分布式计算是大数据应用的解决方案
HDFS场景:
- 成百上千的机器
- 按TB甚至PB为单位的大量数据
- 简单便捷的文件获取
HDFS概念:
- 数据块:数据块是一个抽象的概念,在HDFS上按照块作为存储单元而不是按照文件,推荐一个块128MB,如果一个文件是300MB,那么就可以将文件拆分成多个数据块。
- NameNode:主(只有一个),管理文件系统的命名空间,存放文件元数据;维护文件系统的所有文件和目录,文件与数据块的影射关系;记录每个文件中各个块所在数据节点的信息。
- DataNode:从,负责存储并检索数据块,想NameNode更新所存储块的列表。
HDFS优点:
- 适合大文件存储,支持TB、PB的数据存储,并有副本策略。
- 可以构建在廉价的机器上,并由一定的容错和恢复机制
- 支持流式数据访问,一次写入多次读取最高效
HDFS缺点:
- 不适合大量小文件的存储
- 不适合并发写入,不支持文件随机修改
- 不适合随机读等低延时的访问方式
HDFS读流程和写流程
在2.0中容错的机制是,可以配置成ha(高可用集群),集群里面有两个NameNode节点,一个为主节点,另一个备用节点,两个节点保持统一,如果主节点挂掉了切换成备用节点,一般用户感觉不到。
写流程
客户端向NameNode发起请求,NameNode保存了各个节点的状态,知道哪个DataNode上面还有空间可以去存储这个文件,然后NameNode就将这些信息发送给客户端,此时客户端就会对这个文件进行分块(假如分成了两块),然后根据刚才NameNode发送的信息,客户端把数据块1发送给DataNode1,DataNode1就将数据块1进行了保存,然后知道数据块1要备份成三分,然后DataNode1就将数据块1传给了DataNode2和DataNode3,等三个DataNode都存储好数据了之后返回给NameNode,告诉NameNode我已经存好数据块1了,然后NameNode就会更新相关的链表,接下来就开始存数据块2了,过程与之前一致。
- 客户端向NameNode发起写数据请求
- 分块写入DataNode节点,DataNode自动完成副本备份
- DataNode想NameNode汇报存储完成,NameNode通知客户端
HDFS读流程
客户端想NameNode发起请求告诉要取那个文件,NodeNode根据数据块的信息告诉客户端你要的数据在哪个DataNode上,然后客户端就像DataNode1取回了数据块1,向DataNode2取回了数据块2。(加入DataNode2挂了,客户端就会从DataNode3取)
- 客户端想NameNode发起数据请求
- NameNode找出距离最近的DataNode节点信息
- 客户端从DataNode分块下载文件
shell命令操作HDFS
常用HDFS shell命令
类Linux系统:ls cat mkdir rm chmod chown
HDFS文件交互:copyFromLocal 从本地拷问到HDFS copyToLocal从HDFS拷贝到本地 get下载文件 put上传文件
终端中:
先启动NameNode和DataNode
bin目录中有可执行文件
帮助文档 ./hdfs dfs -help
查看HDFS的根目录有什么:hdfs dfs -ls /
创建一个测试的目录 hdfs dfs -mkdir /test
上传一个文件 hdfs dfs -copyFromLocal 文件路径 /test
输出文件内容 hdfs dfs -cat /test/mk.txt
下载文件 hdfs dfs -coptToLocal /test/mk.txt /home/hadoop/mk2.txt
更改权限 hdfs dfs -chmod 777 /test/mk.txt
python操作HDFS