Computação integrada em lote do Flink Stream (12): construção da API de tabela PyFlink

Índice

1. Crie tabelas de origem e resultado.

Crie e registre tabelas com nomes de origem e destino, respectivamente

Use o método TableEnvironment.execute_sql() para registrar as tabelas de origem e resultado por meio de instruções DDL

2. Crie um trabalho

3. Envio de trabalhos PyFlink


1. Crie tabelas de origem e resultado.

Crie e registre tabelas com nomes de origem e destino, respectivamente

Dentre elas, a tabela source source possui uma coluna: word, que representa a palavra lida do arquivo de entrada especificado por input_path;

O coletor da tabela de resultados tem duas colunas: palavra e contagem, e o resultado desta tabela será enviado para o arquivo de saída especificado por output_path.

tabela de origem

t_env.create_temporary_table(
    'source',
    TableDescriptor.for_connector('filesystem')
        .schema(Schema.new_builder()
                .column('word', DataTypes.STRING())
                .build())
        .option('path', input_path)
        .format('csv')
        .build())
tab = t_env.from_path('source')

mesa de pia

t_env.create_temporary_table(
    'sink',
    TableDescriptor.for_connector('filesystem')
        .schema(Schema.new_builder()
                .column('word', DataTypes.STRING())
                .column('count', DataTypes.BIGINT())
                .build())
        .option('path', output_path)
        .format(FormatDescriptor.for_format('canal-json')
                .build())
        .build())

Use o método TableEnvironment.execute_sql() para registrar as tabelas de origem e resultado por meio de instruções DDL

my_source_ddl = """
    create table source (
        word STRING
    ) with (
        'connector' = 'filesystem',
        'format' = 'csv',
        'path' = '{}'
    )
""".format(input_path)

my_sink_ddl = """
    create table sink (
        word STRING,
        `count` BIGINT
    ) with (
        'connector' = 'filesystem',
        'format' = 'canal-json',
        'path' = '{}'
    )
""".format(output_path)
t_env.execute_sql(my_source_ddl)
t_env.execute_sql(my_sink_ddl)

2. Crie um trabalho

A tarefa lê dados da origem da tabela, executa algumas transformações e grava os resultados no coletor da tabela.

Por fim, tudo o que precisa ser feito é iniciar o trabalho da API de tabela do Flink Python.

Todas as operações acima, como criar a tabela de origem, realizar transformações e escrever a tabela de resultados são apenas para construir o diagrama lógico do trabalho. Somente quando execute_insert(sink_name) é chamado, o trabalho será realmente enviado para o cluster ou localmente para execução.

@udtf(result_types=[DataTypes.STRING()])
def split(line: Row):
    for s in line[0].split():
        yield Row(s)

# 计算 word count
tab.flat_map(split).alias('word') \
    .group_by(col('word')) \
    .select(col('word'), lit(1).count) \
    .execute_insert('sink') \
    .wait()

3. Envio de trabalhos PyFlink

Crie um programa Python Table API e execute-o em um minicluster local.

python word_count.py

Envie o trabalho para o cluster remoto para execução

flink run --python examples/python/table/word_count.py

Quando um trabalho é executado em um ambiente de minicluster (por exemplo, em um IDE) e as seguintes APIs são usadas no trabalho (como TableEnvironment.execute_sql, Statementset.execute da API Python Table e StreamExecutionEnvironment.execute_async do Python DataStream API), porque essas APIs são assíncronas, lembre-se de aguardar explicitamente a conclusão da execução do trabalho.

Caso contrário, o programa será encerrado antes que a execução da tarefa enviada seja concluída, de modo que o resultado da execução da tarefa enviada não possa ser observado.

Observação: ao enviar uma tarefa para um cluster remoto, não há necessidade de esperar explicitamente a conclusão da tarefa, portanto, antes de enviar uma tarefa para um cluster remoto, lembre-se de remover a lógica do código que aguarda a conclusão da tarefa.

Execute trabalhos de API SQL/Tabela de forma assíncrona

t_result = table_env.execute_sql(...)
t_result.wait()

Execute tarefas DataStream de forma assíncrona

job_client = stream_execution_env.execute_async('My DataStream Job')
job_client.get_job_execution_result().result()

Acho que você gosta

Origin blog.csdn.net/victory0508/article/details/131554728
Recomendado
Clasificación