目录
Hadoop第0部分:分布式存储计算平台及Hadoop入门
Hadoop第一部分:HDFS的构架和使用
Hadoop第二部分:MapReudce(一)
Hadoop第二部分:MapReudce(二)
Hadoop第二部分:MapReudce(三)
构架
1.主从架构
- 主从架构
- Namenode
- 接受客户端请求
- 管理:从节点、数据
- 维护内存中的元数据
- DataNode
- 真正的读写操作,与文件系统
2、读写流程
写的流程
- 用户操作客户端提交写文件请求给Namenode,NameNode接受写请求
- hdfs dfs -put /export/datas/wordcount.txt /wordcount/input
- 检测源和目标是存在
- 客户端将文件进行拆分,首先提交第一个块的请求给NameNode
- 主要请求Namenode将数据到底写在什么位置
- NameNode根据所有DataNode的存活【live】以及活跃性【心跳不正常,但是没达到隔离的条件】以及每台DataNode存储的空间,来选择该块存储的位置,返回对应的DataNode的地址【三个副本的存储地址】
- live nodes:正常的 节点
- Decommissioning Nodes :被隔离的节点
- dead node:没有心跳的节点
- 客户端拿到该块的三个地址,通过机架感知【自动计算客户端到达每个地址的网络路由】,选举最近的地址,然后将块提交给最近的DataNode
- 客户端会与该DataNode构建通信管道【pipeline】,将数据从本地读取到缓存中,然后划分每个package发送给第一个DataNode,该DataNode收到每一个package,就返回一个ack确认
- 第一个地址会接收到客户端写入的数据块会与第二个地址构建数据通道【pipeline】,客户端的每个package,会通过第一个地址的管道给第二个地址,第二个地址与第三个地址构建通道,将package发送给第三个地址
- 第三个地址的ack返回给第二个地址,第二个地址将ack返回给第一个地址,第一个地址将整体的三分的ack返回给客户端
- 以此往复发送每个package,直到整个块的数据全部发完
- 重复第二个步骤,请求下一个块
- 整个所有数据块写完,客户端提交给Namenode结果,Namenode记录元数据
读的流程
- 客户端提交读文件请求给NameNode
- Namenode查询元数据,返回该文件对应的所有块的地址给客户端
- 客户端根据机架感知来获取每个块离自己最近的位置
- 连接所有块的dataNode获取每个块的数据
- 将所有块进行合并,发回给用户
HDFS的客户端操作
1、启动方式
-
第一种方式:单进程启动 【用的比较少】
-
比较麻烦,每个进程需要执行一条命令,适合于特殊进程的启动
sbin/hadoop-daemon.sh:用于启动hdfs的进程 #namenode sbin/hadoop-daemon.sh start namenode #datanode sbin/hadoop-daemon.sh start datanode #secondarynamenode sbin/hadoop-daemon.sh start secondarynamenode
- 如果遇到报错:no main class
- 进程名称写错了
- 例如:start datenode
- 如果遇到报错:no main class
-
sbin/yarn-daemon.sh:用于启动yarn的进程
#resourcemanager sbin/yarn-daemon.sh start resourcemanager #nodemanager sbin/yarn-daemon.sh start nodemanager
-
mr-jobhistory-daemon.sh:MapReduce的一个监控程序的进程
-
-
第二种方式:分类别启动 【最常用的 方式,一般会结合第一种方式使用】
- dfs:start-dfs.sh stop-dfs.sh
- yarn:start-yarn.sh stop-yarn.sh
-
第三种方式:启动所有进程【不推荐使用,一般不用】
- 启动和关闭所有hdfs以及yarn的进程的
- sbin/start-all.sh
- sbin/stop-all.sh
2.基本文件操作
-
HDFS的客户端命令:hdfs
-
用法:Usage: hdfs [–config confdir] COMMAND
- 以前老版本的hadoop0或者hadoop1,hdfs和yarn是没有独立的客户端的
- 客户端:hadoop
- hadoop jar xx.jar = yarn jar xxx.jar
- hadoop fs -rm -r = hdfs dfs -rm -r
-
上传:本地文件系统到HDFS
-
put、copyfromlocal
hdfs dfs -put /export/datas/wordcount.txt /wordcount/input/
-
-
下载:hdfs到本地文件系统
-
get、copytolocal
hdfs dfs -get /wordcount/input/wordcount.txt ~/
-
-
查看:cat
hdfs dfs -cat /wordcount/output1/part-r-00000
-
列举:ls
#如果使用hdfs客户端命令操作,就是操作hdfs hdfs dfs -ls / #如果直接使用命令,就在操作linux ls /
-
删除:rm
hdfs dfs -rm -r /wordcount/output1 #回收站的清除时间:7天 <property> <name>fs.trash.interval</name> <value>10080</value> </property> hdfs dfs -rm -skipTrash /wordcount/input/wordcount.txt
-
复制:cp
hdfs dfs -cp /wordcount/input/wordcount.txt /tmp/
-
剪切:mv
hdfs dfs -cp /tmp/wordcount.txt /wordcount/
-
创建目录:mkdir
hdfs dfs -mkdir -p /hdfs/client
-
改权限:chmod
hdfs dfs -chmod 777 /tmp
-
手动清空回收站
hdfs dfs -expunge
-
HDFS相对路径:当前用户在hdfs上的家目录
hdfs dfs -ls = hdfs dfs -ls /user/root
3.管理操作
-
namenode -format:用于第一次启动hdfs之前才需要格式化
- 会初始化整个集群的信息
- 集群id
- 元数据文件
- NameNode启动时会读取元数据文件中的元数据加载到内存
- 会初始化整个集群的信息
-
dfsadmin:hdfs的管理员操作命令
-
report:汇报,可以打印集群当前的状态信息
-
safemode:安全模式
-
refreshNodes:刷新节点信息
- 当需要添加一个节点的时候,需要手动刷新,重新读取slaves文件
- 如何不停机加机器
- 准备一台机器,环境与所有机器一致
- 拷贝一份hadoop到新机器上,要删除hadoopDatas中所有内容
- 修改所有机器的slaves文件,添加这台机器的地址
- 添加配置: dfs.hosts = /export/dfs/dn.txt
- 将新机器的主机名放入写入该配置的文件
- 执行刷新节点,namenode允许注册
- 启动新机器的datanode
- 如何不停机隔离机器
- 将机器的地址写入该配置的文件中:dfs.hosts.exclude
- 被指定的机器会变成decommissioning状态
-
-setQuota:限制某个目录下文件的个数
#配置/wordcount这个目录下最多允许存放2个文件,如果设置为N,最大个数为N-1 hdfs dfs -setQuota 3 /wordcount
-
-clrQuota:取消文件个数限制
hdfs dfs -clrQuota /wordcount
-
-setSpaceQuota:设置该目录下最多允许存放的数据的大小
-
这个值最小为:384M
-
最小值 = 该目录下块的个数 * 3[副本]*128
-
如果要存一个200M的文件:最小设置768才能存下
-
-