需求:我要存大量数据
    方法一、普通的单台主机 不能满足数量
    方法二、多个移动硬盘 缺乏便携性
    方法三、多台主机 缺乏安全性
    解决办法:将多个主机联系在一块,一个数据放在不同的主机上放一份,缺点是数据量过大,
    再修改:将一份数据切分成若干块,每份数据放在不同的主机上
    在修改:每个数据块复制若干份,放在不同的主机上,确保两台主机的数据块可以合并为一个完整的数据

    现在出现两个问题,一份数据怎么切分最合适?
    数据块的副本有几个合适?
    在hadoop中,默认一份数据按照128m切分,数据块的复制体默认为3

    1. HDFS中平均磁盘寻址时间大概为10ms;
      2. 经过测试发现,寻址时间为传输时间的1%时,为最佳状态;
      所以最佳传输时间为10ms/0.01=1000ms=1s
      3. 目前磁盘的传输速率普遍为100MB/s , 网卡普遍为千兆网卡传输速率普遍也是125MB/s;
      计算出最佳block大小:125MB/s x 1s = 125MB
      每64K还需要校验一次,因此块大小,必须为2的n次方
      假设磁盘容量一个g,1g=128m*8 最近接125m的就是128m 所以设定block为128MB

    副本数为什么是3呢
    假设只有两个副本,那么只要其中一个副本有异常,在核查数据时发现两个副本不一致,
    那么主节点就会陷入混乱,如果有四个副本也是一样,两两一队,所以最少的,最安全的就是3
    那这三个副本该怎么存放呢(公司肯定有机架)
    第一个肯定要放在有客户端的机架上,
    第二个要放在和第一个不同的机架上(第二个机架)
    第三个要放在第一个机架不同主机上,这样只要有一个机架能运行,数据就会取出

    现在存储的基本思路已经有了,又发生了一个问题:
    数据量过大时,怎么查找或管理这些文件呢?
    假设20台主机分布在2个机架上,存文件时需要手动记下,去的时候也是,
    这样会带来很大的不方便,需要设计一个程序来替代人工
    联想到职场的架构,一个部门有一个老大,n个手下,老大有任务时会告诉某某手下,
    手下去执行任务,自己执行完后,有需要其他同事处理时,会将任务和材料给到其他人

    现在按照这个模式设计出一个程序,名字就是:
    分布式文件系统:
    namenode(主节点)=管理者:
    ①整个集群中唯一的
    ②管理着各个从节点的元数据(数据块的位置,ip地址 磁盘容量 磁盘使用情况等等)
    ③管理着从节点的状态(每隔一定时间接受DataNode状态进行判断)
    ④接受客户端文件操作的请求
    datanode(从节点) =执行者:
    ①集群存放数据块的节点,多个
    ②定期上报datanode中的存储的block的信息
    ③定期向namenode发送心跳(3s),告知datanode(ip 磁盘容量),如果超过10分钟,无心跳,则认为NameNode死亡

    现在整个程序智能起来了,此时出现了一个不方便的问题:
    我要存文件时,每次都要跑到机房去,又累又麻烦,机制的程序员设计了一个能在自己工位上就能操作的客户端
    hadoop自带的客户端就是使用命令行,不同的程序员设计了不同的客户端,写Java的就可以通过Java连接hdfs
    并且操作,pyhon也一样
    第二天我要存一个文件,发现过程设计的非常巧妙:
    1我通过客户端去存文件,客户端先向集群的老大namenode申请
    2namenode回应同意写入文件
    3客户端向namenode询问要写入那个datanode
    4namenode返回相应datanode信息
    5客户端先跟第一台要写入的datanode节点建立连接,铺开管道
    6第一台收到要写入的信息后,会跟第二台,第三台等等铺管道
    7客户端把数据给到第一台,第一台留下相应的数据块后,向着下一个目标传送
    8传输完成后,第一台DataNode告知客户端:所有数据块都已完成
    9客户端接到消息,告知namenode整个文件已经写入完成

    第三天我要取一个文件,发现比写入还要简单:
    1客户端去问namenode要取的文件在哪里
    2namenode向客户端返回相应的DataNode
    3客户端找到数据块相应的DataNode获取数据块
    4DataNode返回相应的数据块
    5客户端就可以拿着这些数据存入到本地文件了

    几天后的早晨,我再次打开hdfs的主页hadoop10:9870
    发现上传文件时报错了, NameNode 正处于 SafeMode 状态
    翻译后发现 安全模式只接受读数据请求(ls、cat),而不接受上传、删除、修改等变更请求。
    百度下查到有三种情况会进到安全模式:
    1hdfs集群正常启动
    集群启动时
    2block丢失率大道0.1%
    3主动进入安全模式