2012-04-03 6 views
5

Ich verwende Hive JDBC-Treiber zu SQL-like Abfrage gegen meine HDFS-Daten speichern. Ich habe versucht, c3p0 zu verwenden, um das Verbindungspooling zu behandeln. Ich bin nicht so sicher, dass es der richtige Ansatz ist, da die Hive-Abfrage manchmal ziemlich lange dauern kann, was bedeutet, dass die Verbindung ziemlich lange nicht zurück in den Pool freigegeben wird. Ich habe Mühe, an eine richtige Einstellungsnummer für die maximale Anzahl zu denken von Verbindungen in c3p0 Konfiguration auch.Was ist die beste Vorgehensweise zum Pooling von Hive JDBC-Verbindungen

Gibt es eine Best Practice zum Pooling der Hive jdbc-Verbindung? c3p0? DBCP?

Wie wäre es mit MAX_POOL_SIZE? Sollte es größer als die normale Einstellung für RDB sein?

Antwort

4

Oh großartig, so die Frage in dem Thread, den Sie erwähnen, wurde eigentlich von mir vor langer Zeit gefragt :) Es wäre interessant zu sehen, wie Sie das in Ihrem Anwendungsfall verwenden.

Aber lassen Sie mich Ihnen sagen, Hive startet Hadoop-Jobs wann immer erforderlich abhängig von Ihrer Abfrage. Also, wenn Sie mehrere Abfragen ausführen möchten, was ich glaube, was Sie hier tun möchten, müssen Sie einen Job-Scheduler verwenden, der mehrere Jobs gleichzeitig ausführen kann. Hadoop verwendet standardmäßig First-In-First-Out- (FIFO-) Scheduler, um Jobs aus einer Arbeitswarteschlange zu ziehen. Also, würde gerne zum Fair-Scheduler oder Capacity-Scheduler wechseln.

Die Kernidee hinter dem Fair Share Scheduler war es, Ressourcen für Jobs zu verwenden, so dass jeder Job im Durchschnitt über die Zeit einen gleichen Anteil der verfügbaren Ressourcen erhält.

Der Kapazitätsplaner teilt einige der Prinzipien des Messe-Schedulers, hat aber auch deutliche Unterschiede. Zuerst wurde die Kapazitätsplanung für große Cluster definiert, die mehrere unabhängige Konsumenten und Zielanwendungen haben können. Bei der Kapazitätsplanung werden anstelle von Pools mehrere Warteschlangen mit jeweils einer konfigurierbaren Anzahl von Karten- und Reduzierungsschlitzen erstellt. Jeder Warteschlange wird auch eine garantierte Kapazität zugewiesen (wobei die Gesamtkapazität des Clusters die Summe der Kapazität jeder Warteschlange ist). Zweitens, die Fähigkeit, Jobs innerhalb einer Warteschlange zu priorisieren. Schließlich gibt es strenge Zugriffskontrollen für Warteschlangen.

+0

Danke für die Info. Ich bin immer noch ein wenig verwirrt, wenn ich 10 JDBC-Verbindungen zu Hive bündle, bedeutet das, dass ich 10 Bienenstockjobs parallel geöffnet habe? Was passiert damit, wenn der Job erledigt ist? Diese jdbc-Verbindung wird wieder in den Pool freigegeben? Das nächste Mal wird eine neue Abfrage eine jdbc-Verbindung annehmen und einen neuen Hive-Job haben? Welchen Vorteil erziele ich dann, indem ich jbbc connection pooling hier einsetze, nur das Erstellen/Löschen der jdbc-Verbindungen? – Shengjie

+0

Was ich bisher verstanden habe, ist, dass Sie mehrere Verbindungen zu MySql oder jedem von Hive als Metastore verwendeten DBMS öffnen können, aber das Ergebnis ist, dass beim Erstellen komplexer Abfragen die Hive wiederum MapReduce-Jobs zum Abrufen der Ergebnis von Hive Warehouse, das in Ihrem Fall in HDFS ist. –

+0

Fortfahren ... Pooling Ich benutzte war irgendwie wie Threads. Ich habe eine 10-Threads-Verbindung reserviert, um einen Server zu strukturieren, abhängig von der Kapazität meines Clusters. Eine Abfrage sagt, 'Name von Mitarbeiter auswählen' würde einen Thread verbrauchen. Eine andere solche Abfrage würde, sagen wir mal, einen weiteren Thread belegen und so weiter. Wenn eine Abfrage beendet ist, würde ich den mit dieser Abfrage verknüpften Thread zurück zum Thread-Pool senden. –

0

Irgendwie fand die Antwort in this thread. Ich werde es ausprobieren und sehen, wie es geht.