我想尝试实现我从 IEEE“虚拟云中的位置感知 MapReduce”获得的这篇论文工作。这里总结一下:8台物理机,每台机器包含4台虚拟机,每台VM安装hadoop hdfs。假设我们有一个包含 p 台物理机的集群,每台都有一个硬盘,副本数为 3。那么 n 个文件 block 从集群外的另一台计算机放入集群或在集群中随机生成。该模型是关于具有一定数据模式的数据模式生成和任务模式生成。每个 block 都有相同的概率被放置在托管相同数量虚拟机的物理机上。可能会出现数据模式,使用 hadoop 策略,文件 block 副本所有堆栈在一台物理机器上,因为 hadoop 的策略数据分配是随机的。
http://imageshack.us/photo/my-images/42/allstack.png/
建议的策略是循环分配和蛇形分配,理论上是这样的:http://imageshack.us/photo/my-images/43/proposed.png/
如何让hadoop知道一些虚拟机在一台物理机器上?
使hadoop不将文件 block 的第二个和第三个副本复制到同一物理机上的虚拟机上???
我问过如何实现这样的,并得到答复,它使用机架感知配置。但我仍然感到困惑,需要更多关于此的引用。
我如何跟踪这些数据,那些文件 block 复制均匀分布在物理机器上,确保在一台物理机器上没有文件 block 副本全部堆栈?
确定我是否按照机架意识进行配置,文件 block 副本均匀分布在物理机上吗?
最佳答案
假设:我们知道哪个虚拟机是在哪个物理机上创建的。
这种假设在公共(public)云环境中不成立。因此,下面描述的解决方案不能在那里工作。下面描述的解决方案将在私有(private)云中工作
实现机架感知包括 2 个步骤
<property>
<name>topology.script.file.name</name>
<value>core/rack-awareness.sh</value>
</property>
一个示例 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 完全依赖于我们提供的机架值。您可以使用此事实在存在于不同物理机上的虚拟机上分布数据 block 。
例如。
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
关于hadoop - 虚拟机hadoop上的文件 block 复制分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15038771/