zoukankan      html  css  js  c++  java
  • HDFS

    网络拓扑:参考:http://blog.csdn.net/lastsweetop/article/details/9065667

     分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群。机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。

     在Hadoop中把网络看做一个树,两个节点之间的距离是它们到最近的共同祖先的距离总和。该树中的层次是没有预先设定的,但是对于数据中心、机架和正在运行的节点通常可以设定等级的。

    distance(/D1/R1/H1,/D1/R1/H1)=0  同一节点中的进程(相同的datanode)
    distance(/D1/R1/H1,/D1/R1/H2)=2  同一机架上的不同节点(同一rack下的不同datanode)
    distance(/D1/R1/H1,/D1/R1/H4)=4  同一数据中心中不同机架上的节点(同一IDC下的不同datanode)
    distance(/D1/R1/H1,/D2/R3/H7)=6  不同数据中心中的节点(不同IDC下的datanode)

    Hadoop无法自行定义网络拓扑结构,它需要我们能够理解并辅助定义。(如果网络是平铺的(仅有单一层次),可以不需要进行配置)。

    Hadoop Rack Awareness

    The HDFS and the Map/Reduce components are rack-aware.

    The NameNode and the JobTracker obtains the       rack id of the slaves in the cluster by invoking an API        resolve in an administrator configured      module. The API resolves the slave's DNS name (also IP address) to a       rack id. What module to use can be configured using the configuration      item topology.node.switch.mapping.impl. The default       implementation of the same runs a script/command configured using        topology.script.file.name. If topology.script.file.name is      not set, the rack id /default-rack is returned for any       passed IP address. The additional configuration in the Map/Reduce      part is mapred.cache.task.levels which determines the number      of levels (in the network topology) of caches. So, for example, if it is      the default value of 2, two levels of caches will be constructed -       one for hosts (host -> task mapping) and another for racks       (rack -> task mapping).

    副本存放:

    namenode节点选择一个datanode节点去存储block副本得过程就叫做副本存放,这个过程的策略其实就是在可靠性和读写带宽间得权衡。

    那么我们来看两个极端现象:

    1.把所有的副本存放在同一个节点上,写带宽是保证了,但是这个可靠性是完全假的,一旦这个节点挂掉,数据就全没了,而且跨机架的读带宽也很低。
    2.所有副本打散在不同的节点上,可靠性提高了,但是带宽有成了问题。
    我们来讲下hadoop默认的方案:
    1.把第一副本放在和客户端同一个节点上,如果客户端不在集群中,那么就会随即选一个节点存放。
    2.第二个副本会在和第一个副本不同的机架上随机选一个
    3.第三个副本会在第二个副本相同的机架上随机选一个不同的节点
    4.剩余的副本就完全随机节点了。
    如果重复因子是3的话,就会形成下图这样的网络拓扑:
    可以看出这个方案比较合理:
    1.可靠性:block存储在两个机架上
    2.写带宽:写操作仅仅穿过一个网络交换机
    3.读操作:选择其中得一个机架去读
    4.block分布在整个集群上。
    分析脚本:
    1. start-dfs.sh
    //
    NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -namenodes)
    echo "Starting namenodes on [$NAMENODES]"
    "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" 
      --config "$HADOOP_CONF_DIR" 
      --hostnames "$NAMENODES" 
      --script "$bin/hdfs" start namenode $nameStartOpt
    
    "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" 
        --config "$HADOOP_CONF_DIR" 
        --script "$bin/hdfs" start datanode $dataStartOpt
    
     "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" 
          --config "$HADOOP_CONF_DIR" 
          --hostnames "$SECONDARY_NAMENODES" 
          --script "$bin/hdfs" start secondarynamenode

    2.hadoop-daemon.sh

     nohup nice -n $HADOOP_NICENESS $hdfsScript --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &

    3.hdfs

    exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"

    运行脚本:
    启动GetConf,NameNode,DataNode,SecondaryNameNode四个类的main函数。

  • 相关阅读:
    0039. Combination Sum (M)
    imei和imsi
    APP网络测试要点和弱网模拟
    Git常用命令
    HTTP host头
    与apk签名有关的那些概念与命令
    你应该知道的运维术语
    nginx、fastCGI、php-fpm关系梳理
    adb连接手机报错解决方案汇总(win7)
    Android DVM
  • 原文地址:https://www.cnblogs.com/java-cjt/p/4524701.html
Copyright © 2011-2022 走看看