美文网首页
Hadoop重新格式化HDFS的方法

Hadoop重新格式化HDFS的方法

作者: 鹅鹅鹅_ | 来源:发表于2019-01-01 11:42 被阅读0次

    一、记一次“不合格”的方法


    这种方法也是网上参考博客得来的,一开始就觉得有问题,后来真的发现了问题。

    • 首先停止已经启动的hadoop:
    [hadoop@localhost ~]$ stop-all.sh 
    
    • 然后查看hadoop配置文件hdfs-site.xml,确定dfs.name.dir、dfs.data.dir以及Hadoop.tmp.dir所指定的目录,并将其删除。我的hadoop配置的目录都在${HADOOP_HOME}/tmp目录下,故将此目录删除就可以了:
    [hadoop@localhost ~]$ rm -rf tmp
    
    • 最后重新执行hadoop格式化HDFS的命令:
    [hadoop@localhost ~]$ hadoop namenode -format
    
    • 格式化完成后,启动hadoop,并验证是否格式化成功:
    #启动hadoop
    [hadoop@localhost ~]$ start-all.sh 
    #在hadoop文件系统中新建一个测试目录
    [hadoop@localhost ~]$ hdfs dfs -mkdir /test
    #分别在master和slave节点上查看新建的test目录,发现目录都可以查看到
    [hadoop@localhost ~]$ hdfs dfs -ls /
    Found 1 items
    drwxr-xr-x   - hadoop supergroup          0 2017-03-19 14:19 /test
    

    显然,在HDFS文件系统中新建的test目录在mater和slave节点中都可以查看的到,但是,这就说明重新格式化成功了吗?

    • 存在的问题
      当我在slave节点执行jps时,发现datenode进程不存在!
    [hadoop@localhost ~]$ jps
    22533 Jps
    22369 NodeManager
    

    二、问题产生的原因及修正方法


    在网上查资料发现,问题产生的原因是重新格式化HDFS时,只删除了master节点上的指定目录,但是没有删除slaves节点上的相应目录。
    当我们执行文件系统格式化时,会在namenode数据文件夹(即配置文件中dfs.name.dir在本地系统的路径)中保存一个current/VERSION文件,记录namespaceID,标识了所格式化的 namenode的版本。如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的id不一致。

    • 我们来看master节的namespaceId:
    [hadoop@localhost ~]$ cat tmp/dfs/name/current/VERSION 
    #Sun Mar 19 14:13:51 CST 2017
    namespaceID=901261394
    clusterID=CID-5f83be8b-32e9-46ec-818c-404bd6dae38a
    cTime=0
    storageType=NAME_NODE
    blockpoolID=BP-358141862-10.10.18.236-1489904031006
    layoutVersion=-63
    
    • 再来看slave节点的ID:
    [hadoop@localhost ~]$ cat tmp/dfs/data/current/VERSION 
    #Sun Mar 19 14:08:39 CST 2017
    storageID=DS-91139d5d-43a0-4f9f-b523-8c4c8172f96c
    clusterID=CID-9a1fa32b-018a-4466-af12-366444622470
    cTime=0
    datanodeUuid=b492e32e-a90e-4bab-84b0-ee4b4092b1d0
    storageType=DATA_NODE
    layoutVersion=-56
    

    并没有在slave节点中发现namespaceID,不过master和slave都有clusterID,我尝试将slave节点中的clusterID改为和master的clusterID一致,然后重启hadoop,发现正常了:

    [hadoop@localhost ~]$ hdfs dfs -ls /
    Found 1 items
    drwxr-xr-x   - hadoop supergroup          0 2017-03-19 14:19 /test
    

    三、总结


    • 总结:重新格式化集群HDFS的正确方法是将集群中相应的目录都删除,然后执行格式化命令。
      1、重新格式化意味着集群的数据会被全部删除,格式化前需考虑数据备份或转移问题;
      2、先删除主节点(即namenode节点),Hadoop的临时存储目录tmp、namenode存储永久性元数据目录dfs/name、Hadoop系统日志文件目录log 中的内容 (注意是删除目录下的内容不是目录);
      3、删除所有数据节点(即datanode节点) ,Hadoop的临时存储目录tmp、namenode存储永久性元数据目录dfs/name、Hadoop系统日志文件目录log 中的内容;
      4、格式化一个新的分布式文件系统:
    hadoop namenode -format  
    

    相关文章

      网友评论

          本文标题:Hadoop重新格式化HDFS的方法

          本文链接:https://www.haomeiwen.com/subject/xulnlqtx.html