Използвам Google Cloud Dataflow за Python SDK, за да чета в 200k+ обекта от хранилище за данни, като използвам функцията ReadFromDatastore()
на заявка без никакви филтри.
def make_example_entity_query():
"""
make an unfiltered query on the `ExampleEntity` entity
"""
query = query_pb2.Query()
query.kind.add().name = "ExampleEntity"
return query
След това върша малко работа в процес на работа с тази заявка
p = beam.Pipeline(options=PipelineOptions.from_dictionary(pipeline_options))
(
p
| 'read in the new donations from Datastore'
>> ReadFromDatastore(project, query, None)
|'protobuf2entity transformation'
>> beam.Map(entity_from_protobuf)
| 'do some work or something'
>> beam.Map(lambda item: item[0] + item[1])
)
return p.run()
това работи добре локално, използвайки тестови данни от порядъка на няколко хиляди записа, но когато го внедря в облака и го стартирам в нашата производствена база данни с 200k+ елемента, той просто изтече след около час, без да има никакъв напредък. Изглежда, че е изцяло заседнал в прочетената част.
също така показва, че са прочетени нула елементи
и изглежда, че само един работник е бил завъртян
Така че не съм много сигурен какво става тук. Въпросите ми са
- има ли някакво разумно ограничение за количеството данни, които могат да бъдат прочетени от хранилището за данни като вход към тръбопровода?
- защо привидно изобщо няма данни, които да го направят в тръбопровода? Ако стартирам това локално, мога да видя данните, които преминават, макар и доста бавно.
- защо има само един работник, който се върти? Знам, че ако имате филтри за операцията за четене, това кара четенето да се извършва от един възел, но това се прави без филтри за неравенство при четенето от хранилището за данни.