J'utilise Apache Beam en Python avec Google Cloud Dataflow (2.3.0). Lorsque vous spécifiez le paramètre worker_machine_type comme par exemple n1-highmem-2 ou custom-1-6656, Dataflow exécute le travail mais utilise toujours le type de machine standard n1-standard-1 pour chaque travailleur.

Quelqu'un a-t-il une idée si je fais quelque chose de mal?

Autres sujets (ici et here ) montrent que cela devrait être possible, il pourrait donc s'agir d'une version problème.

Mon code pour spécifier les PipelineOptions (notez que toutes les autres options fonctionnent bien, donc il devrait reconnaître le paramètre worker_machine_type):

def get_cloud_pipeline_options(project):

  options = {
    'runner': 'DataflowRunner',
    'job_name': ('converter-ml6-{}'.format(
        datetime.now().strftime('%Y%m%d%H%M%S'))),
    'staging_location': os.path.join(BUCKET, 'staging'),
    'temp_location': os.path.join(BUCKET, 'tmp'),
    'project': project,
    'region': 'europe-west1',
    'zone': 'europe-west1-d',
    'autoscaling_algorithm': 'THROUGHPUT_BASED',
    'save_main_session': True,
    'setup_file': './setup.py',
    'worker_machine_type': 'custom-1-6656',
    'max_num_workers': 3,
  }

  return beam.pipeline.PipelineOptions(flags=[], **options)

def main(argv=None):
  args = parse_arguments(sys.argv if argv is None else argv)

  pipeline_options = get_cloud_pipeline_options(args.project_id

  pipeline = beam.Pipeline(options=pipeline_options)
6
dumkar 12 avril 2018 à 10:35

3 réponses

Meilleure réponse

PipelineOptions utilise argparse en arrière-plan pour analyser son argument. Dans le cas du type de machine, le nom de l'argument est machine_type mais le nom de l'indicateur est worker_machine_type. Cela fonctionne très bien dans les deux cas suivants, où argparse effectue son analyse et est conscient de cet alias:

  1. Passer des arguments sur la ligne de commande. par exemple. my_pipeline.py --worker_machine_type custom-1-6656
  2. Passer des arguments en tant que drapeaux de ligne de commande, par exemple flags['--worker_machine_type', 'worker_machine_type custom-1-6656', ...]

Cependant, cela ne fonctionne pas bien avec **kwargs. Tous les arguments supplémentaires transmis de cette manière sont utilisés pour remplacer les noms d'arguments connus (mais pas les noms d'indicateurs).

En bref, l'utilisation de machine_type fonctionnerait partout. J'ai déposé https://issues.apache.org/jira/browse/BEAM-4112 pour que cela soit corrigé dans Beam à l'avenir.

3
Szere Dyeri 18 avril 2018 à 01:26

Cela peut être résolu en utilisant l'indicateur machine_type au lieu de worker_machine_type. Le reste du code fonctionne bien.

La documentation mentionne donc un nom de champ incorrect.

2
dumkar 13 avril 2018 à 06:57

Ce qui a fonctionné pour moi dans Apache Beam 2.8.0 était de mettre à jour cette ligne du code source en remplaçant --worker_machine_type par --machine_type (puis en utilisant machine_type comme nom du paramètre, comme suggéré dans le autres réponses).

0
Oriol Nieto 5 févr. 2019 à 22:28