1. 参数问题(core-site.xml)
io.file.buffer.size
#用来设置缓存的大小。不论是对硬盘或者是网络操作来讲,较大的缓存都可以提供更高的数据传输,但这也就意味着更大的内存消耗和延迟。这个参数要设置为系统页面大小的倍数,以byte为单位,默认值是4KB,一般情况下,可以设置为64KB(65536byte)在core-site.xml添加如下配置
<property>
<name>io.file.buffer.size</name>
<value>65535</value>
</property>
df.block.size
# block的大小一般设置为64M或128M(hadoop3.2.1默认的块大小是128M)如果修改的话在hdfs-site.xml中
<property>
<name>dfs.block.size</name>
<value>134217728</value> #修改为128M
<description>Block size</description>
</property>
#1.减少硬盘寻道时间
HDFS设计前提是支持大容量的流式数据操作,所以即使是一般的数据读写操作,涉及到的数据量都是比较大的。假如数据块设置过少,那需要读取的数据块就比较多,
由于数据块在硬盘上非连续存储,普通硬盘因为需要移动磁头,所以随机寻址较慢,读越多的数据块就增大了总的硬盘寻道时间。当硬盘寻道时间比io时间还要长的多时,那么硬盘寻道时间就成了系统的一个瓶颈。合适的块大小有助于减少硬盘寻道时间,提高系统吞吐量。
#2.减少Namenode内存消耗
对于HDFS,他只有一个Namenode节点,他的内存相对于Datanode来说,是极其有限的。然而,namenode需要在其内存FSImage文件中中记录在Datanode中的数据块信息,假如数据块大小设置过少,而需要维护的数据块信息就会过多,那Namenode的内存可能就会伤不起了。
为什么不能设置的过大
Map崩溃问题:系统需要重新启动,启动过程需要重新加载数据,数据块越大,数据加载时间越长,系统恢复过程越长
监管时间问题:主节点监管其他节点的情况,每个节点会周期性的把完成的工作和状态的更新报告回来。如果一个节点保持沉默超过一个预设的时间间隔,主节点记录下这个节点状态为死亡,并把分配给这个节点的数据发到别的节点。对于这个“预设的时间间隔”,这是从数据块的角度大概估算的。假如是对于64MB的数据块,我可以假设你10分钟之内无论如何也能解决了吧,超过10分钟也没反应,那就是死了。可对于640MB或是1G以上的数据,我应该要估算个多长的时间内?估算的时间短了,那就误判死亡了,分分钟更坏的情况是所有节点都会被判死亡。估算的时间长了,那等待的时间就过长了。所以对于过大的数据块,这个“预设的时间间隔”不好估算。
NameNode内存配置计算
NameNode 所需大小,与Block大小,HDFS副本数均有关,计算方式如下:
例:bolck为128M,副本为3个,10台机器,每台4TB数据,
Namenode需要的内存为:
10 * 4 * 1024 * 1024 MB / (128MB x 3)
2. hadoop中的指令
1.在hadoop解压目录的根目录下,查看集群节点
./hdfs dfsadmin -report
文件路径相关操作 #dir表示文件目录
# 创建文件夹 eg:bin/hadoop fs -mkdir /test
bin/hadoop fs -mkdir /dir
# 删除文件夹 eg:bin/hadoop fs -rmr /test
bin/hadoop fs -rmr /dir
bin/hadoop fs -rm -r /dir
# 查看目录文件信息 eg: bin/hadoop fs -ls /
bin/hadoop fs -ls /dir
# 递归查看文件信息 eg:bin/hadoop fs -ls -R /user
bin/hadoop fs -ls -R /dir
# 查看目录信息 eg:bin/hadoop fs -stat /user
bin/hadoop fs -stat /dir
查看空间大小
# 人性化显示文件大小 eg:bin/hadoop fs -du -h /
bin/hadoop fs -du -h /dir
# 显示目标文件file的大小 eg:bin/hadoop fs -du -/AGFS/YZRCB/ifp/QRCode/190528152839449/shopWithLogo/YZRCB_QR_1559028286687A3H
hdfs dfs -du /dir/path
文件操作
# 创建长度为0的空文件 eg: bin/hadoop fs -touchz /user/a.txt
bin/hadoop fs -touchz /dir/file
# 删除文件 eg:bin/hadoop fs -rm /user/a.txt
bin/hadoop fs -rm /dir/file
# 向hadoop中上传文件 eg:bin/hadoop fs -put aaa.txt /user/
bin/hadoop fs -put 本地file /dir/
# 下载文件到本地 eg: bin/hadoop fs -get /user/aaa.txt .
bin/hadoop fs -get /dir/file 本地目录
# 查看文件 eg:bin/hadoop fs -cat /user/aaa.txt
bin/hadoop fs -cat /dir/file
# 如果文件是文本格式,相当于cat,如果文件是压缩格式,则会先解压,再查看 eg:bin/hadoop fs -text /user/aaa.txt
bin/hadoop fs -text /dir/file
# 从本地拷贝文件到hadoop系统 eg:bin/hadoop fs -copyFromLocal logs/ /user
bin/hadoop fs -copyFromLocal 本地文件 /hadoop目录
# 从hdfs拷贝到本地 eg:bin/hadoop fs -copyToLocal /user/aaa.txt .
bin/hadoop fs -copyToLocal /hadoop文件目录 本地目录
# 移动文件 eg:bin/hadoop fs -mv /user/aaa.txt /test/aaa.txt
bin/hadoop fs -mv 原目录 目标目录
#将hadoop上某个文件重命名 eg:bin/hadoop fs –mv /user/test.txt /user/ok.txt
bin/hadoop fs –mv /dir/oldFile /dir/newFile