在apachehadoop上扩展pythonmrjob程序

在apachehadoop上扩展pythonmrjob程序,python,azure,hadoop,azure-hdinsight,mrjob,Python,Azure,Hadoop,Azure Hdinsight,Mrjob,我正试图通过Azure在HDInight上运行一个简单的mapreduce程序。我的程序是用python编写的,只计算满足特定条件的数字行(时间序列)的数量。最终的结果只是每个类别的计数。我的代码如下所示 from mrjob.job import MRJob import numpy as np import time class MRTimeSeriesFrequencyCount(MRJob): def mapper(self, _, line): series = [flo

我正试图通过Azure在HDInight上运行一个简单的mapreduce程序。我的程序是用python编写的,只计算满足特定条件的数字行(时间序列)的数量。最终的结果只是每个类别的计数。我的代码如下所示

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))
从mrjob.job导入mrjob
将numpy作为np导入
导入时间
类别MRTimeSeriesFrequencyCount(MRJob):
def映射器(自身、线):
系列=[行中i的浮点(i)。拆分(',')]
差异=列表(np.差异(系列))
平均值=总和(差异)/长度(差异)
标准=np.标准(差异)
配合=np.多配合(列表(范围(透镜(系列))),系列,度=1)
产量“下降”,如果(系列[len(系列)-1]-系列[0])<0,则产量为1
如果(系列[len(系列)-1]-系列[0])>0,则产量为“向上”,1
如果(拟合[0]*(系列[len(系列)-1]-系列[0])小于0,则产生“反向”,1
如果标准/平均值>0.33,则产量为“挥发性”,1,否则为0
def减速器(自身、键、值):
收益键,总和(值)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
开始时间=time.time()
MRTimeSeriesFrequencyCount.run()的
打印(“--%s秒--”%(time.time()-start\u time))

我是mapreduce和hadoop的新手。当我放大存储在csv中的行数时,我的笔记本电脑(HP Elitebook 8570w)的运行速度仍然比在Hadoop中运行代码快(100万行的运行速度为456秒,而不是628.29秒)。集群有4个工作节点,每个节点有4个核心,2个头部节点,每个节点有4个核心。它不应该表现得更快吗?是否存在其他瓶颈,例如读取数据?mrjob是否仅在一个节点上运行它?提前感谢您的帮助。

据我所知,Hadoop需要一些时间来准备启动HDFS上的M/R作业和数据。因此,对于Hadoop集群上的小型数据集,您无法获得比本地单机更快的性能

您有一百万行数据。我假设一行的数据大小为1KB,因此一百万行的数据大小约为1GB。它是Hadoop的一个小数据集,因此节省的时间不足以弥补在Hadoop上真正运行之前启动的延迟时间


作为参考,有一个SO线程()其标记的答案解释了问题的延迟。

您的数据大小是多少?我测试的数据大小是1gb,但我可以轻松测试更大的数据集。您认为我什么时候会看到hadoop的优势?由于数据量如此之小,您的hadoop作业不会比运行独立程序更快。您知道我需要大量数据集才能获得性能优势吗?@klib正如我所知,hadoop上的数据集大小通常需要超过TB级别才能获得性能优势。