我正在尝试一个小的hadoop设置(用于实验)只有2台机器。 我正在加载大约13GB的数据,一个大约3900万行的表格,使用Hive的复制因子为1。 我的问题是hadoop始终将所有这些数据存储在一个datanode上。 仅当我使用setrep将dfs_replication fatcor更改为2时,hadoop会在另一个节点上复制数据。 我也尝试了平衡器($ HADOOP_HOME / bin / start-balancer.sh -threshold 0)。 平衡器认识到它需要移动5GB左右来平衡。 但是说:“没有块可以移动,退出…”并退出。
2010-07-05 08:27:54,974 INFO org.apache.hadoop.hdfs.server.balancer.Balancer:使用阈值为0.0 2010-07-05 08:27:56,995 INFO org.apache.hadoop.net.NetworkTopology :添加一个新节点:/default-rack/10.252.130.177:1036 2010-07-05 08:27:56,995 INFO org.apache.hadoop.net.NetworkTopology:添加一个新节点:/default-rack/10.220.222.64 :1036 2010-07-05 08:27:56,996信息org.apache.hadoop.hdfs.server.balancer.Balancer:1过度使用节点:10.220.222.64:1036 2010-07-05 08:27:56,996信息组织。 apache.hadoop.hdfs.server.balancer.Balancer:1使用下的节点:10.252.130.177:1036 2010-07-05 08:27:56,997信息org.apache.hadoop.hdfs.server.balancer.Balancer:需要移动5.42 GB的字节使群集平衡。
时间标记迭代#字节已经移动字节被移动字节移动没有块可以移动。 正在退出…平衡花费了2.222秒
任何人都可以build议如何在hadoop上实现均匀分布的数据,而不需要复制?
有一些关于hadoop的东西可以帮助你:
a)块的第一个副本总是写入本地节点,以便在群集内运行的进程。 额外的复制品在其他地方制作。
b)hadoop是为许多节点devise的。 这就是默认复制为3的原因。对于小群集,有很多潜在的挂断。 如果可能的话,您应该尝试使用至less5-10个节点的集群,即使进行testing也是如此。
基于(a),我build议在集群外部的节点上运行configuration单元。
这可能不是最优化的方式,但是如果我的问题是将数据从一个数据节点分发到多个数据节点,我将如何实现。
加载数据就像你已经加载,然后运行一个缩进映射器与多个减速器(大约4应该做的伎俩)。 由于你有2个datanode(我猜测2个tasktrackers),任务堆栈将被用来运行这个工作将最终分配数据。