gpt4 book ai didi

hadoop - pig 脚本对 10 block 训练数据进行采样,pig 脚本被卡住了

转载 作者:可可西里 更新时间:2023-11-01 16:10:37 25 4
gpt4 key购买 nike

背景

我有一个数据高度不平衡的二元分类任务。具体来说,有标签 0 的数据比标签 1 的数据多得多。为了解决这个问题,我计划进行子采样标签 0 的数据与标签 1 的数据的大小大致匹配。我在 pig 脚本中做了这个。代替只采样一 block 训练数据,我这样做了 10 次以生成 10 个数据 block 来训练 10 个分类器类似于装袋以减少方差。

示例 pig 脚本

---------------------------------
-- 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 个数据 block 。

问题

我遇到的问题是,如果我选择生成 10 个数据 block ,那么 mapper/reducer 任务太多了,超过 10K。多数的映射器做的事情很少(运行不到 1 分钟)。在某些时候,整个 pig 脚本都被卡住了。只有一个 mapper/reducer 任务可以运行,所有其他 mapper/reducer 任务都被阻止。

我尝试了什么

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

  2. 然后,我将 block 数增加到 5,此时,我观察到设置 block 数时遇到的相同问题为 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(',');

同样的问题再次出现。更糟糕的是,在某些时候,没有映射器/ reducer 在运行。整个程序挂了,没有任何进展。我添加了另一台机器,程序运行了几分钟后再次卡住。看起来这里存在一些依赖性问题。

有什么问题

我怀疑有一些依赖性会导致死锁。令人困惑的是,在洗牌之前,我已经生成数据 block 。我期望改组可以并行执行,因为这些数据 block 是独立的彼此。

我还注意到有许多映射器/缩减器做的事情很少(存在不到 1 分钟)。在这种情况下,我会想象启动映射器/缩减器的开销会很高,有什么方法可以控制吗?

  1. 有什么问题,有什么建议吗?
  2. 是否有标准方法来进行这种抽样。我想在很多情况下我们需要进行这些子采样,例如自举或装袋。所以,可能有一些标准的方法可以在 pig 身上做到这一点。我在网上找不到任何有用的东西。非常感谢

附加信息

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

最佳答案

过了一会儿,我想我明白了什么。问题很可能是那里的多个 STORE 语句。看起来 pig 脚本默认会批量运行。因此,对于每个数据 block ,都有一个作业正在运行,这会导致资源不足,例如映射器和 reducer 的插槽。没有一项工作可以完成,因为每个工作都需要更多的映射器/缩减器插槽。

解决方案

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

关于hadoop - pig 脚本对 10 block 训练数据进行采样,pig 脚本被卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32314728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com