假设我有一个包含25个块的数据,复制因子为1。映射器需要大约5分钟来读取和处理单个数据块。那么如何计算一个工作节点的时间呢?15个节点怎么样?如果我们将复制因子更改为3,时间会改变吗?我真的需要帮助。
首先,我建议阅读一些关于这个问题的科学论文(谷歌学者是一个很好的起点)。
现在讨论一下。从我最近的实验中,我得出结论,处理时间与你想要处理的数据量有很强的关系(有道理)。在我们的集群中,Mapper读取一个128MB的块平均需要7-8秒。现在,为了预测总体执行时间,您需要考虑几个因素:
- Mapper产生了多少数据,这将决定Hadoop执行Shuffling所需的时间
- Reducer在做什么?它会进行一些迭代处理吗?(可能很慢!)
- 资源的配置是什么?(允许在同一台计算机上运行多少个Mapper和Reducer)
- 最后,是否有其他作业同时运行?(这可能会大大减慢作业速度,因为您的Reducer插槽可能会被占用,等待数据,而不是做有用的事情)
因此,对于一台机器,您已经看到了预测作业执行时间的任务的复杂性。基本上,在我的研究过程中,我得出的结论是,平均每台机器能够处理20-50兆字节/秒(速率根据以下公式计算:总输入大小/总作业运行时间)。处理速率包括转移时间(例如,当您的应用程序启动并将所需文件上传到集群时)。不同的用例的处理率不同,很大程度上受输入大小的影响,更重要的是受映射器产生的数据量的影响(同样,这些值适用于我们的基础设施和不同的机器配置,您将看到完全不同的执行时间)。
当你开始扩展你的实验时,你会看到平均性能的提高,但从我的研究中,我可以再次得出结论,它不是线性的,你需要自己为自己的基础设施拟合具有近似作业执行时间的各个变量的模型。
为了给你一个想法,我将分享部分结果。在1个节点上执行确定用例时,速率为~46M字节/秒,对于2个节点,速率为~73M字节/秒钟,对于3个节点,速度为~85M字节/每秒(在我的情况下,复制因子等于节点数)。
这个问题很复杂,需要时间、耐心和一些分析技巧才能解决。玩得开心!