Передать параметры улья в EMR Step - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь использовать EMR для запуска запроса к ВНЕШНЕЙ таблице, разбитой по дате, где раздел dt имеет формат YYYYmmdd i.e: 20190121.

CREATE EXTERNAL TABLE `my_schema`.`tracking_table`(
  `id` string,
  `active_bitmap` string)
PARTITIONED BY (
  `dt` string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  'quoteChar'='\"',
  'separatorChar'='\t')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://bucket/trackingtable'

Я создал простой скрипт, который вставляет результаты, разделенные вкладками и сжимаемые в gzip, в мое ведро S3.

set hive.cli.print.header=true;
set mapred.output.compress=true;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;

INSERT OVERWRITE DIRECTORY '${OUTPUT}/dt={:start_date}/'
select if(b.id is null,a.id,b.id) as id
       ,if(b.days_active is null, 1, (shiftleft(CAST(b.days_active AS BIGINT),1))|if(a.is_active is null,0,1) ) as active_bitmap
       ,'{:start_date}' as dt_partition
from(
    select id,
    if(count(1) > 0, 1, NULL) as is_active
    from my_schema.activity_table where dt='{:start_date}' group by id
)a
full outer join(
    select * from my_schema.tracking_table where dt='{:start_date-1}'
)b on a.id=b.id;

Я протестировал свой сценарий на консоли HIVE, заменив параметры ${OUTPUT}, {:start_date} и {:start_date-1} значениями, и он работает нормально. Я вижу результаты, сжатые и разделенные вкладками, в моем выводе S3.

Теперь я хочу запустить этот скрипт программно для данных за последний год. Как я могу передать параметр даты в мой шаг EMR? Я вижу, что есть раздел аргументов по EMR, но я предполагаю, что это для параметров конфигурации кластера EMR.

Кроме того, {:start_date-1} будет работать для моего формата даты или мне нужно проанализировать строковую дату как дату, вычесть день и снова разобрать ее как строку?

Я планировал создать сценарий Python, который принимает диапазон дат и передает каждый шаг в длительный кластер EMR, но я не знаю, как передать дату в качестве параметра, и я не могу найти какие-либо учебные пособия о том, как сделать это легко.

1 Ответ

0 голосов
/ 16 мая 2019

Чтобы передать параметры в задание EMR HIVE, либо:

В веб-консоли EMR Step

Добавить

-d parameter1 -d parameter2

1008 * то есть *

-d dt=20190101 -d dt2=20190201

В разделе аргументов шага EMR

Или в AWS cli добавьте параметры в раздел ARGS. то есть:

aws emr add-steps --cluster-id j-xxxxx --steps Type=HIVE,Name='Hive Job Name XXX',ActionOnFailure=CONTINUE,Args=[-f,s3://bucket/folder/,-d,INPUT=s3://bucket/folder/input/,-d,OUTPUT=s3://s3://bucket/folder/output/,-d,dt=20190101,-d,dt2=20190201]

Подробнее:

https://docs.aws.amazon.com/cli/latest/reference/emr/add-steps.html

...