2014-11-20 2 views
0

У меня есть безобидный вид запроса на улей, который берет некоторые данные из одной таблицы, чтобы перезаписать их в другую. Как исходные, так и целевые таблицы разделены. Таблица назначения также группируется.Неравномерное распределение данных в редукторе

Этот запрос порождает 4 задания MR, причем последний всегда занимает необычно большое количество времени в фазе уменьшения. Я попытался увеличить количество редукторов, но это не помогло. Если посмотреть глубже, я заметил, что 1 из указанных 130 редукторов (изначально 1 из стандартных 26 редукторов) всегда получал гораздо больше данных, чем остальные. Я также попытался использовать предложение distribute в столбце с хорошим распределением, но это тоже не помогло.

Есть ли способ, который я могу выяснить, в чем причина, по которой большинство данных поступают на один редуктор? В качестве альтернативы, любые предложения по управлению этим объемом данных будут чрезвычайно полезны.

Мой код (имена таблиц и столбцов изменены). назначения разбивается на столбцы л и м назначения сгруппировано по user_id

set hive.enforce.bucketing = true; 
set mapred.reduce.tasks=130; 

insert overwrite table dest_table 
select 
    coalesce(event_guid, "<UNKNOWN>") event_guid, 
    coalesce(a, "<UNKNOWN>"), 
    coalesce(b, "<UNKNOWN>"), 
    coalesce(user_id, "<UNKNOWN>"), 
    coalesce(c, "<UNKNOWN>"), 
    coalesce(d, "<UNKNOWN>"), 
    coalesce(e, "<UNKNOWN>"), 
    coalesce(f, "<UNKNOWN>"), 
    coalesce(g, "<UNKNOWN>"), 
    coalesce(h, "<UNKNOWN>"), 
    coalesce(i, "<UNKNOWN>"), 
    coalesce(j, "<UNKNOWN>"), 
    coalesce(k, "<UNKNOWN>"), 
    coalesce(l, "<UNKNOWN>"), 
    coalesce(m, "<UNKNOWN>"), 
    coalesce(n, "<UNKNOWN>"), 
    coalesce(o, "<UNKNOWN>"), 
    coalesce(p, "<UNKNOWN>"), 
    coalesce(q, "<UNKNOWN>"), 
    coalesce(r, "<UNKNOWN>"), 
    coalesce(to_date(from_utc_timestamp(s, "PST")), "0000-00-00"), 
    coalesce(cast(from_utc_timestamp(s, "PST") as string), '0000-00-00 00:00:00'), 
    coalesce(s, '0000-00-00 00:00:00'), 
    coalesce(t, '0000-00-00 00:00:00'), 
    coalesce(u, '0000-00-00 00:00:00'), 
    coalesce(cast(from_utc_timestamp(t, "PST") as string), '0000-00-00 00:00:00'), 
    coalesce(cast(from_utc_timestamp(u, "PST") as string), '0000-00-00 00:00:00'), 
    coalesce(to_date(from_utc_timestamp(u, "PST")), "0000-00-00"), 
    coalesce(v, "<UNKNOWN>"), 
    coalesce(w, "<UNKNOWN>"), 
    coalesce(x, "<UNKNOWN>") 
from 
    source raw 
where v is not null and w is not null and x is not null 
distribute by event_guid 
; 

ответ

0

Это только предложение, но вы можете попробовать свои собственный картограф и редуктор сценарии с использованием ТРАНСФОРМА или MAP/УМЕНЬШИТЬ ключевое слово в улье для управления данными , Напр. выберите ключ, который будет столбцом, который дает равномерное распределение (чего вы пытаетесь достичь, используя дистрибутив) Может ли понадобиться некоторый анализ HQL. Запустите группу по, count (*) на event_guid. Распределены ли графы равномерно?

Смежные вопросы