程序如何判断服务器在哪个机架上?

HDFS 默认对一个 block 有三个副本,第一个副本和第 2 、 3 副本存在在不同机架的服务器上,HDFS 是如何确定的呢?

HDFS 中的数据块分布是由数据节点管理器(Datanode Manager)和块复制步骤组成的。当一个块被创建时,块复制程序策略确定每个副本的位置。具体而言,副本分布是通过以下步骤实现的:

1.选择距离最远的机架来部署第一个复制副本,并复制该数据块。

2.选择另一个距离最远的机架来部署第二个复制副本,并复制数据块。

3.在同一机架中选择一个节点来部署第三个副本,并复制该数据块。

这种副本策略确保了数据块在磁盘损坏、节点故障或网络问题时的高可用性。它还能够增加 HDFS 集群的可扩展性和容错性,并有效地提高了数据读取和写入的速度。

  • 你可以参考下这篇文章:给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
  • 除此之外, 这篇博客: HDFS命令行操作中的 3.修改block大小 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 首先我们定义一个小文件:

    for i in `seq 100000`;do echo "hello world $i" >>test.txt;done
    

    然后在上传的时候设定block的大小:

    hdfs dfs -D dfs.blocksize=1048576 -put test.txt /user/root
    

    在这里插入图片描述我们去到“/var/software/hadoop/local/dfs/data/current/BP-269914864-192.168.16.111-1560277309858/current/finalized/subdir0/subdir0
    ”目录下查看:

    [root@node1 subdir0]# ll
    总用量 198256
    -rw-r--r-- 1 root root 134217728 612 16:52 blk_1073741825
    -rw-r--r-- 1 root root   1048583 612 16:52 blk_1073741825_1001.meta
    -rw-r--r-- 1 root root  65417541 612 16:52 blk_1073741826
    -rw-r--r-- 1 root root    511083 612 16:52 blk_1073741826_1002.meta
    -rw-r--r-- 1 root root   1048576 612 16:59 blk_1073741827
    -rw-r--r-- 1 root root      8199 612 16:59 blk_1073741827_1003.meta
    -rw-r--r-- 1 root root    740319 612 16:59 blk_1073741828
    -rw-r--r-- 1 root root      5791 612 16:59 blk_1073741828_1004.meta
    
    

    每个块旁边都有一个记录了元数据信息的小文件描述它,最重要的就是做验证用的MD5值。
    其它的诸如"hdfs dfs -ls",“hdfs dfs -cat”,“hdfs dfs -get” “-chmod” ,“-chown”等和Linux命令无异,举一反三,这里就过多赘述了。