我正在尝试一个只有 2 台机器的小型 Hadoop 设置(用于实验)。我正在加载大约 13GB 的数据,一个大约有 3900 万行的表,使用 Hive 的复制因子为 1。我的问题是 Hadoop 总是将所有这些数据存储在一个数据节点上。只有当我使用 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 INFO org.apache.hadoop.hdfs.server.balancer.Balancer:1过度利用的节点:10.220.222.64:1036 2010-07-05 08:27:56,996 INFO org.apache.hadoop.hdfs.server.balancer.Balancer: 1 利用不足的节点:10.252.130.177:1036 2010-07-05 08:27:56,997 INFO org.apache.hadoop.hdfs.server.balancer.Balancer: 需要移动 5.42 GB 字节以使集群平衡。
时间戳 迭代次数# 已移动的字节数 剩余待移动的字节数 正在移动的字节数 无法移动任何块。正在退出... 平衡耗时 2.222 秒
有人可以建议如何在没有复制的情况下实现 Hadoop 上数据的均匀分布吗?
答案1
关于hadoop有几件事可能会对你有帮助:
a) 对于集群内运行的进程,块的第一个副本始终写入本地节点。其他副本则在其他地方制作。
b) Hadoop 是为大量节点设计的。这就是为什么默认复制数为 3。对于小型集群,存在许多潜在的问题。如果可能,您应该尝试使用至少 5-10 个节点的集群,即使是为了测试。
根据(a),我建议在集群外的节点上运行 Hive。
答案2
这可能不是最优化的方法,但如果我的问题是将数据从一个数据节点分发到多个数据节点,我将按照以下方式进行操作。
像之前一样加载数据,然后运行具有多个 Reducer(大约 4 个就可以了)的身份映射器。由于您有 2 个数据节点(我猜有 2 个任务跟踪器),因此将使用两个任务跟踪器来运行作业,最终分发数据。