在apachehadoop上扩展python mrjob程序

bjp0bcyl  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(660)

我试图通过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是否只在一个节点上运行它?事先谢谢你的帮助。

qjp7pelc

qjp7pelc1#

正如我所知,hadoop需要一些时间来为m/r作业和hdfs上的数据准备启动。因此,对于hadoop集群上的一个小数据集,您无法获得比本地单机更快的性能。
你有一百万行数据。我假设一行的数据大小是1kb,所以一百万行的数据大小大约是1gb。对于hadoop来说,这是一个很小的数据集,因此节省的时间不足以弥补在hadoop上真正运行之前启动的延迟时间。
作为参考,有一个非常重要的线索(为什么提交作业到mapreduce通常要花费这么多时间?),它的标记答案解释了问题的延迟。

相关问题