背景
我有一个二进制分类任务,其中的数据非常不平衡。具体来说,标签0的数据比标签1的数据多得多。为了解决这个问题,我计划用标签0对数据进行二次采样,以大致匹配标签1的数据大小。我是在一个猪脚本中这样做的。而不是仅仅抽样一组训练数据,我这样做了10次,以产生10个数据块,以培训10个分类器类似于套袋,以减少方差。
样例猪脚本
---------------------------------
-- generate training chunk i
---------------------------------
-- subsampling data with label 0
labelZeroTrainingDataChunki = SAMPLE labelZeroTrainingData '$RATIO';
-- combine data with label 0 and label 1
trainingChunkiRaw = UNION labelZeroTrainingDataChunk1,labelOneTrainingData;
-- join two tables to get all the features back from table 'dataFeatures'
trainingChunkiFeatures = JOIN trainingChunkiRaw BY id, dataFeatures BY id;
-- in order to shuffle data, I give a random number to each data
trainingChunki = FOREACH trainingChunkiFeatures GENERATE
trainingChunkiRaw::id AS id,
trainingChunkiRaw::label AS label,
dataFeatures::features AS features,
RANDOM() AS r;
-- shuffle the data
trainingChunkiShuffledRandom = ORDER trainingChunki BY r;
-- store this chunk of data into s3
trainingChunkiToStore = FOREACH trainingChunkiShuffledRandom GENERATE
id AS id,
label AS label,
features AS features;
STORE trainingChunkiToStore INTO '$training_data_i_s3_path' USING PigStorage(',');在我真正的猪脚本中,我做了10次来生成10个数据块。
问题
我遇到的问题是,如果我选择生成10块数据,就会有这么多映射/还原任务,超过10K。大多数映射者都做非常小的事情(运行不到1分钟)。在某种程度上,整个猪的剧本都被卡住了。只有一个映射器/还原器任务可以运行,所有其他映射器/还原任务都会被阻塞。
我试过什么
这没什么问题。
同样的问题再次出现。更糟糕的是,在某种程度上,没有地图/减速机运行。整个计划没有取得任何进展就挂了。我添加了另一台机器,程序运行了几分钟,然后又卡住了。看起来这里有一些依赖问题。
有什么问题?
我怀疑有一些依赖会导致僵局。令人困惑的是,在洗牌之前,我已经生成了数据块。因为这些数据块是相互独立的,所以我希望这些数据块可以并行执行。
我还注意到,有许多映射器/减速器几乎不做什么事情(存在不到1分钟)。在这种情况下,我可以想象启动映射器/减速器的开销会很高,有什么办法来控制它吗?
附加信息
发布于 2015-09-01 14:01:42
过了一会儿,我想我想出办法了。问题很可能是多个STORE语句。在默认情况下,看起来pig脚本将在批处理中运行。因此,对于每个数据块,都有一个作业正在运行,这会导致缺乏资源,例如映射器和减速器的插槽。没有一项工作能够完成,因为每个任务都需要更多的映射器/减速器槽。
溶液
pig -M -f pig_script.pg,它一次只执行一条语句,而不进行任何优化。这可能并不理想,因为没有进行优化。对我来说,这是可以接受的。EXEC来强制执行某些执行顺序,这在这种情况下是有帮助的。https://stackoverflow.com/questions/32314728
复制相似问题