Video: Como colocar válvula em lata de gás 2024
Een MapReduce-toepassing verwerkt de gegevens in invoersplitsingen op basis van op recordbasis en dat elke record door MapReduce wordt begrepen als een sleutel / waarde paar. Nadat de invoersplitsingen zijn berekend, kunnen de mapper-taken beginnen met de verwerking ervan - dat wil zeggen, direct nadat de planningsfaciliteit van Resource Manager hen hun verwerkingsresources toewijst. (In Hadoop 1 wijst de JobTracker mapper-taken toe aan specifieke verwerkingsslots.)
De mapper-taak verwerkt zelf de invoersplitsing per record - in de figuur wordt dit alleenstaande record vertegenwoordigd door het sleutel / waarde-paar. In het geval van onze vluchtgegevens, wanneer de invoersplitsingen worden berekend (met behulp van de standaard bestandsverwerkingsmethode voor tekstbestanden), is de aanname dat elke rij in het tekstbestand één record is.
Voor elk record vertegenwoordigt de tekst van de rij zelf de waarde en de bytecompensatie van elke rij vanaf het begin van de splitsing wordt als de sleutel beschouwd.
U vraagt zich misschien af waarom het rijnummer niet wordt gebruikt in plaats van de byte-offset. Wanneer u bedenkt dat een zeer groot tekstbestand wordt opgesplitst in vele individuele gegevensblokken en wordt verwerkt als vele splitsingen, is het rijnummer een risicovol concept.
Het aantal regels in elke splitsing varieert, dus het is onmogelijk om het aantal rijen voorafgaand aan het proces dat wordt verwerkt te berekenen. Met de byte-offset kunt u echter precies zijn, omdat elk blok een vast aantal bytes heeft.
Als een mapper-taak elke record verwerkt, genereert deze een nieuw sleutel / waarde-paar: de sleutel en de waarde hier kunnen volledig verschillen van het invoerpaar. De uitvoer van de mapper-taak is de volledige verzameling van al deze sleutel / waardeparen.
Voordat het laatste uitvoerbestand voor elke mappertaak wordt geschreven, wordt de uitvoer gepartitioneerd op basis van de sleutel en gesorteerd. Deze partitionering betekent dat alle waarden voor elke toets gegroepeerd zijn.
In het geval van de redelijk eenvoudige voorbeeldtoepassing, is er slechts één enkel verloopstuk, dus alle uitvoer van de mappertaak wordt naar een enkel bestand geschreven. Maar in gevallen met meerdere verloopstukken, kan elke mappertaak ook meerdere uitvoerbestanden genereren.
De verdeling van deze uitvoerbestanden is gebaseerd op de partitioneringssleutel. Als er bijvoorbeeld slechts drie verschillende partitiesleutels worden uitgevoerd voor de mapper-taken en u drie verloopstukken voor de taak hebt geconfigureerd, zijn er drie mapper-uitvoerbestanden. In dit voorbeeld, als een bepaalde mapper-taak een invoersplitsing verwerkt en de uitvoer genereert met twee van de drie sleutels, zijn er slechts twee uitvoerbestanden.
Altijd de uitvoerbestanden van uw maptaken comprimeren. Het grootste voordeel is hier in prestatiewinst, omdat het schrijven van kleinere uitvoerbestanden de onvermijdelijke kosten minimaliseert van het overbrengen van de mapper-uitvoer naar de knooppunten waar de verloopstukken worden uitgevoerd.
De standaardpartitioneringsmodule is in de meeste situaties meer dan voldoende, maar soms wilt u mogelijk aanpassen hoe de gegevens worden gepartitioneerd voordat deze door de verkleintellers worden verwerkt. U wilt bijvoorbeeld dat de gegevens in uw resultatensets worden gesorteerd op basis van de sleutel en hun waarden, ook wel secundair genoemd.
Hiertoe kunt u de standaardpartitionering overschrijven en deze zelf implementeren. Dit proces vereist echter enige zorgvuldigheid, omdat u ervoor wilt zorgen dat het aantal records in elke partitie uniform is. (Als een verloopstuk veel meer gegevens moet verwerken dan de andere verloopstukken, wacht u totdat uw MapReduce-taak is voltooid, terwijl het enkele overbodige verloopstuk door de onevenredig grote gegevensset ploetert.)
Met tussenliggende bestanden van uniform formaat gebruikt u kan beter gebruik maken van het parallellisme dat beschikbaar is in MapReduce-verwerking.