0

我想尝试实现我从 IEEE“虚拟云中的位置感知 MapReduce”获得的这篇论文工作。这里总结一下:8台物理机,每台机器包含4台虚拟机,每台VM安装hadoop hdfs。假设我们有一个包含 p 台物理机的集群,每台都有一个硬盘,副本数为 3。那么 n 个文件块从集群外的另一台计算机放入集群或在集群中随机生成。该模型是关于具有一定数据模式的数据模式生成和任务模式生成。每个块都有相同的概率被放置在托管相同数量虚拟机的物理机上。可能会出现数据模式,使用 hadoop 策略,文件块副本所有堆栈在一台物理机器上,因为 hadoop 的策略数据分配是随机的。 http://imageshack.us/photo/my-images/42/allstack.png/

建议的策略是循环分配和蛇形分配,理论上是这样的:http: //imageshack.us/photo/my-images/43/proposed.png/

如何让hadoop知道一些虚拟机在一台物理机器上?

使hadoop不将文件块的第二个和第三个副本复制到同一物理机上的虚拟机上???我问过如何实现这样的,并得到答复,它使用机架感知配置。但我仍然感到困惑,需要更多关于此的参考。

我如何跟踪这些数据,那些文件块复制均匀分布在物理机器上,确保在一台物理机器上没有文件块副本全部堆栈?确定我是否按照机架意识进行配置,文件块副本均匀分布在物理机上吗?

4

1 回答 1

0

假设:我们知道哪个虚拟机是在哪个物理机上创建的。

这种假设在公共云环境中不成立。因此,下面描述的解决方案不能在那里工作。下面描述的解决方案将在私有云中工作

实施机架感知包括 2 个步骤

  1. core-site.xml 中的设置脚本文件名

     <property>
          <name>topology.script.file.name</name>
          <value>core/rack-awareness.sh</value>
     </property>
    
  2. 实现脚本

    一个示例 rack-awareness.sh 可以如下所示

    HADOOP_CONF=/etc/hadoop/conf
    while [ $# -gt 0 ] ; do
      nodeArg=$1
      exec< ${HADOOP_CONF}/cluster.data
      result=”" 
      while read line ; do
         ar=( $line ) 
         if [ "${ar[0]}” = “$nodeArg” ] ; then
           result=”${ar[1]}”
         fi
      done 
      shift 
      if [ -z "$result" ] ; then
         echo -n “/default/rack “
      else
         echo -n “$result “
      fi
    done
    

    而cluster.data的内容可以是

    hadoopdata1.ec.com     /dc1/rack1
    hadoopdata1            /dc1/rack1
    10.1.1.1               /dc1/rack2
    

如您所见,Hadoop 完全依赖于我们提供的机架值。您可以使用此事实将数据块分布在存在于不同物理机上的虚拟机上。

例如。

Virtual Machine 1 (VM1) 10.83.51.2 is on Physical Machine 1 (PM1)
Virtual Machine 2 (VM2) 10.83.51.3 is on Physical Machine 1 (PM1)
Virtual Machine 2 (VM2) 10.83.51.4 is on Physical Machine 2 (PM2)

您可以将 cluster.data 作为

10.83.51.2 /DC1/rack1
10.83.51.3 /DC1/rack1
10.83.51.4 /DC1/rack2
于 2013-05-01T18:02:33.633 回答