从AINotebook / Jupyter运行的Apache Beam / GCP数据流

时间:2019-11-07 15:10:49

标签: google-cloud-platform jupyter-notebook google-cloud-dataflow apache-beam

我们最近将基础结构迁移到了GCP,我们热衷于将 DataProc (Spark)和 DataFlow (Apache Beam)用于我们的数据管道。 Dataproc是使它正常工作的一种直接方法,但是运行Dataflow却使我们头疼:

我们如何从JupyterNotebook(如AI笔记本)中运行数据流作业

以下示例为例,我确实有一个庞大的数据集,我想对其进行grou_by,然后进行过滤和一些计算,然后将其写入特定存储桶中的对象(现在此代码,我不知道如何,就是删除存储桶,而不是做一些有用的事情

<?php
  namespace stevongo\beleg;  

    class user_pageNotFound {

        public function pageNotFound() {
          return 'page was not found!';
        }
?>

1)它不起作用,但是可以运行! 2)如果我将import datetime, os def preprocess(in_test_mode): import shutil, os, subprocess job_name = 'hola' if in_test_mode: print('Launching local job ... hang on') OUTPUT_DIR = './preproc' shutil.rmtree(OUTPUT_DIR, ignore_errors=True) os.makedirs(OUTPUT_DIR) else: print('Launching Dataflow job {} ... hang on'.format(job_name)) OUTPUT_DIR = 'gs://experimentos-con-humanos/'.format(BUCKET) try: subprocess.check_call('gsutil -m rm -r {}'.format(OUTPUT_DIR).split()) except: pass options = { 'staging_location': os.path.join(OUTPUT_DIR, 'temp'), 'temp_location': os.path.join(OUTPUT_DIR, 'temp'), 'job_name': job_name, 'project': PROJECT, 'region': REGION, 'teardown_policy': 'TEARDOWN_ALWAYS', 'no_save_main_session': True, 'max_num_workers': 6 } opts = beam.pipeline.PipelineOptions(flags = [], **options) if in_test_mode: RUNNER = 'DataflowRunner' else: RUNNER = 'DataflowRunner' p = beam.Pipeline(RUNNER, options = opts) (p | 'ReadTable' >> beam.io.Read(beam.io.BigQuerySource(table_spec)) | 'hashAsKey' >> beam.Map(lambda r: (r['afi_hash'], r)) | 'Transpose' >> beam.GroupByKey() | 'Filtro menos de 12' >> beam.Filter(lambda r: len(r[1]) >= 12 ) | 'calculos' >> beam.Map(calculos) #| 'Group and sum' >> beam. #| 'Format results' >> beam. | 'Write results' >> beam.Map(lambda r: print(r)) | '{}_out'.format(1) >> beam.io.Write(beam.io.WriteToText(os.path.join(OUTPUT_DIR, '{}.csv'.format(1)))) ) job = p.run() if in_test_mode: job.wait_until_finish() print("Done!") preprocess(in_test_mode = False) 更改为'DataflowRunner',则该代码有效,这意味着它在本地有效 3)如果我不进行更改,则该作业将不会出现在Dataflow中,相反,它将删除其工作所在的GCP存储桶

PD:我确实具有存储,数据流和BigQuery的管理员权限 PD2:该表确实存在,并且我已经仔细检查了存储桶是否具有确切的名称 PD3:我想在Jupyter笔记本上使用它,但是如果有人想知道的话就没有必要

1 个答案:

答案 0 :(得分:1)

如评论中所述,问题似乎出在预处理部分。特别是,这部分在本地工作或使用DataflowRunner时执行的方式有所不同:

if in_test_mode:
    print('Launching local job ... hang on')
    OUTPUT_DIR = './preproc'
    shutil.rmtree(OUTPUT_DIR, ignore_errors=True)
    os.makedirs(OUTPUT_DIR)
else:
    print('Launching Dataflow job {} ... hang on'.format(job_name))
    OUTPUT_DIR = 'gs://experimentos-con-humanos/'.format(BUCKET)
    try:
        subprocess.check_call('gsutil -m rm -r {}'.format(OUTPUT_DIR).split())
    except:
        pass

似乎负责删除存储桶内容(用于输出,临时文件等)。还要注意,在该示例中,您实际上并未将BUCKET添加到OUTPUT_DIR