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