【发布时间】:2015-08-31 15:26:12
【问题描述】:
背景
我有一个二进制分类任务,其中数据高度不平衡。具体来说,有 标签 0 的数据比标签 1 的数据多得多。为了解决这个问题,我计划进行二次采样 标签为 0 的数据与标签为 1 的数据的大小大致匹配。我在猪脚本中执行此操作。代替 只采样一块训练数据,我这样做了 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(',');
在我真正的猪脚本中,我这样做了 10 次以生成 10 个数据块。
问题
我遇到的问题是,如果我选择生成 10 个数据块,那么 mapper/reducer 任务太多了,超过 10K。多数的 映射器做的事情很少(运行不到 1 分钟)。在某些时候,整个猪剧本都被卡住了。只有一个 mapper/reducer 任务可以运行,所有其他 mapper/reducer 任务都被阻塞。
我的尝试
为了弄清楚会发生什么,我首先将要生成的块数减少到 3 个。情况没有那么严重。 大约有 7 或 8 个映射器同时运行。这些映射器再次做了很少的事情(运行大约 1 分钟)。
然后,我将块数增加到 5,此时,我观察到与设置块数时相同的问题 到 10。在某些时候,只有一个映射器或减速器在运行,而所有其他映射器和减速器都被阻塞了。
-
我删除了脚本的某些部分,只存储 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(',');
同样的问题再次出现。更糟糕的是,在某些时候,没有映射器/减速器在运行。整个程序挂了,没有任何进展。我添加了另一台机器,程序运行了几分钟,然后再次卡住。看起来这里有一些依赖问题。
有什么问题
我怀疑有一些依赖会导致死锁。令人困惑的是,在洗牌之前,我已经 生成数据块。我期待改组可以并行执行,因为这些数据块是独立的 彼此。
我还注意到有许多映射器/减速器做的事情很少(存在不到 1 分钟)。在这种情况下,我会 想象一下启动映射器/减速器的开销会很高,有什么方法可以控制吗?
- 有什么问题,有什么建议吗?
- 是否有标准方法来进行此采样。我想在很多情况下,我们需要像 bootstrapping 或 bagging 一样进行这些子采样。因此,在猪中可能有一些标准方法可以做到这一点。我在网上找不到任何有用的东西。 非常感谢
附加信息
- 'labelZeroTrainingData' 表的大小非常小,压缩后大约 16MB。 表 'labelZeroTrainingData' 也是在同一个 pig 脚本中通过过滤生成的。
- 我在 3 台 aws c3.2xlarge 机器上运行了 pig 脚本。
- 表“dataFeatures”可能很大,压缩后大约 15GB。
- 我没有修改hadoop的任何默认配置。
- 我检查了磁盘空间和内存使用情况。磁盘空间使用率约为 40%。内存使用率约为 90%。我不确定内存是问题。自从 有人告诉我,如果内存有问题,整个任务应该会失败。
【问题讨论】:
标签: hadoop machine-learning apache-pig sampling bootstrapping