pig脚本样本10块训练数据,pig脚本卡住了

vuktfyat  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(374)

背景
我有一个二进制分类任务,其中的数据是高度不平衡的。具体来说,标签为0的数据要比标签为1的数据多得多。为了解决这个问题,我计划对标签为0的数据进行子采样,以大致匹配标签为1的数据的大小。我是用Pig的剧本写的。我不是只对一个训练数据块进行采样,而是这样做了10次,生成10个数据块来训练10个分类器,类似于bagging来减少方差。
示例清管器脚本

---------------------------------
-- 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(',');

在我真正的pig脚本中,我这样做了10次以生成10个数据块。
问题
我的问题是,如果我选择生成10个数据块,那么就有太多的mapper/reducer任务,超过10k。大多数Map绘制者只做很少的事情(运行不到1分钟)。在某个时刻,整个Pig的剧本被卡住了。只能运行一个Map器/还原器任务,并且所有其他Map器/还原器任务都被阻止。
我试过的
为了弄清楚发生了什么,我首先将要生成的块的数量减少到3。情况没有那么严重。大约有7或8个绘图员同时运行。同样,这些Map绘制者做了非常小的事情(运行大约1分钟)。
然后,我将块的数量增加到5,在这一点上,我观察到了相同的问题,当我将块的数量设置为10时。在某个时刻,只有一个Map器或还原器正在运行,而所有其他Map器和还原器都被阻塞。
我删除了脚本的一些部分,只存储id,标签没有特性

--------------------------------------------------------------------------
-- generate training chunk i
--------------------------------------------------------------------------
-- subsampling data with label 0
labelZeroTrainingDataChunki = SAMPLE labelZeroTrainingData $RATIO;

-- combine data with label 0 and label 1
trainingChunkiRaw = UNION labelZeroTrainingDataChunki, labelOneTrainingData;

STORE trainingChunkiRaw INTO '$training_data_i_s3_path' USING PigStorage(',');

这没有任何问题。
然后我又加上了洗牌

--------------------------------------------------------------------------
-- generate training chunk i
--------------------------------------------------------------------------

-- subsampling data with label 0
labelZeroTrainingDataChunki = SAMPLE labelZeroTrainingData $RATIO;

-- combine data with label 0 and label 1
trainingChunkiRaw = UNION labelZeroTrainingDataChunki, labelOneTrainingData;
trainingChunki = FOREACH trainingChunkiRaw GENERATE
                    id,
                    label,
                    features,
                    RANDOM() AS r;
-- shuffle data
trainingChunkiShuffledRandom = ORDER trainingChunki BY r;
trainingChunkiToStore = FOREACH trainingChunkiShuffledRandom GENERATE
                    id AS id,
                    label AS label,
                    features AS features;

STORE trainingChunkiToStore INTO '$training_data_i_s3_path' USING PigStorage(',');

同样的问题再次出现。更糟糕的是,在某个时刻,没有Map器/还原器运行。整个程序没有取得任何进展就挂断了。我又加了一台机器,程序运行了几分钟后又卡住了。看起来这里有一些依赖性问题。
有什么问题
我怀疑有某种依赖关系导致了死锁。令人困惑的是,在洗牌之前,我已经生成了数据块。我原以为洗牌可以并行执行,因为这些数据块彼此独立。
我还注意到有许多Map器/还原器只做很少的事情(存在不到1分钟)。在这种情况下,我可以想象启动Map器/还原器的开销会很高,有什么方法可以控制吗?
有什么问题,有什么建议吗?
有没有标准的取样方法。我可以想象,在很多情况下,我们需要做这些子采样像引导或装袋。所以,在Pig身上可能有一些标准的方法。我在网上找不到任何有用的东西。谢谢
附加信息
“labelzerotrainingdata”表的大小非常小,大约16mbgziped。表'labelzerotrainingdata'也通过过滤在同一pig脚本中生成。
我在3台awsc3.2x大型机器上运行了pig脚本。
表'datafeatures'可能很大,大约15gbgziped。
我没有修改hadoop的任何默认配置。
我检查了磁盘空间和内存使用情况。磁盘空间使用率约为40%。内存使用率约为90%。我不确定记忆是不是问题。因为有人告诉我,如果是内存问题,整个任务应该失败。

hjqgdpho

hjqgdpho1#

过了一会儿,我想我发现了一些事情。问题很可能是多重性 STORE 在那里的声明。默认情况下,pig脚本将批量运行。因此,对于每个数据块,都有一个作业正在运行,这会导致资源不足,例如Map器和reducer的插槽。没有一个作业可以完成,因为每个都需要更多的Map器/缩减器插槽。
解决方案
使用储液罐。在这种情况下,有一个名为multistorage的存储函数可能很有用。piggybank和hadoop之间存在版本不兼容的问题。但它可能有用。
禁止执行批处理操作。pig试图优化执行。我只是通过添加-m来禁用这个多查询特性。所以,当你运行pig脚本时,它看起来像 pig -M -f pig_script.pg 一次执行一条语句而不进行任何优化。这可能并不理想,因为没有进行优化。对我来说,这是可以接受的。
使用 EXEC 在这种情况下,执行某些执行命令是有帮助的。

相关问题