Hadoop pig脚本要采集10块训练数据,pig脚本被卡住了

Hadoop pig脚本要采集10块训练数据,pig脚本被卡住了,hadoop,machine-learning,apache-pig,sampling,bootstrapping,Hadoop,Machine Learning,Apache Pig,Sampling,Bootstrapping,背景 我有一个二进制分类任务,其中数据高度不平衡。具体来说,有 标签为0的数据比标签为1的数据多得多。为了解决这个问题,我计划进行二次抽样 标签为0的数据与标签为1的数据的大小大致匹配。我是用猪的剧本写的。而不是 仅对一个训练数据块进行采样,我做了10次,生成10个数据块来训练10个分类器 与袋装相似,以减少差异 示例清管器脚本 --------------------------------- -- generate training chunk i ---------------------

背景

我有一个二进制分类任务,其中数据高度不平衡。具体来说,有 标签为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(',');
在我的real pig脚本中,我这样做了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分钟)。在这种情况下,我会 想象一下,启动映射器/还原器的开销会很高,有什么方法可以控制吗

  • 有什么问题,有什么建议吗
  • 是否有标准的方法来进行取样。我可以想象,在很多情况下,我们需要做这些子采样,比如引导或打包。所以,可能有一些标准的方法在猪身上做到这一点。我在网上找不到任何有用的东西。 非常感谢
  • 其他信息

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

  • 过了一会儿,我想我明白了。问题可能是那里有多个
    STORE
    语句。默认情况下,pig脚本将以批处理方式运行。因此,对于每个数据块,都有一个作业正在运行,这会导致资源不足,例如映射器和还原器的插槽。所有作业都无法完成,因为每个作业都需要更多的mapper/reducer插槽

    解决方案

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

  • 过了一会儿,我想我明白了。问题可能是那里有多个
    STORE
    语句。默认情况下,pig脚本将以批处理方式运行。因此,对于每个数据块,都有一个作业正在运行,这会导致资源不足,例如映射器和还原器的插槽。所有作业都无法完成,因为每个作业都需要更多的mapper/reducer插槽

    解决方案

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