在 Apache Hadoop 上扩展 python mrjob 程序
Scaling a python mrjob program on Apache Hadoop
我正尝试通过 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))
我是 mapreduce 和 hadoop 的新手。当我扩大存储在 csv 中的行数时,我的 HP Elitebook 8570w 笔记本电脑仍然比 运行 在 Hadoop 中执行代码更快(456 秒对 628.29 秒,100 万行)。该集群有 4 个工作节点,每个节点有 4 个核心,还有 2 个头节点,每个节点有 4 个核心。它不应该执行得更快吗?是否存在其他瓶颈,例如读取数据? mrjob 运行 只在一个节点上运行吗?在此先感谢您的帮助。
据我所知,Hadoop 需要一些时间来为 HDFS 上的 M/R 作业和数据准备启动。因此,对于小型数据集,在 Hadoop 集群上无法获得比在本地单机上更快的性能。
您有 100 万行数据。我假设一行的数据大小是1KB,那么100万行的数据大小大约是1GB。它是 Hadoop 的一个小数据集,因此节省的时间不足以弥补 运行 真正在 Hadoop 上之前的启动延迟时间。
作为参考,有一个 SO 线程 (Why submitting job to mapreduce takes so much time in General?),其标记的答案解释了您的问题的延迟。
我正尝试通过 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))
我是 mapreduce 和 hadoop 的新手。当我扩大存储在 csv 中的行数时,我的 HP Elitebook 8570w 笔记本电脑仍然比 运行 在 Hadoop 中执行代码更快(456 秒对 628.29 秒,100 万行)。该集群有 4 个工作节点,每个节点有 4 个核心,还有 2 个头节点,每个节点有 4 个核心。它不应该执行得更快吗?是否存在其他瓶颈,例如读取数据? mrjob 运行 只在一个节点上运行吗?在此先感谢您的帮助。
据我所知,Hadoop 需要一些时间来为 HDFS 上的 M/R 作业和数据准备启动。因此,对于小型数据集,在 Hadoop 集群上无法获得比在本地单机上更快的性能。
您有 100 万行数据。我假设一行的数据大小是1KB,那么100万行的数据大小大约是1GB。它是 Hadoop 的一个小数据集,因此节省的时间不足以弥补 运行 真正在 Hadoop 上之前的启动延迟时间。
作为参考,有一个 SO 线程 (Why submitting job to mapreduce takes so much time in General?),其标记的答案解释了您的问题的延迟。