1.文件目录分析
通过50070端口,我们发现一个文件的块大小128M:
那么,这个文件具体位置在哪呢?找到dfs
的配置datanode
目录。
[hadoop@hadoop2 current]$ pwd
/home/hadoop/hadoop-current/tmp/dfs/dn/current
[hadoop@hadoop2 current]$ ls
BP-864899108-10.179.25.59-1553789556161 VERSION
VERSION
显示了当前使用了哪个集群,namenode
和datanode
的VERSION
是一样的,不一样表示不是同一个集群:
[hadoop@hadoop2 current]$ cat VERSION
#Fri May 03 23:11:50 CST 2019
storageID=DS-47ee88ba-ea07-4585-b5e8-c7bc336dc929
clusterID=CID-c508fc32-0eea-481e-9f34-c97e018f21bb
cTime=0
datanodeUuid=966ba8b9-dcde-434b-aade-484616d90cb7
storageType=DATA_NODE
layoutVersion=-56
BP-864899108-10.179.25.59-1553789556161
,其中的ip
显示的namenode
的ip
参考:https://blog.csdn.net/qq_26442553/article/details/79117897
虽然HDFS以block块存储,对于大文件会被切分成很多以块大小的分块进行存储,但是如果文件小于HDFS的块大小,那么该文件的存储不会占用整个块的空间。比如一个10MB的文件,存储虽然在一个128MB的块上,但是该文件实际只用了10MB的空间,而不是128MB的空间。
128M
的文件快,namenode
会为他创建一个元数据
信息,这个信息也是要占空间的,存在namenode内存
当中(元数据信息不占用块)。在内存中是否有风险呢?使用SecondNameNode
和 HA
来解决的。
以前是时候用SecondNameNode
,现在是使用HA
、federation
来解决的。
TFS参考小文件处理方式。
【HDFS节点】
- 【namenode】
管理元数据
文件属性
名称
位置
权限
数据块
元数据存储在namenode内存中,在本地也有备份,fsimage镜像文件
namenode在启动的时候会去读取加载fsimage的镜像文件
edits为编辑日志文件,用于记录用户对hdfs的所有行为操作
namenode在启动的时候还会去读取加载edits文件
edits越来越大,考虑将fsimage和edits合并
SecondNameNode进行合并,功能:
合并文件
减少下一次namenode启动时间
namenode在重新启动之后会读取新的合并的文件。生成新的fsimage镜像文件和edits文件,
原来的初始化的两个文件就没有用了。
【常见问题】
- 【clusterID】
[hadoop@cluster-host1 dfs]$ cat nn/current/VERSION clusterID=CID-ca06691a-2bf4-46a9-93aa-1fc2bf0f9ec3
集群id不一致,修改VERSION即可,以namenode为准;(或重新格式化)[hadoop@cluster-host2 dfs]$ cat dn/current/VERSION clusterID=CID-ca06691a-2bf4-46a9-93aa-1fc2bf0f9ec3
2.历史服务
1.MapReduce historyService
按以下两个步骤执行
【MapReduce historyService】历史服务器
- 查看已经运行完成的应用记录
修改mapred-site.xml
指定historyService的地址,内部和WEB的通信端口号,如果不指定默认是本机。
history是一个轻量级的服务,可以部署在任意一台节点上。
用于查询每个job运行完以后的历史日志信息,是作为一台单独的服务器运行的。可以在namenode或者datanode上的任意一台启动即可。(端口最好默认)
在mapred-site.xml
中配置mapreduce.jobhistory.address
和mapreduce.jobhistory.webapp.address
即可。
vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
</configuration>
2. 日志聚合
在yarn集群上运行作业的时候,日志聚合是没有运行的。只有当整个作业完成的时候,才能将各个node上的日志上传到hadoop上。而且默认会删除本节点的日志删除,所以你无法从yarn的web查找日志了。
没有配历史日志,从application
点进history
时,就会报错。
要实现日志聚集,只需要在yarn-site.xml
中配置如下参数:
vim yarn-site.xml
<!-- 日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>600000</value>
</property>
将其分发其他机器。
scp {mapred-site.xml,yarn-site.xml} hadoop2:/home/hadoop/hadoop-current/etc/hadoop/
启动历史日志功能:
[hadoop@hadoop1 sbin]$ ./mr-jobhistory-daemon.sh start historyserver
jps查看已经启动。(不配历史服务时,重启yarn,8088页面的application会被清空)
日志文件存储目录默认在哪呢?/tmp/log
测试环境修改/tmp目录权限
hadoop fs -chmod -R 777 /tmp
目录:
/tmp/logs/hadoop/logs
/tmp/hadoop-yarn/staging/history/done/2019/05/23
注:关于目录权限,也可以配置HDFS用户权限来设置。如默认用户dr.who
<property> <name>dfs.permissions.enabled</name> <value>false</value>
</property>
<property> <name>hadoop.http.staticuser.user</name> <value>yuorname</value>
</property>
