Napisałem prosty przepływ MapReduce, aby odczytać w wierszach z pliku CSV z pliku w Google Cloud Storage, a następnie utworzyć Entity. Jednakże, wydaje mi się, że nie można go uruchomić na więcej niż jednym fragmencie.Jak zmniejszyć mapę AppEngine, aby zmniejszyć skalę?
Ten kod korzysta z mapreduce.control.start_map i wygląda mniej więcej tak.
class LoadEntitiesPipeline(webapp2.RequestHandler):
id = control.start_map(map_name,
handler_spec="backend.line_processor",
reader_spec="mapreduce.input_readers.FileInputReader",
queue_name=get_queue_name("q-1"),
shard_count=shard_count,
mapper_parameters={
'shard_count': shard_count,
'batch_size': 50,
'processing_rate': 1000000,
'files': [gsfile],
'format': 'lines'})
Mam shard_count w obu miejscach, ponieważ nie jestem pewien, jakie metody faktycznie tego potrzebują. Ustawienie shard_count w dowolnym miejscu od 8 do 32, nic nie zmienia, ponieważ strona stanu zawsze mówi o 1/1 odłamkach. Aby oddzielić rzeczy, zrobiłem wszystko uruchomione w kolejce backendu z dużą liczbą instancji. Próbowałem dostosować parametry kolejki per this wiki. W końcu wydaje się, że działa się tylko seryjnie.
Wszelkie pomysły? Dzięki!
Update (Wciąż bez powodzenia):
W próbuje izolować rzeczy, próbowałem wykonywanie połączenia przy użyciu połączenia bezpośrednie do rurociągu tak:
class ImportHandler(webapp2.RequestHandler):
def get(self, gsfile):
pipeline = LoadEntitiesPipeline2(gsfile)
pipeline.start(queue_name=get_queue_name("q-1"))
self.redirect(pipeline.base_path + "/status?root=" + pipeline.pipeline_id)
class LoadEntitiesPipeline2(base_handler.PipelineBase):
def run(self, gsfile):
yield mapreduce_pipeline.MapperPipeline(
'loadentities2_' + gsfile,
'backend.line_processor',
'mapreduce.input_readers.FileInputReader',
params={'files': [gsfile], 'format': 'lines'},
shards=32
)
Z tym nowym kodem, to nadal działa tylko na jednym fragmencie. Zaczynam się zastanawiać, czy mapreduce.input_readers.FileInputReader ma możliwość równoległego wprowadzania danych po linii.
Tak, nie ma nic dziwnego w moim kodowaniu newline i jest w stanie przetworzyć każdą linię dobrze, po prostu nie ma podziału na szczegółowość linii. W rzeczywistości, kiedy dzielę naprawdę duży plik na mniejsze pliki (na przykład 5000 linii). Dostaję wezwanie do mapreduce do odstrojenia, ale wygląda na to, że jest ono podzielone według nazw plików, a nie na drobniejszą ziarnistość. –