【问题标题】:pig script to sample 10 chunks of training data, pig script is jammedpig 脚本对 10 块训练数据进行采样,pig 脚本被卡住了
【发布时间】: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 任务都被阻塞。

我的尝试

  1. 为了弄清楚会发生什么,我首先将要生成的块数减少到 3 个。情况没有那么严重。 大约有 7 或 8 个映射器同时运行。这些映射器再次做了很少的事情(运行大约 1 分钟)。

  2. 然后,我将块数增加到 5,此时,我观察到与设置块数时相同的问题 到 10。在某些时候,只有一个映射器或减速器在运行,而所有其他映射器和减速器都被阻塞了。

  3. 我删除了脚本的某些部分,只存储 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(',');
    

这没有任何问题。

  1. 然后我添加了改组

    --------------------------------------------------------------------------
    -- 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 分钟)。在这种情况下,我会 想象一下启动映射器/减速器的开销会很高,有什么方法可以控制吗?

  1. 有什么问题,有什么建议吗?
  2. 是否有标准方法来进行此采样。我想在很多情况下,我们需要像 bootstrapping 或 bagging 一样进行这些子采样。因此,在猪中可能有一些标准方法可以做到这一点。我在网上找不到任何有用的东西。 非常感谢

附加信息

  1. 'labelZeroTrainingData' 表的大小非常小,压缩后大约 16MB。 表 'labelZeroTrainingData' 也是在同一个 pig 脚本中通过过滤生成的。
  2. 我在 3 台 aws c3.2xlarge 机器上运行了 pig 脚本。
  3. 表“dataFeatures”可能很大,压缩后大约 15GB。
  4. 我没有修改hadoop的任何默认配置。
  5. 我检查了磁盘空间和内存使用情况。磁盘空间使用率约为 40%。内存使用率约为 90%。我不确定内存是问题。自从 有人告诉我,如果内存有问题,整个任务应该会失败。

【问题讨论】:

    标签: hadoop machine-learning apache-pig sampling bootstrapping


    【解决方案1】:

    过了一会儿,我想我想通了。问题很可能是那里的多个STORE 语句。看起来猪脚本将默认批量运行。因此,对于每个数据块,都有一个作业正在运行,导致资源不足,例如映射器和减速器的插槽。任何工作都无法完成,因为每个工作都需要更多的映射器/减速器插槽。

    解决方案

    1. 使用储蓄罐。有一个称为 MultiStorage 的存储功能在这种情况下可能很有用。我在 piggybank 和 hadoop 之间遇到了一些版本不兼容的问题。但它可能会奏效。
    2. 禁用 pig 批量执行操作。 Pig 尝试优化执行。我只是通过添加 -M 来禁用这个多查询功能。因此,当您运行 pig 脚本时,它看起来像 pig -M -f pig_script.pg 一次执行一条语句而没有任何优化。这可能并不理想,因为没有进行优化。对我来说,这是可以接受的。
    3. 在 pig 中使用 EXEC 来强制执行某些执行顺序,这在这种情况下很有帮助。

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      相关资源
      最近更新 更多