我有一个关于在Hadoop中复制的问题,以下是这种情况: 我在2个机架中总共有6个节点
Rack 1 Rack 2
__________ __________
| | | |
| Node 1 | | Node 4 |
| | | |
| Node 2 | | Node 5 |
| | | |
| Node 3 | | Node 6 |
| | | |
__________ __________
如果整个机架故障转移,如何确保我的所有数据都安全?
是否可以配置复制目标节点?
在这种情况下,如果复制因子等于3,则数据只能保存在1个机架上。 节点1复制到节点2和3,或节点5复制到4和6例如。因此,如果整个机架故障转移,我将丢失一些数据。
Rack 1 Rack 2
__________ __________
| | | |
| Node 1 | | Node 4 |
| v | | ^ |
| Node 2 | | Node 5 |
| v | | v |
| Node 3 | | Node 6 |
| | | |
__________ __________
我想要做的,例如对于节点1,是在节点4或5或6上强制复制至少一次
Rack 1 Rack 2
__________ __________
| | | |
| Node 1 | | Node 4 |
| v \ | ^ |
| Node 2 |\-->Node 5 |
| | | / |
| Node 3 <---/Node 6 |
| | | |
__________ __________
一种方法是将复制因子设置为4,但此解决方案不够可扩展。
有什么想法吗?谢谢!
答案 0 :(得分:1)
Hadoop有一个称为“机架感知”的功能,可以解决这个问题。如果您将Hadoop配置为可识别机架,则HDFS将确保在您的两个机架方案中至少有一个复制器进入每个机架:http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/RackAwareness.html
要启用机架感知,您必须具有Java类或外部脚本,节点通过该脚本报告它所属的机架。
上面的链接提供了示例,但具体细节取决于您的网络配置。