副本和块大小设置

块大小的默认值:128M,dfs.blocksize
块大小最小值默认值:1  Mdfs.namenode.fs-limits.min-block-size
块大小最小值约束:必须是512整倍数。

hdfs写入过程

DFSPacket:chunk(原生数据512 + 校验和4)
最多的126chunk数量。

//设置多少字节进行一次校验。
io.bytes.per.checksum=512

压缩

DefaultCodec
DeflateCodec
Bzip2(切割,MapReduce)
gzip
LZO
lz4
snappy

lz4 < lzo < .... Bzip2

SequenceFile

二进制。
key-value
没有按key排序。
sort() 产生新seq文件
可切割.
同步点。
sync(3456) ;        //
支持压缩        //1:None 2:record(value) 3:block(全压缩)

Writable

out.write(in) ;

har命令实现归档

大量小文件,占用大量的NN的资源。
每个文件大概占用NN的 <=> 150字节
$>hadoop archive -archiveName my.har -p /user/centos /user/out

DFSPacket创建剖析

//
DFSOutputStream.computePacketChunkSize(dfsClient.getConf().writePacketSize, bytesPerChecksum){

}

DFSOutputStream.computePacketChunkSize(int psize, int csize){
    //给packetSize赋值
    final int bodySize = psize - PacketHeader.PKT_MAX_HEADER_LEN;
    //
    final int chunkSize = csize + getChecksumSize();//512 + 4
    chunksPerPacket = Math.max(bodySize/chunkSize, 1);
    //
    DFSOutputStream.packetSize = chunkSize*chunksPerPacket;//126 * 512
}

DFSOutputStream.writeChunkImpl(packetSize,);
    --> DFSOutputStream.createPacket(packetSize,);

xml

extended markup language,可扩展编辑语言。
<?xml version="1.0"?>
<configuration>
    <property>
        <name>ds.defaultFS</name>
        <value>hdfs://s201:8020</value>
    </property>
    <property>
        <name>ds.defaultFS</name>
        <value>hdfs://s201:8020</value>
    </property>
</configuration>

MapFile

对SeqFile的组合运用,key必须按key写入。否则异常。
生成一个目录,内含index和data两个文件。
此两个文件均是SequenceFile。
index文件是key -> 同步点的映射。
data文件就是key-value映射。
查找速度快。

修改hadoop.tmp.dir属性

1.停止hadoop集群
2.修改文件
    [core-site.xml]
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/centos/hadoop/full</value>
    </property>
3.分发文件
    $>cd /soft/hadoop/etc/hadoop
    $>xsync.sh core-site.xml

4.删除所有主机/home/centos/hadoop/full和hadoop的日志
    $>xcall.sh "rm -rf /home/centos/hadoop/full/*"
    $>xcall.sh "rm -rf /soft/hadoop/logs/*"

5.重新格式化文件系统
    $>hadoop namenode -format 

6.启动hadoop集群。
    $>start-dfs.sh

修改linux提示符

[/etc/profile]
...
export PS1='[\u@\h `pwd`]\$'
...

名称节点

[文件]
[镜像文件]
 /home/centos/hadoop/full/dfs/name/current/fsimage_0000000000000000002

 [编辑日志]
 /home/centos/hadoop/full/dfs/name/current/edits_0000000000000000001-0000000000000000002

hdfs oiv命令查看fsimage镜像文件 hdfs oiv

镜像文件中存放的元数据,目录、权限、时间、副本数、块大小、上下级关系。
每个目录或者文件都对应一个节点(inode)。

//查看镜像文件
//offline image viewer
$>hdfs oiv -i fsimage_0000000000000000002 -o 1.xml -p XML  //-p,processor处理器,用于指定使用哪种image处理器,此处使用XML.
    //i:inputFile,  o:outputFile
//查看编辑日志
//编辑日志存放时对hdfs的操作过程.都有操作编号(txid);
//offline edit viewer
$>hdfs oev -i edits_0000000000000000001-0000000000000000002 -o 2.xml -p XML

High HA :

名称节点配置多个存放目录

保证安全性。最好放在不同的磁盘下
每个目录都是一个备份。
写入数据时,同时向所有目录写入数据。
[hdfs-site.xml]
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/dfs/name2</value>
</property>

在名称节点上配置后要进行分发,所有数据节点上都使用。

数据节点配置多个存放目录

保证安全性。
多个目录是为了扩容。
[hdfs-site.xml]

dfs.datanode.data.dir file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2

在使用中都需对/home/centos/hadoop/full/* 进行清理,然后清楚日志,最后进行格式化(hadooop namenode -format).

RAID

磁盘冗余阵列.
Redundant Array of Independent Disks

阈值

阀值

名称和辅助名称名称节点对检查点的控制

1.2nn请求nn滚动日志
    nn会创建新的edit(/edits_inprogress_0000000000000000003)
2.2nn复制nn的fsimag_x + edit_x + 1)
3.2nn在本地进行merge(合并),产生新的检查点文件(镜像文件。)
4.2nn回传检查点文件给nn
5.nn上对检查点文件进行重命名,fsimage_xxx

6.2nn每隔一小时(fs.checkpoint.period)创建检查点,如果编辑日志大小达到64M,也可以创建检查点。 
  2nn每隔5分钟检查编辑日志大小。
    [hdfs-site.xml]
    <property>
        <name>dfs.namenode.checkpoint.period</name>
        <value>3600</value>
        <description>The number of seconds between two periodic checkpoints.
        </description>
    </property>

    [hdfs-site.xml]
    <property>
        <!-- 如果操作的动作达到了1000000,不论是否到达一小时,都会创建检查点。 -->
        <name>dfs.namenode.checkpoint.txns</name>
        <value>1000000</value>
        <description>The Secondary NameNode or CheckpointNode will create a checkpoint
        of the namespace every 'dfs.namenode.checkpoint.txns' transactions, regardless
        of whether 'dfs.namenode.checkpoint.period' has expired.
        </description>
    </property>
    <!-- 2nn每隔60秒检查动作次数。 -->
    <property>
        <name>dfs.namenode.checkpoint.check.period</name>
        <value>60</value>
        <description>The SecondaryNameNode and CheckpointNode will poll the NameNode
        every 'dfs.namenode.checkpoint.check.period' seconds to query the number
        of uncheckpointed transactions.
        </description>
    </property>
    <!-- 控制保留检查点文件的个数。 fsimage的个数-->
    <property>
        <name>dfs.namenode.num.checkpoints.retained</name>
        <value>2</value>
    </property>

metasave

帮助命令 hdfs dfsadmin -help metasave
保存名称节点的元数据信息到日志所在目录下.
$>cd /soft/hadoop/logs
$>hdfs dfsadmin -metasave x.log

手动滚动编辑日志

$>hdfs dfsadmin                     //查看dfsadmin的所有命令
$>hdfs dfsadmin  -help rollEdits    //查看指定命令的帮助
$>hdfs dfsadmin  -rollEdits

手动保存名字空间

保存镜像文件。 
$>hdfs dfsadmin -saveNamespace      //在NN的本地目录完成镜像文件的保存。

安全模式

hdfs系统的一种状态,该状态不能写操作。
集群启动时,首先进入安全模式,启动完成退出安全模式。
$>hdfs dfsadmin -safemode get           //查看安全模式状态
$>hdfs dfsadmin -safemode enter         //进入安全模式状态
$>hdfs dfsadmin -safemode leave         //离开安全模式状态
$>hdfs dfsadmin -safemode wait          //等待安全模式状态,阻塞状态,离开安全模式后,继续执行。