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

Google cloud platform 从AINotebook/Jupyter运行的Apache Beam/GCP数据流,google-cloud-platform,jupyter-notebook,google-cloud-dataflow,apache-beam,Google Cloud Platform,Jupyter Notebook,Google Cloud Dataflow,Apache Beam,我们最近将我们的基础架构迁移到GCP,我们热衷于将DataProc(Spark)和DataFlow(Apache Beam)用于我们的数据管道。Dataproc有点直截了当,但运行Dataflow让我们头疼: 如何从JupyterNotebook(如AI笔记本)运行数据流作业 下面是一个例子,我确实有一个巨大的数据集,我想对它进行分类,然后进行筛选和一些计算,然后它应该在一个特定的bucket中写入一个对象(现在我不知道如何删除bucket,而不是做一些有用的事情) 1) 它不工作,但它运行!

我们最近将我们的基础架构迁移到GCP,我们热衷于将DataProc(Spark)和DataFlow(Apache Beam)用于我们的数据管道。Dataproc有点直截了当,但运行Dataflow让我们头疼:

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

下面是一个例子,我确实有一个巨大的数据集,我想对它进行分类,然后进行筛选和一些计算,然后它应该在一个特定的bucket中写入一个对象(现在我不知道如何删除bucket,而不是做一些有用的事情)

1) 它不工作,但它运行! 2) 如果我将
'DataflowRunner'
更改为
'DirectRunner'
,则该代码可以工作,这意味着它可以在本地工作 3) 如果我不改变这一点,作业将不会出现在数据流中,相反,它将删除它工作的GCP bucket

PD:我确实拥有存储、数据流和BigQuery的管理员权限 PD2:表确实存在,我拥有的Bucket cuadruple检查它是否具有确切的名称
PD3:我想让它在Jupyter笔记本上运行,但如果有人想知道,这是没有必要的。正如评论中所说,问题似乎在预处理部分。特别是,在本地工作或使用
DataflowRunner
时执行的这一部分不同:

如果处于测试模式:
打印('正在启动本地作业…请稍候')
输出_DIR='./预处理'
rmtree(OUTPUT\u DIR,ignore\u errors=True)
os.makedirs(输出目录)
其他:
打印('启动数据流作业{}…挂起'。格式(作业名称))
OUTPUT_DIR='gs://experimentos-con-humanos/'。格式(BUCKET)
尝试:
subprocess.check_调用('gsutil-mrm-r{}.format(OUTPUT_DIR.split())
除:
通过

似乎负责删除存储桶内容(用于输出、临时文件等)。还请注意,在本例中,您并没有实际将
BUCKET
添加到
OUTPUT\u DIR

,正如注释中所述,问题似乎在预处理部分。特别是,在本地工作或使用
DataflowRunner
时执行的这一部分不同:

如果处于测试模式:
打印('正在启动本地作业…请稍候')
输出_DIR='./预处理'
rmtree(OUTPUT\u DIR,ignore\u errors=True)
os.makedirs(输出目录)
其他:
打印('启动数据流作业{}…挂起'。格式(作业名称))
OUTPUT_DIR='gs://experimentos-con-humanos/'。格式(BUCKET)
尝试:
subprocess.check_调用('gsutil-mrm-r{}.format(OUTPUT_DIR.split())
除:
通过

似乎负责删除存储桶内容(用于输出、临时文件等)。还要注意的是,在这个示例中,您实际上并没有将
BUCKET
添加到
OUTPUT\u DIR

中,您是否能够在笔记本环境之外运行数据流作业?您还可以再次检查一下是否遵循了Python快速入门指南中的说明吗?我想确保您启用了正确的API,并正确设置了服务帐户密钥。@Cubez-tks对于响应,我们可以使用.py来完成。我们已经启用了API,授予ai笔记本网络用户权限。关于服务密钥:我想如果它是一个AI笔记本,理论上应该不需要它。当我们在笔记本外运行时,它显示“工作流失败”。原因:Dataflow服务帐户无法访问网络默认值或无法访问网络默认值```看起来您实际上是在删除第一条
if
语句中的所有内容。在构建
OUTPUT\u DIR
时是否缺少
{}
?是的,去掉了if语句,使其更适合于Jupyter类的工作。现在,我的问题似乎更多地与此相关:。如果你愿意写它作为答案,我可以给你绿色的勾号!感谢您确认并添加答案。您是否能够在笔记本环境之外运行数据流作业?您还可以再次检查一下是否遵循了Python快速入门指南中的说明吗?我想确保您启用了正确的API,并正确设置了服务帐户密钥。@Cubez-tks对于响应,我们可以使用.py来完成。我们已经启用了API,授予ai笔记本网络用户权限。关于服务密钥:我想如果它是一个AI笔记本,理论上应该不需要它。当我们在笔记本外运行时,它显示“工作流失败”。原因:Dataflow服务帐户无法访问网络默认值或无法访问网络默认值```看起来您实际上是在删除第一条
if
语句中的所有内容。在构建
OUTPUT\u DIR
时是否缺少
{}
?是的,去掉了if语句,使其更适合于Jupyter类的工作。现在,我的问题似乎更多地与此相关:。如果你愿意写它作为答案,我可以给你绿色的勾号!谢谢确认,现在添加答案
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)