簡體   English   中英

在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秒對100萬行的628.29秒)。 該集群有4個工作節點,每個工作節點有4個核心,還有2個頭節點,每個有4個核心。 它不應該執行得更快嗎? 還有其他瓶頸,例如讀取數據嗎? mrjob是否僅在一個節點上運行它? 先謝謝您的幫助。

眾所周知,Hadoop需要一些時間來准備啟動HDFS上的M / R作業和數據。 因此,對於Hadoop集群上的小型數據集,您無法獲得比本地單機更快的性能。

您有100萬行數據。 我假設一行的數據大小為1 KB,所以一百萬行的數據大小約為1 GB。 它是Hadoop的一個很小的數據集,因此節省的時間不足以彌補在Hadoop上真正運行之前的啟動延遲時間。

作為參考,有一個SO線程( 為什么將作業提交到mapreduce通常需要花費大量時間? ),其標記的答案說明了問題的延遲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM