Я довольно активно использовал Hive, и мне было интересно, есть ли способ улучшить следующий рабочий процесс.Оптимизация нескольких ГБ данных в Hadoop Hive
Каждую ночь с несанкционированным сжатием текстового файла из кластера Oracle записывается в HDFS, который обрабатывается Hive.
я загрузить таблицу, как это:
CREATE EXTERNAL TABLE ACCOUNTINGTABLE (
ts STRING,
duid STRING,
owner STRING,
hidden STRING,
lgroup STRING,
nbfiles INT,
length BIGINT,
replicas INT,
provenance STRING,
state STRING,
campaign STRING,
rlength BIGINT,
rnbfiles INT,
rowner STRING,
rgroup STRING,
rarchived STRING,
rsuspicious STRING,
name STRING,
ami STRING,
site STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
LOCATION '/user/accounting/dump';
LOAD DATA INPATH '/user/accounting/dump_REPLACEWITHTIMESTAMP.lst' INTO TABLE ACCOUNTINGTABLE;
, а затем запустить несколько бухгалтерских сводок, как это производить текстовый вывод для постобработки:
set hive.exec.reducers.max=90;
CREATE EXTERNAL TABLE ACCOUNTINGTABLE_site_project_datatype_tag (
ts STRING,
project STRING,
datatype STRING,
tag STRING,
site STRING,
duids INT,
replicas INT,
nbfiles INT,
rnbfiles INT,
length BIGINT,
rlength BIGINT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
LOCATION '/user/accounting/summary/REPLACEWITHTIMESTAMP/site_project_datatype_tag';
INSERT OVERWRITE TABLE ACCOUNTINGTABLE_site_project_datatype_tag
SELECT
'REPLACEWITHTIMESTAMP',
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){1}', 1),
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){5}', 1),
split(regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){6}', 1), '_tid')[0],
site,
count(distinct duid),
sum(replicas),
sum(nbfiles),
sum(rnbfiles),
sum(length),
sum(rlength)
from
ACCOUNTINGTABLE
where
(
ami='project.datasetnumber.physicsshort.prodstep.datatype.version'
or
ami='project.runnumber.streamname.prodstep.datatype.version'
)
group by
'REPLACEWITHTIMESTAMP',
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){1}', 1),
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){5}', 1),
split(regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){6}', 1), '_tid')[0],
site;
DROP TABLE ACCOUNTINGTABLE_site_project_datatype_tag;
Сейчас:
В среднем размер файла дампа Oracle составляет около 5 ГБ (так не так уж много), с примерно 250 миллионами строк. Суммы не более 1-2 МБ.
Среднее задание на улей, как указано выше, занимает около часа, чтобы бежать. Фаза отображения прогрессирует очень хорошо, и она составляет 100% примерно через 15 минут, но затем сокращение занимает почти 45 минут все время, показывая 100%. Теперь мы постепенно добавляем все больше и больше разных резюме, и вскоре мы получим магический предел в 24 часа для итоговой обработки. Мониторинг инфраструктуры также показывает, что использование узлов низкое (cpu ~ 30-40%, io ~ 10%).
Я пробовал играть с io.sort.mb, io.sort.factor и т. Д., Но это почти всегда ухудшало ситуацию. Итак, теперь я запускаю Hadoop defaults (распределение Cloudera btw). Кластер состоит из 12 узлов (8 ячеек) с 24 ГБ оперативной памяти и 2 ТБ диска, каждый из которых сконфигурирован для 8 карт, 8 редукторов (6/6 на namenode).
Я также попытался создать временную таблицу в качестве сжатого sequencefile с INSERT INTO SELECT, но ВСТАВИТЬ просто слишком долго ...
У меня есть подозрение, что там может быть что-то не так с самим рабочим процессом, и не только кластер/конфигурация.
Любые советы приветствуются.
Отвечая на мой собственный вопрос: многопользовательские вставки - это решение. Через некоторую магию теперь требуется 20 минут для запуска всего набора бухгалтерских услуг. * сбитый с толку * – Mario
Ну, это было преждевременно. Повторяя то же самое, он вернулся к исходной среде исполнения. – Mario
Какова ваша сеть и использование диска? –