Ihre innere für iteriert alle Array so thats, warum Sie immer den gleichen Durchschnitt (die für die gesamte Array), sollten Sie iterieren von 0 auf die aktuelle Zahl der äußeren für statt. Ihre gleitenden Durchschnitt aktualisiert in j Ihrer inneren Basis wird für das bedeutet, es wird die vorherigen Werte jede neue Schleife überschreibt, sollte dies für anstelle der inneren innerhalb der äußeren sein i als Index. Sie teilen sum / j, um Mittelwerte zu berechnen, jede neue innere Schleife j Sie teilen durch 0 die erste Summe. Ich glaube, Sie wollten j1 verwenden, Index ist nicht das gleiche wie aktuelle Länge Tipps zur Fehlerbehebung: Vermeiden Sie die Verwendung von Variablen zu Loop-Arrays, sollten Sie array. length stattdessen verwenden. Für eine Frage der Reproduktion Ihres Problems könnten Sie uns das isolierte Problem anstelle des aktuellen Codes. Dh: Stellen Sie sich vor, wenn der Fehler in Ihren Eingaben ist, wie könnten wir glauben, dass Sie wirklich verwendet sie beantwortet werden Sie sind Looping über alle Daten jedes Mal. Für den innersten Durchschnitt sollten Sie für (int j (igtaverageLengthi-averageLength / 2: 0) jlt iaverageLength / 2 ampamp jltnumDataPoints j) (oder etwas ähnliches) haben. Außerdem sollte movingAverageisum / j modifiziert werden, um den Fall zu bewältigen, wenn j 0 ist. Insbesondere sollte es sich wahrscheinlich um MovingAverageisum / averageLength handeln und es sollte auf den movingAveragei-Slot außerhalb der Mittelungsschleife angewendet werden. Antwortete Oct 4 13 am 20:42 Nächstes Mal, nehmen Sie die Kommentare über die Zuweisung aus der Frage, bevor Sie es. Aber da Sie scheinen ziemlich neu in diesem, darüber nachzudenken, wie würden Sie durch die Daten gehen, und machen es tun. Sie sollten sicherstellen, dass jede Schleife an dem richtigen Punkt stoppt, und denken Sie daran, dass wenn Sie stoppen würden, wenn es keine Zahlen mehr gibt (wie wenn Sie die innere Schleife machen und nur 3 weitere Zahlen anstelle von 4 erhalten können) Muss das Programm auch stoppen. Stellen Sie sicher, dass Ihr Code für diese Überprüfung ist. Antwortete ohne weitere Details, benötigen Sie wahrscheinlich einen ungewichteten gleitenden Durchschnitt. An jedem Punkt Ai im Eingabefeld A der Länge N (mit 0ltiltN), das ist einfach der Mittelwert der vorherigen K Einträge des Arrays, bis einschließlich Ai. Wenn es arent K solche Werte, dann die durchschnittlichen (i1) Werte von A0 bis Ai. Einschließlich. Ein wenig Gedanke zeigt Ihnen, dass Sie nicht alle K-Werte addieren müssen jedes Mal. Halten Sie einfach die Summe und die, wenn sie auf den nächsten Punkt zu bewegen (dies ist ein gleitender Durchschnitt), subtrahieren die Wert, der den neuen Wert ersetzt werden und hinzufügen, die sie ersetzen wird. (Bei den ersten K-1 Punkten fügen Sie einfach den neuen Wert zur Summe hinzu und erhöhen Sie den Zähler um 1.) Der gleitende Durchschnitt ist an jedem Punkt der aktuelle Summe dividiert durch den aktuellen Zählwert. In einem gleitenden Durchschnitt, müssen Sie eine Art von Fenstergröße haben. Ihre Fenstergröße ist averageLength, so dass es so etwas wie folgt aussehen: Die for-Schleife beginnt bei den aktuellen Daten und geht zurück averageLength Datenpunkte und fügt sie auf. Sie haben nur einen gleitenden Durchschnitt, wenn Sie haben, wenn Sie genügend Datenpunkte haben und der Durchschnitt wird die Summe geteilt durch die durchschnittliche Länge haben. Hinweis: Nicht getestet nur Sudo-Code, aber das ist die Idee. Beantwortet Ihre Antwort 2016 Stack Exchange, IncJava Programm zur Berechnung der durchschnittlichen Java-Programm zur Berechnung der durchschnittlichen. Dieses Java-Programm nimmt 5 Integer-Eingabe von Benutzern mit Hilfe der Scanner-Klasse und berechnet den Durchschnitt. Scanner-Klasse ist in Util-Paket vorhanden und seine vollständige Pfad kann als geschrieben werden. Java. util. Scanner. Vor der Berechnung eines durchschnittlichen Integerwertes ist es typecast-ed zu float. Hier ist das Programm. Java-Programm zur Berechnung der durchschnittlichen Output von Java-Programm zu berechnen, durchschnittliche Java-Programm zu berechnen, durchschnittlich Related Posts über Kategorien Post navigation Ein Gedanke auf ldquoJava Programm zu berechnen averagerdquo Hilfe pls. Ich brauche, um ein Programm, das den Mittelwert von drei Zahlen löst: 10, 20, 45 Hinterlasse eine Antwort Antworten abbrechen E-Mail Newsletter Aktuelle Beiträge JOIN US auf FACEBOOK Code CodingCloudera Engineering Blog Einfache Moving Average, Sekundäre Sortierung und MapReduce (Teil 3) Dies Ist das letzte Stück zu einer dreiteiligen Blog-Serie. Wenn Sie die vorherigen Teile zu dieser Serie sehen möchten, verwenden Sie bitte den folgenden Link: Bisher habe ich erklärt, wie die Verwendung von Excel und R als Analysetools, um die Simple Moving Average von einem kleinen Satz von Aktien Schlusskurse zu berechnen. In diesem letzten Stück zu den drei Teil Blog-Serie, werde ich in die Verwendung von MapReduce, um die Simple Moving Average unserer kleinen Beispiel-Datensatz zu finden. Dann werde ich Ihnen zeigen, wie mit dem gleichen Code, werden Sie in der Lage, die Simple Moving Average von jedem Schlusskurs Aktienkurs seit 1980. Down the Rabbit Hole mit Hadoop In den oben genannten Beispielen haben wir einen Blick auf die Berechnung der einfachen gleitenden Durchschnitt Einer relativ kleinen Datenmenge. Für viele Analysen, Excel und R sind sehr effektive Werkzeuge, aber da wir in Richtung Gigabyte, Terabyte und Petabyte Datenspeicher skaliert laufen wir in einige Probleme mit Daten Lokalität, Festplattengeschwindigkeiten und Verarbeitungsgeschwindigkeiten. Um diese Faktoren zu veranschaulichen, nehmen wir eine mythische Maschine an, die eine einzelne Petabyte-Platte hatte, die heute ähnlich zu den Plattengeschwindigkeiten funktionierte. Für die Zwecke dieses Beispiels verwenden Sie eine Lesegeschwindigkeit von 40 MB / s. Sagen wir, dass unsere Aufgabe, diese Daten zu scannen und einen einfachen gleitenden Durchschnitt zu erzeugen, den Prozessor nicht beeinträchtigt die Berechnung, und wir können eine bewegte Fenster Berechnung durch die Daten an der vollen 40 MB / s zu erhalten. Wir gehen davon aus, dass die Daten zuvor sortiert wurden und dass wir nur einen sequentiellen Scan durchführen mussten, um so die Datendurchsatzrate von der Festplatte zu maximieren, und es konnte konsequent 40MB / s an die Verarbeitungspipeline liefern. Basierend auf Jeff Deans 12 Numbers Jeder Ingenieur sollte wissen, dies ist ein plausibles Setup. Bei diesem Durchsatz würde unsere einfache gleitende Durchschnittsberechnung von 1 Petabyte Daten etwa 310 Tage dauern. Für die meisten Situationen, diese Betriebskosten, in Bezug auf die Zeit, macht es unangemessen zu berücksichtigen. Glücklicherweise reduzieren die Mechanismen von HDFS und MapReduce diese Faktoren, so dass wir dieses Problem eine lineare Zeit und Kapital-Funktion, um uns zu entscheiden, die Zahl der Maschinen, die wir implementieren wollen, um effizient unternehmen diese einfache gleitende durchschnittliche Scan. In dem obigen einfachen gleitenden Durchschnittsbeispiel vernachlässigten wir die Einschränkungen von: Speichern des Petabyte von Daten auf nicht-mythischer Hardware. Sortierung der Petabyte von Daten. Angesichts Hardware-Ausfall während der 310 Tage der Bearbeitungszeit. Typischerweise müssen Zeitreihen-Anwendungen die Daten an einem gewissen Punkt abtasten, was große Berge erzeugt, um zu klettern, wenn wir große Zonen von Zeitreihendaten in heutigen Systemen ansprechen möchten. Wurden Multi-Terabyte-und Multi-Petabyte-Datenquellen in der Zeitreihe Domain jeden Tag, einschließlich und in jeder dieser Domains die oben genannten Szenario ist eine sehr echte Herausforderung zu bewältigen. HDFS löst die oben genannten Speicher - und Fehlerprobleme, aber was ist mit den Sortier - und Verarbeitungsproblemen Die Sortierung großer Datenmengen an sich ist ein nicht-triviales Problem, ist aber mit ein paar Tricks in MapReduce zugänglich. Werfen wir einen Blick auf realen MapReduce-Code, den wir herunterladen können, zu kompilieren und produzieren unsere eigenen skalierbaren einfachen gleitenden Durchschnitt, um einige dieser Schmerzen zu lösen. Einfacher verschiebender Durchschnitt in MapReduce Typischerweise besteht eine MapReduce-Anwendung aus zwei Funktionen: (Sie ahnen es) eine Kartenfunktion und eine reduzierende Funktion. In der Welt der Java-Programmierung erstellen wir eine Map-Klasse und eine reduzieren Klasse, die jeweils mit erben Methoden für ihre respektvolle Zwecke nützlich. Wir verwenden das MapReduce-Programmiermodell, weil es gebaut wird, um Gleichzeitigkeitsprobleme in unseren Algorithmen zu verringern, und wir erhalten unsere skalierbare Parallelität relativ schmerzlos. Die Kartenfunktion kann Code beinhalten, der eine pro-Schlüssel-Wert-Paaroperation ausführt, aber ihre logische Hauptoperation besteht darin, Daten durch Schlüssel zu gruppieren. Eine sehr einfache Möglichkeit, über eine Kartenfunktion nachzudenken, besteht darin, sie als logische Projektion der Daten oder einer group-by-Klausel zu betrachten. Die reduzierte Funktion wird verwendet, um diese Gruppen einzeln aufzunehmen und einen Prozess über die gruppierten Werte auszuführen. Gemeinsame Operationen in reduzierenden Funktionen umfassen: In unserem einfachen gleitenden Durchschnittsbeispiel arbeiten wir jedoch nicht auf einer pro Wertbasis, und wir erzeugen auch keine Aggregate über alle Werte hinweg. Unser Betrieb im aggregierten Sinne beinhaltet ein Schiebefenster, das seine Operationen auf einer Teilmenge der Daten bei jedem Schritt ausführt. Wir müssen auch berücksichtigen, daß die Punkte in unseren Zeitreihendaten nicht garantiert werden können, um die Reduktion zu erreichen, und müssen in den vorangegangenen Abschnitten sortiert werden. Dies liegt daran, dass bei mehreren Kartenfunktionen, die mehrere Abschnitte der Quellendaten lesen, keine Zuordnung von MapReduce zu den Schlüsselwertpaaren erfolgt, die in den Standard-Partitions - und Sortierungsschemata zusammengefasst sind. Es gibt das Szenario, wo wir partitionierte Daten sortiert haben, aber im Interesse dieses Beispiels würden wir uns mit dem mehr Garten-Vielfalt unsortierten Zeitreihendaten beschäftigen. Machen wir einen ersten Durchlauf, wie wir diese MapReduce einfachen gleitenden durchschnittlichen Job entwerfen konnten. Wir wollen alle Werte einer Gruppe zusammenfassen, die eng miteinander zusammenhängen, so dass wir die einfache gleitende Durchschnittsoperation über die sortierten Zeitreihendaten anwenden können. Wir wollen jedes Zeitreihen-Schlüsselwertpaar auf ein Aktiensymbol ausgeben, um diese Werte zusammen zu gruppieren. In der reduzierten Phase können wir eine Operation, hier den einfachen gleitenden Durchschnitt, über die Daten ausführen. Da die Daten mehr als wahrscheinlich nicht an den Reduzierer in sortierter Reihenfolge ankommen, müssen wir die Daten sortieren, bevor wir den einfachen gleitenden Durchschnitt berechnen können. Ein häufiger Weg, um Daten zu sortieren ist, die Daten in den Speicher in einer Datenstruktur wie ein Heap laden, ähnlich wie dies in einem normalen Java-Programm durchgeführt wird. Verwenden Sie in diesem Fall die Javas-Prioritätswarteschlangenklasse, um unsere Daten zu sortieren. Wir müssen auch die Größe des Speichers berücksichtigen, der von den eingehenden Zeitreihendaten während der Sortierung verwendet wird, da dies ein einschränkender Faktor für die Menge der Daten ist, die wir sortieren können. In diesem Entwurf müssen wir alle Zeitreihendaten laden, bevor wir die Verarbeitung starten können und wenn die zu sortierende Datenmenge die verfügbare Heapgröße übersteigt, haben wir ein Problem. Ein Beispiel für diese Implementierung wird bei github gehostet: Um diesen Code auf Ihrem eigenen Hadoop-Cluster auszuführen, laden Sie CDH von Cloudera herunter und richten Sie einen pseudo-verteilten Cluster 8211 ein, der ein einzelner Knoten von Hadoop ist. Pseudo-verteilter Modus ist eine große Weise, Code mit Hadoop auszuprobieren. Nächsten Download und kompilieren Sie den gleitenden Durchschnitt Code in ein Glas. Um den Code direkt von github herunterzuladen (in der Shell im MacOSX, ssh-Terminalfenster in linux oder MINGW32 für win32), verwenden wir den Befehl: Unser erster Pass ist eine anständige Lösung, wurde aber von unserem Java Virtual Machine (JVM) - Kind begrenzt Heap-Größe, und wir nehmen uns Zeit, die Daten selbst manuell zu sortieren. Mit einigen Konstruktionsänderungen können wir diese beiden Probleme lösen, indem wir einige der inhärenten Eigenschaften von MapReduce nutzen. Zuerst wollen wir den Fall der Sortierung der Daten im Speicher auf jedem Reduzierer betrachten. Derzeit müssen wir sicherstellen, dass wir nie mehr Daten an ein einziges Reduzierstück senden, als im Speicher passen können. Die Art und Weise, wie wir dies derzeit kontrollieren können, besteht darin, jedem Reduktionskind JVM mehr Heap zu geben und / oder unsere Zeitreihendaten in der Kartenphase weiter zu partitionieren. In diesem Fall wed Partition weiter durch die Zeit, brechen unsere Daten in kleinere Fenster der Zeit. Im Gegensatz zu einer weiteren Partitionierung der Daten, ist ein weiterer Ansatz für dieses Problem zu ermöglichen Hadoop, um die Daten für uns in der sogenannten Shuffle-Phase von MapReduce zu sortieren. Wenn die Daten an einem Reduzierer bereits in sortierter Reihenfolge ankommen, können wir unseren Speicherbedarf senken und die Anzahl von Schleifen durch die Daten reduzieren, indem wir nur die nächsten N Abtastwerte für jede einfache gleitende Durchschnittsberechnung ansehen. Dies bringt uns auf den entscheidenden Aspekt dieses Artikels, die so genannte shuffles sekundäre Art Mechaniker. Sortierung ist etwas, das wir Hadoop für uns lassen können und Hadoop hat sich als sehr gut bei der Sortierung großer Datenmengen bewährt und gewann den Grey Sort-Wettbewerb im Jahr 2008. Bei der Verwendung der sekundären Sortiermechaniker können wir sowohl unsere Heap-und sortieren Fragen ziemlich einfach lösen Und effizient. Um die sekundäre Sortierung in unserem Code zu verwenden, müssen wir den Schlüssel zu einem Komposit aus dem natürlichen Schlüssel und dem natürlichen Wert machen. Unten in Abbildung-1 sehen wir ein Diagramm, wie dies visuell aussehen würde. Abbildung 1: Zusammengesetztes Schlüsseldiagramm Der zusammengesetzte Schlüssel gibt Hadoop die benötigten Informationen während des Shuffles, um eine Sortierung nicht nur auf dem 8220stock symbol8221 durchzuführen, sondern auch auf dem Zeitstempel. Die Klasse, die diese Composite Keys sortiert, wird als Schlüsselkomparator oder hier 8220CompositeKeyComparator8221 bezeichnet. Der Schlüsselvergleicher sollte durch die zusammengesetzte Taste, die die Kombination aus dem natürlichen Schlüssel und dem natürlichen Wert ist, bestellen. Wir sehen unten in Abbildung-2, wo eine abstrakte Version der sekundären Sortierung auf einem zusammengesetzten Schlüssel von 2 ganzen Zahlen durchgeführt wird. Abbildung-2: CompositeKeyComparator Sortierung Composite Keys (Schlüssel sind Ganzzahlen). In Abbildung-3 unten sehen wir ein realistischeres Beispiel, in dem wir den zusammengesetzten Schlüssel geändert haben, um eine Lager-Symbolkette (K1) und einen Zeitstempel (K2, angezeigt als ein Datum, aber in dem Code ist eine lange in ms) zu haben. Das Diagramm hat die K / V-Paare durch beide 8220K1 sortiert: Lager-Symbol8221 (natürliche Taste) und 8220K2: Zeitstempel8221 (Sekundärschlüssel). Abbildung 3: CompositeKeyComparator bei der Arbeit an unseren zusammengesetzten Tasten. Zusammengesetzte Taste wird nun mit einem String-Stock-Symbol (K1) und einem Datum (K2) dargestellt. Sobald wir unsere Daten auf dem zusammengesetzten Schlüssel sortiert haben, müssen wir nun die Daten für die reduzierte Phase partitionieren. In Abbildung 4 sehen wir, wie die Daten aus Abbildung 3 oben mit dem NaturalKeyPartitioner partitioniert wurden. Abbildung 4: Partitionierung durch den natürlichen Schlüssel mit dem NaturalKeyPartitioner. Nachdem wir unsere Daten partitioniert haben, können die Reduzierer nun mit dem Herunterladen der Partitionsdateien beginnen und ihre Zusammenführungsphase beginnen. In Abbildung 5 sehen wir, wie der Gruppierungskomparator oder NaturalKeyGroupingComparator verwendet wird, um sicherzustellen, dass ein reduzierter () Aufruf nur die logisch gruppierten Daten für diesen zusammengesetzten Schlüssel sieht. Abbildung 5: Gruppieren von Komparatoren, die Partitionsdateien zusammenführen. Der Partitionierer und Gruppierungsvergleicher für die zusammengesetzte Taste sollte nur den natürlichen Schlüssel für die Partitionierung und Gruppierung berücksichtigen. Unten ist eine kurze Beschreibung des Simple Moving Average-Codes, der geändert wird, um die sekundäre Sortierung zu verwenden, und wird auf Github gehostet. Wenn Sie bemerken, passen die Namen der Klassen eng mit der in den obigen Diagrammen verwendeten Terminologie und in Tom Whites Hadoop: The Definitive Guide (Kapitel 8 MapReduce Features) zusammen, um den Code leichter verständlich zu machen. NaturalKey 8211, was Sie normalerweise als Schlüssel oder Gruppe nach Operator verwenden würden. In diesem Fall ist der Natural Key das Gruppen - oder Aktiensymbol, da potenziell unsortierte Bestandsdaten gruppiert werden müssen, bevor wir sie sortieren und den einfachen gleitenden Durchschnitt berechnen können. Composite Key 8211 Ein Schlüssel, der eine Kombination aus dem natürlichen Schlüssel und dem natürlichen Wert ist, den wir sortieren möchten. 5 Antworten auf ldquo Einfache Moving Average, Sekundäre Sortierung und MapReduce (Teil 3) rdquo Cool Trick mit dem Split-Sortierer / Partitioner. Soweit ich kann sagen, diese Werke groß, bis die Serie extrem lange (denken 30 Jahre Tick-Level-Daten) 8211 scheint wie die Partitionierung von Zeit könnte sehr schwierig sein. Weißt du, was in hadoop wie ein 8220overlappende partitioner8221, die die gleichen Daten auf mehrere Partitionen spucken kann ich mit Mappern, die Werte über mehrere Schlüssel dupliziert haben gespuckt haben, aber ich frage mich, ob there8217s eine konventionellere Methode, dies zu tun. Evan, Sie sind tot mit der Größe der Daten in einem einzigen Keyspace. Ich habe das gleiche Problem bei der Arbeit an dem openPDC-Projekt für die NERC: Ein Sensor könnte buchstäblich Milliarden von Punkten in einer sehr kurzen Zeit, so für Prototyp-Aufträge haben wir die Dinge an einem einzigen Tag (3.600.000ms): In einem mehr Komplexe Version würde ich überlappende Zeitschlitze verwendet haben, damit der Mapper ausreichende Daten aus benachbarten Schlüsselräumen erhalten würde, um eine einzelne Fensterlänge zu bedecken. Für jetzt I8217d sagen, Sie sind auf dem richtigen Weg mit den doppelten Werten. Ich weiß, dies ist nicht im Zusammenhang mit gleitenden Durchschnitten, aber wie genau war die SAX-Zeitreihen-Matching in PDC verwendet habe ich so etwas implementiert (mit Ausnahme der MapReduce API 2), und in der Schleife der reduzieren () - Funktion, wenn die. Next () - Methode auf dem Iterator aufgerufen wird, erhalten wir einen neuen Wert, aber der Schlüssel ändert sich auch wunderbar. Vielmehr ändert sich der Teil des zusammengesetzten Schlüssels, der nicht als ein natürlicher Schlüssel verwendet wurde (der Zeitstempel in diesem Beispiel). Das war ziemlich überraschend. Wie dies passiert Post Navigation Annahme Apache Hadoop in der Bundesregierung
No comments:
Post a Comment