我在hdfs中有成千上万的小型csv文件。在将它们合并到单个数据帧之前,我需要分别向每个文件添加一个ID(否则,在合并中将无法区分来自不同文件的数据)。
当前,我依靠yarn来分发我创建的进程,这些进程将id添加到每个文件并转换为镶木地板格式。我发现无论我如何调整群集(大小/执行程序/内存),带宽都限制在2000-3000个文件/小时。
for i in range(0,numBatches):
fileSlice = fileList[i*batchSize:((i+1)*batchSize)]
p = ThreadPool(numNodes)
logger.info('\n\n\n --------------- \n\n\n')
logger.info('Starting Batch : ' + str(i))
logger.info('\n\n\n --------------- \n\n\n')
p.map(lambda x: addIdCsv(x), fileSlice)
def addIdCsv(x):
logId=x[logId]
filePath=x[filePath]
fLogRaw = spark.read.option("header", "true").option('inferSchema', 'true').csv(filePath)
fLogRaw = fLogRaw.withColumn('id', F.lit(logId))
fLog.write.mode('overwrite').parquet(filePath + '_added')
您可以看到我的集群在CPU上表现不佳。但是,在YARN管理器上,可以100%访问资源。
什么是最好的解决数据管道的这一部分?什么是瓶颈?