我的数据集看起来像 input1 input2 到 input6 ,以及一个处理每个输入的函数 ProcessFunc(输入)的。
我的问题是,当我运行单个hadoop map任务或单个spark执行器时,每个输入的处理时间是相同的,假设第一个输入的处理时间=第二个输入的处理时间= ... =第6个输入的处理时间= t ,但是当我将hadoop map任务或spark执行器的数量翻倍时,可以说 2 每个输入的处理时间加倍到 2t 很奇怪。
如果我通过 n 进一步加倍地图任务或火花执行器的数量,则处理时间加倍为 nt 。
注意:
我配置了每个hadoop和spark,为每个地图任务或执行者分配一个虚拟核心。
根据我的配置,map资源或spark执行程序应该并行运行,因为有足够的资源。我可以看到每个进程的输出同时打印,但处理时间加倍,如前所述。
这是hadoop和spark的正常行为吗?不应该并行执行为每个输入保留相同的处理时间,而是在多个输入上同时执行? 我所期望的是,2个地图任务将在处理6个输入的半个时间内处理6个输入并使用一个地图任务,所以我在这里缺少什么?
编辑:
添加了处理功能的代码:
P.S:我知道这不是字数的理想方式,但这不是我的主要问题,我在这里测试的是处理部分的并发性。
Python代码:
from pyspark import SparkContext, SparkConf, StorageLevel
confobj = SparkConf().setAppName("MainApp")
sc = SparkContext(master="local[2]", sparkHome="/home/spark-1.1.0", conf=confobj)
input_path = "./input.seq"
inputobject = sc.sequenceFile(input_path,
keyClass="org.apache.hadoop.io.Text",
valueClass="org.apache.hadoop.io.BytesWritable").repartition(2)
def mapfunc(input):
# The input sequence file is arranged as Key, Value
# where Key is text file name and value is text file content
start = datetime.now()
# Get File Name
filename = str(input[0])
# Get File content
filecontent = input[1]
# Split at whitespaces to count words
counts = len(filecontent.split(" "))
end = datetime.now()
print (end-start).seconds
# Return file name and word counts
return (filename, counts)
output = inputobject.Map(mapfunc).collect()
全部谢谢,