我试图通过azure在hdinight上运行一个简单的mapreduce程序。我的程序是用python编写的,只计算满足特定条件的数字行(timeseries)的数量。最后的结果只是每个类别的计数。我的代码如下所示。
from mrjob.job import MRJob
import numpy as np
import time
class MRTimeSeriesFrequencyCount(MRJob):
def mapper(self, _, line):
series = [float(i) for i in line.split(',')]
diff = list(np.diff(series))
avg = sum(diff) / len(diff)
std = np.std(diff)
fit = np.polyfit(list(range(len(series))), series, deg=1)
yield "Down", 1 if (series[len(series)-1]-series[0]) < 0 else 0
yield "Up", 1 if (series[len(series)-1]-series[0]) > 0 else 0
yield "Reverse", 1 if (fit[0]*(series[len(series)-1]-series[0])) < 0 else 0
yield "Volatile", 1 if std/avg > 0.33 else 0
def reducer(self, key, values):
yield key, sum(values)
if __name__ == '__main__':
start_time = time.time()
MRTimeSeriesFrequencyCount.run()
print("--- %s seconds ---" % (time.time() - start_time))
我是mapreduce和hadoop的新手。当我放大存储在csv中的行数时,我的笔记本电脑(hp elitebook 8570w)的运行速度仍然比在hadoop中运行代码快(456秒,100万行628.29秒)。集群有4个工作节点,每个节点有4个核心,2个头节点,每个节点有4个核心。它不是应该表现得更快吗?是否存在其他瓶颈,例如读取数据?mrjob是否只在一个节点上运行它?事先谢谢你的帮助。
1条答案
按热度按时间qjp7pelc1#
正如我所知,hadoop需要一些时间来为m/r作业和hdfs上的数据准备启动。因此,对于hadoop集群上的一个小数据集,您无法获得比本地单机更快的性能。
你有一百万行数据。我假设一行的数据大小是1kb,所以一百万行的数据大小大约是1gb。对于hadoop来说,这是一个很小的数据集,因此节省的时间不足以弥补在hadoop上真正运行之前启动的延迟时间。
作为参考,有一个非常重要的线索(为什么提交作业到mapreduce通常要花费这么多时间?),它的标记答案解释了问题的延迟。