Hadoop之HDFS理论及操作

HDFS理论及操作

		

1. 分布式是什么?

分布式是把一个庞大的数据和一个复杂的业务分别部署在不同的计算机上运行
		

2. HDFS 是什么?

HDFS 为分布式存储系统,主要解决大数据的存储问题,如百度网盘 360 云盘
		

3. HDFS 的优缺点

1) 优点: 1. 适合大数据处理:GB 、TB 、甚至 PB 级及以上的数据 2. 百万规模以上的文件数量:10K+ 节点 3. 适合批处理:移动计算而非数据(MR),数据位置暴露给计算框架 4. 可构建在廉价机器上 5. 高可靠性:通过多副本提提高 6. 高容错性:数据自动保存多个副本;副本丢失后,自动恢复,提供了恢复机制 2) 缺点: 1. 不支持毫秒级 2. 吞吐量大但有限制于其延迟 3. 小文件存取占用 NameNode 大量内存 4. 不支持文件修改:一个文件只能有一个写者(深入) 5. 仅支持 append 不支持修改(其实本身是支持的,主要为了空间换时间,节约成本)
		

4. HDFS 数据存储模型

1) 文件被线性切分成固定大小的数据块 block 1. 通过偏移量 offset(单位:byte)标记 2. 默认数据块大小为 64MB (hadoop1.x),可自定义配置 3. 若文件大小不到 64MB ,则单独存成一个 block 2) 一个文件存储方式 1. 按大小被切分成若干个 block ,存储到不同节点上 2. 默认情况下每个 block 都有 2 个副本 共 3 个副本 3. 副本数不大于节点数 3) Block 大小和副本数通过 Client 端上传文件时设置,文件上传成功后副本数可以变更,Block Size 大小不可变更
		

5. NameNode(简称 NN)

1) NameNode 主要功能 1. 接受客户端的读/写服务 2. 接受 DN 汇报的 block 列表信息 2) NameNode 保存 metadate 信息 1. 基于内存存储 :不会和磁盘发生交换;只存在内存中不会持久化 2. metadate 元数据信息包括以下 1. 文件 owership(归属)和 permissions(权限) 2. 文件大小 时间 3. Block 列表[偏移量]:即一个完整文件有哪些 block 3) NameNode 的 metadate 信息在启动后会加载到内存 1. metadata 存储到磁盘文件名为”fsimage”的镜像文件 2. Block 的位置信息不会保存到 fsimage 3. edits 记录对 metadata 的操作日志
		

6. SecondaryNameNode(SNN)

1) 它的主要工作是帮助 NN 合并 edits log 文件,减少 NN 启动时间,它不是 NN的备份(但可以做备份) 2) SNN 执行合并时间和机制 1. 根据配置文件设置的时间间隔 fs.checkpoint.period 默认 3600 秒 2. 根据配置文件设置 edits log 大小 fs.checkpoint.size 规定 edits 文件的最大值默认是 64MB
		

7. DataNode(DN)

1) 存储数据(Block) 2) 启动 DN 线程的时候会向 NameNode 汇报 block 信息 3) 通过向 NN 发送心跳保持与其联系(3 秒一次),如果 NN 10 分钟没有收到 DN的心跳,则认为其已经 lost,并 copy 其上的 block 到其它 DN
		

8. Block 的副本放置策略

1) 第一个副本:放置在上传文件的 DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU 不太忙的节点。 2) 第二个副本:放置在于第一个副本不同的机架的节点上 3) 第三个副本:与第二个副本相同机架的不同节点 4) 更多副本:随机节点
		

9. HDFS 读写流程

1) 读 1. 首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例 2. DistributedFileSystem通过rpc协议获得文件的第一批block的locations地址,(同一个block按照重复数会返回多个locations,因为同一文件的block分布式存储在不同节点上),这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面(就近原则选择)。 3. 前两步会返回一个FSDataInputStream对象,该对象会被封装DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。 4. 数据从datanode源源不断的流向客户端。 5. 如果第一文件的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一文件。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流 6. 如果第一批block都读完了,DFSInputStream就会去namenode拿下一批block的locations,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流 2) 写 1. 客户端通过调用DistributedFileSystem的create方法创建新文件 2. DistributedFileSystem通过RPC调用namenode去创建一个没有blocks关联的新文件,创建前, namenode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过, namenode就会记录下新文件,否则就会抛出IO异常 3. 前两步结束后,会返回FSDataOutputStream的对象,与读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream.DFSOutputStream可以协调namenode和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小的packet,然后排成队列data quene。 4. DataStreamer会去处理接受data quene,它先询问namenode这个新的block最适合存储的在哪几个datanode里(比如重复数是3,那么就找到3个最适合的datanode),把他们排成一个管道pipeline输出。DataStreamer把packet按队列输出到管道的第一个datanode中,第一个datanode又把packet输出到第二个datanode中,以此类推。 5. DFSOutputStream还有一个对列叫ack quene,也是由packet组成等待datanode的收到响应,当pipeline中的datanode都表示已经收到数据的时候,这时ack quene才会把对应的packet包移除掉。 如果在写的过程中某个datanode发生错误,会采取以下几步: 1. pipeline被关闭掉 2. 为了防止防止丢包ack quene里的packet会同步到data quene里;创建新的pipeline管道怼到其他正常DN上 3. block剩下的部分被写到剩下的两个正常的datanode中; 4. namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的 6. 客户端完成写数据后调用close方法关闭写入流。
		

10. 完全分布式搭建

		1) JDK (前面已经安装好了)
		2) Linux(前面已经安装好了)
		3) 准备至少 3 台机器(通过克隆虚拟机;配置好网络 JDK 时间hosts,保证节点间能互 ping 通)
		4) 时间同步 (ntpdate time.nist.gov)
		5) ssh 免秘钥登录 (两两互通免秘钥)
		<h3>10-1. 完全分布式搭建</h3>
		1) 下载解压缩 Hadoop
		2) 配置etc/hadoop/hadoop-env.sh(JDK)
			1. export JAVA_HOME=/usr/java/latest

	3) core-site.xml
			<property>
				<name>fs.defaultFS</name>
				<value>hdfs://node01:9000</value>
			</property>
			<property>
				<name>hadoop.tmp.dir</name>
				<value>/opt/hadoop-2.5.1</value>
			</property>



	4) hdfs-site.xml
			<property>
				 <name>dfs.replication</name>
				 <value>1</value>
			</property>
			<property>
				 <name>dfs.namenode.secondary.http-address</name>
				 <value>node02:50090</value>
				 </property>
			<property>
				 <name>dfs.namenode.secondary.https-address</name>
				 <value>node02:50091</value>
			</property>



	5)Masters: master 可以做主备的 SNN 
		1. 在/home/hadoop-2.6.5/etc/hadoop/新建 masters 文件 写上 SNN 节点名: node2

	6) 6、Slaves: slave 奴隶 苦干;拼命工作 
		1. 在/home/hadoop-2.5.1/etc/hadoop/slaves 文件中填写 DN 节点名:node2 node3 node4 [注意:每行写一个 写成 3 行]
	7)最后将配置好的 Hadoop 通过 SCP 命令发送都其他节点配置 Hadoop 的环境变量
	8) vi ~/.bash_profile
		1. export HADOOP_HOME/home/hadoop-2.6.5
		2. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
	9) 记得一定要 source ~/.bash_profile
	10) 回到跟目录下对 NN 进行格式化 hdfs namenode -format
	11) 启动 HDFS: start-dfs.sh 
	12) 关闭防火墙:service iptables stop
	在浏览器输入 node1:50070 出现界面成功
		

11. API

import pyhdfs
# https://pypi.org/project/PyHDFS/
# 读取 hdfs 上文件的文件内容
def read_hdfs_file():
	 fs = pyhdfs.HdfsClient(hosts='node01')
	 f = fs.open('/Jackie/in/qq.txt')
	 lines = f.readline()
	 print(lines.decode("utf-8", 'ignore'))
	 f.close
'''在 pyhdfs 中 删除了 upload()的方法'''
def upload():
	fs=pyhdfs.HdfsClient(hosts='node01')
	f=fs.copy_from_local('D://PycharmProjects//TestPy//temp//text1','/Jackie/text')

'''在 pyhdfs 中 删除了 download()的方法'''
def download():
	 fs = pyhdfs.HdfsClient(hosts='node01')
	 fs.copy_to_local('/Jackie/text','D://PycharmProjects//TestPy//temp//text2')

# 创建文件夹目录
def mkdir_hdfs_dir(mk):
	 fs = pyhdfs.HdfsClient(hosts='node01')
	 fs.mkdirs(mk)
	 print('创建文件夹目录成功')

# 删除文件夹操作
def dele_hdfs_dir(mk):
	 fs = pyhdfs.HdfsClient(hosts='node01')
	 ex = fs.exists(mk)
	 print('文件目录是否存在: ',ex)
	 if ex == True:
	 fs.delete(mk)
	 print('删除文件夹目录成功')
	 else:
	 fs.mkdirs(mk)
	 print('文件夹目录不存在 ,创建成功')

# 查看详细信息
def liststatus(mk):
	 fs = pyhdfs.HdfsClient(hosts='node01')
	 status = fs.get_file_status(mk)
	 print(status)
	 print(status.owner)
	 print(status.get('accessTime'),status.get('blockSize'),status.get('group'))
	 # 查看目录
	 print(fs.listdir('/Jackie'))
	 read_hdfs_file()
	# mkdir_hdfs_dir('/jj/jackie')
	# dele_hdfs_dir('/jj/jackie')
	# liststatus('/Jackie/in/qq.txt')
	# upload()
	# download()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值