Python, PyTables, Java-wszystko razem

Pytanie w pigułce

Jaki jest najlepszy sposób, aby Python i Java grały ze sobą ładnie?

Bardziej szczegółowe wyjaśnienie

Mam nieco skomplikowaną sytuację. Postaram się wyjaśnić zarówno obrazkami, jak i słowami. Oto aktualna Architektura systemu:

Aktualna Architektura systemu http://i50.tinypic.com/2s6lutk.png

Mamy symulację modelowania opartą na agentach napisaną w Javie. Posiada opcje zapisu lokalnie do plików CSV lub zdalnie poprzez połączenie z serwerem Java do pliku HDF5. Każda symulacja wypluwa gigabajt danych, a symulację uruchamiamy dziesiątki razy. Musimy być w stanie agregować w wielu przebiegach tego samego scenariusza (z różnymi przypadkowymi nasionami), aby zobaczyć pewne trendy (np. min, max, mediana, mean). Jak można sobie wyobrazić, próba poruszania się po wszystkich tych plikach CSV jest koszmarem; jest wiele plików wytwarzanych na run, i jak powiedziałem niektóre z nich są ogromne. Z tego powodu staraliśmy się przejść do rozwiązania HDF5, w którym wszystkie dane do badania są przechowywane w jednym miejscu, a nie rozrzucane po dziesiątkach plików tekstowych. Ponadto, ponieważ jest to format binarny, powinien być w stanie uzyskać znaczną oszczędność miejsca w porównaniu do nieskompresowanych plików CSV.

Jak pokazuje diagram, bieżące przetwarzanie końcowe surowych danych wyjściowych z symulacji odbywa się również w Javie i odczytuje w pliku CSV pliki generowane przez lokalne wyjście. Ten moduł przetwarzania końcowego wykorzystuje JFreeChart do tworzenia wykresów i wykresów związanych z symulacją.

Problem

Jak wspomniałem wcześniej, CSV są naprawdę nie do utrzymania i nie skalują się dobrze, ponieważ generujemy coraz więcej danych z symulacji. Co więcej, Kod post-processing robi więcej, niż powinien, zasadniczo wykonując pracę bardzo, bardzo biednej relacyjnej bazy danych (tworzenie połączeń między 'tabelami '(csv pliki) na podstawie kluczy obcych (unikalnych identyfikatorów agenta). W tym systemie trudno jest również wizualizować dane w inny sposób (np. Prefuse, przetwarzanie, jMonkeyEngine uzyskanie jakiegoś podzbioru surowych danych do zabawy w MatLab lub SPSS).

Rozwiązanie?

Moja grupa zdecydowała, że naprawdę potrzebujemy sposobu filtrowania i odpytywania posiadanych danych, a także wykonywania połączeń między tabelami. Biorąc pod uwagę, że jest to sytuacja typu write-once, read-many, naprawdę nie potrzebujemy narzutu prawdziwego relacyjnego bazy danych; zamiast tego potrzebujemy tylko jakiś sposób, aby umieścić ładniejszy front end na plikach HDF5. Znalazłem kilka artykułów na ten temat, takich jak jeden opisujący jak używać XQuery jako języka zapytań na plikach HDF5, ale artykuł opisuje konieczność napisania kompilatora do konwersji z XQuery/XPath na natywne wywołania HDF5, znacznie wykraczające poza nasze potrzeby. Wpisz PyTables . Wydaje się, że robi dokładnie to, czego potrzebujemy (zapewnia dwa różne sposoby zapytań o Dane, albo poprzez zrozumienie listy Pythona lub poprzez in-kernel (poziom C) wyszukiwania.

Proponowana przeze mnie architektura jest taka: http://i46.tinypic.com/9aseg3.png

Nie jestem pewien, jak to zrobić, to połączyć kod Pythona, który zostanie napisany do zapytań, z kodem Javy, który obsługuje pliki HDF5, i kodem Javy, który przetwarza dane. Oczywiście będę chciał przepisać wiele kodu post-processingowego, który w domyśle robi zapytań, a zamiast tego niech doskonałe PyTables zrobić to znacznie bardziej elegancko.

Opcje Java / Python

Prosta wyszukiwarka google wyświetla kilka opcji komunikacji pomiędzy Javą i Pythonem , ale jestem tak nowy w tym temacie, że szukam prawdziwej wiedzy i krytyki proponowanej architektury. Wygląda na to, że proces Pythona powinien działać na tej samej maszynie, co Datahose, więc duży .pliki h5 nie muszą być przesyłane przez sieć, ale raczej znacznie mniejsze, filtrowane widoki byłyby przekazywane klientom. Pyro wydaje się być ciekawym wyborem - czy ktoś ma z tym doświadczenie?

Author: I82Much, 2009-12-23

4 answers

To jest epickie pytanie i jest wiele rozważań. Ponieważ nie wspomniałeś o żadnych konkretnych ograniczeniach wydajności lub architektonicznych, postaram się zaoferować najlepsze, dobrze zaokrąglone sugestie.

Początkowy plan korzystania z PyTables jako warstwy pośredniczącej między innymi elementami a plikami danych wydaje się solidny. Jednak jedno ograniczenie projektowe, które nie zostało wymienione, jest jednym z najbardziej krytycznych ze wszystkich procesów przetwarzania danych: które z tych zadań przetwarzania danych można wykonać w styl przetwarzania wsadowego i zadania przetwarzania danych są bardziej strumieniem NA ŻYWO.

Rozróżnienie między "znamy dokładnie nasze dane wejściowe i wyjściowe i możemy po prostu przetwarzać" (batch) i "znamy nasze dane wejściowe i to, co musi być dostępne, aby zadać coś innego" (live) sprawia, że różnica w kwestii architektonicznej. Patrząc na diagram, istnieje kilka relacji, które implikują różne style przetwarzania.

DODATKOWO na diagramie masz komponenty różnych typów przy użyciu tych samych symboli. Trochę utrudnia to analizę oczekiwanej wydajności i wydajności.

Kolejnym ważnym kontrastem jest twoja infrastruktura IT. Czy masz dostępną pamięć masową o dużej prędkości w sieci? Jeśli tak się stanie, pliki pośredniczące staną się genialnym, prostym i szybkim sposobem udostępniania danych między elementami infrastruktury dla wszystkich potrzeb przetwarzania wsadowego. Wspomniałeś o uruchomieniu aplikacji PyTables-using-na ten sam serwer, na którym działa Symulacja Javy. Oznacza to jednak, że serwer doświadczy obciążenia zarówno dla zapisu, jak i odczytu danych. (To znaczy, środowisko symulacji może mieć wpływ na potrzeby niepowiązanego oprogramowania, gdy zapytają dane.)

Aby odpowiedzieć bezpośrednio na twoje pytania:

  • PyTables wygląda na ładne dopasowanie.
  • istnieje wiele sposobów komunikowania się w Pythonie i Javie, ale rozważ metodę komunikacji agnostycznej w języku, więc te komponenty mogą być zmienione później, jeśli koniecznie. Jest to tak proste, jak znalezienie bibliotek obsługujących zarówno Javę, jak i Python i wypróbowanie ich. API, które zdecydujesz się zaimplementować z dowolną biblioteką, i tak powinno być takie samo. (XML-RPC byłoby w porządku dla prototypowania, jak to jest w bibliotece standardowej, bufory protokołu Google lub oszczędność Facebook dokonać dobrych wyborów produkcyjnych. Ale nie lekceważ, jak wielkie i proste może być samo "zapisywanie rzeczy do plików pośredniczących", jeśli dane są przewidywalne i wsadowe.

Aby pomóc w procesie projektowania i zaspokoić Twoje potrzeby:

Łatwo jest spojrzeć na mały kawałek układanki, sformułować rozsądne założenia i przejść do oceny rozwiązania. Ale jeszcze lepiej spojrzeć na problem całościowo z jasnym zrozumieniem swoich ograniczeń. Mogę zasugerować ten proces:

  • utwórz dwa diagramy swojej obecnej architektury, fizycznej i logicznej.
    • na diagramie fizycznym Utwórz pola dla każdego serwera fizycznego i diagramu połączeń fizycznych między każdym.
      • należy zaznaczyć zasoby dostępne dla każdego serwera oraz typ i zasoby dostępne dla każdego połączenia.
      • Dołącz fizyczny sprzęt, który nie jest zaangażowany w bieżącą konfigurację, jeśli może być przydatny. (Jeśli masz dostępny system SAN, ale go nie używasz, załącz go na wypadek, gdyby rozwiązanie tego chciało.)
    • na diagramie logicznym Utwórz pola dla każdego Aplikacja , która działa w bieżącej architekturze.
      • Dołącz odpowiednie biblioteki jako pola wewnątrz pól aplikacji. (Jest to ważne, ponieważ twój przyszły diagram rozwiązania ma obecnie PyTables jako pudełko, ale jest to tylko biblioteka i nie może nic zrobić samodzielnie.)
      • rysowanie na zasobach dyskowych (takich jak pliki HDF5 i CSV) jako cylindry.
      • Połącz aplikacje za pomocą strzałek z innymi aplikacjami i zasobami w razie potrzeby. Zawsze narysuj strzałkę od "aktora" do "celu". Więc jeśli aplikacja pisze i plik HDF5, strzałka przechodzi z aplikacji do pliku. Jeśli aplikacja odczytuje plik CSV, strzałka przechodzi z aplikacji do pliku.
      • każda strzałka musi być oznaczona mechanizmem komunikacji. Nieoznaczone strzałki pokazują związek, ale nie pokazują jaki związek, więc nie pomogą Ci podejmować decyzji ani komunikować się ograniczenia.

Po zrobieniu tych diagramów, zrób ich kilka kopii, a na nich zacznij robić bazgroły przepływu danych. Z kopią diagramu dla każdej aplikacji "punktu końcowego", która potrzebuje oryginalnych danych, zacznij od symulacji i zakończ w punkcie końcowym z dość solidną płynącą strzałką. Za każdym razem, gdy strzałka danych przepływa przez strzałkę Komunikacji / protokołu, Rób notatki o zmianach danych (jeśli istnieją).

At w tym punkcie, jeśli ty i twój zespół zgadzacie się co do tego, co jest na papierze, to wyjaśniliście swoją obecną architekturę w sposób, który powinien być łatwo komunikowalny. (Nie tylko pomocnicy tutaj na stackoverflow, ale także szefowie i kierownicy projektów i innych posiadaczy torebek.)

Aby rozpocząć planowanie rozwiązania, spójrz na diagramy przepływu danych i pracuj wstecz od punktu końcowego do punktu startowego, a w drodze powrotnej Utwórz zagnieżdżoną listę zawierającą każdą aplikację i format pośredniczący na początek. Następnie wymień wymagania dla każdej aplikacji. Pamiętaj o funkcji:

  • jakie formaty danych lub metody może używać Ta aplikacja do komunikacji.
  • jakie dane faktycznie chce. (Czy to zawsze to samo, czy zmienia się pod wpływem kaprysu w zależności od innych wymagań?)
  • jak często tego potrzebuje.
  • w przybliżeniu ile zasobów potrzebuje aplikacja.
  • co teraz robi aplikacja, skoro tego nie robi cóż.
  • co może teraz zrobić Ta aplikacja, która by pomogła, ale tak nie jest.

Jeśli wykonasz dobrą robotę z tą listą, możesz zobaczyć, jak to pomoże określić, jakie protokoły i rozwiązania wybierzesz. Patrzysz na sytuacje, w których dane przekraczają linię komunikacji i porównujesz listę wymagań dla obu stron komunikacji.

Opisałeś już jedną konkretną sytuację, w której masz sporo kodu post-processingowego Javy to jest robienie "łączy" na tabelach danych w plikach CSV, to jest "zrób teraz, ale nie robi tego dobrze". Więc patrzysz na drugą stronę tej komunikacji, aby zobaczyć, czy druga strona może to zrobić dobrze. W tym momencie drugą stroną jest plik CSV, a wcześniej symulacja, więc nie, nic nie może zrobić tego lepiej w obecnej architekturze.

Więc zaproponowałeś nową aplikację Pythona, która używa biblioteki PyTables, aby usprawnić ten proces. Brzmi nieźle jak na razie! Ale w twój następny diagram, dodałeś kilka innych rzeczy, które mówią do "PyTables". Teraz rozszerzyliśmy zrozumienie grupy tutaj w StackOverflow, ponieważ nie znamy wymagań tych innych aplikacji. Ale jeśli zrobisz listę wymagań, jak wspomniano powyżej, będziesz wiedział dokładnie, co wziąć pod uwagę. Być może aplikacja Pythona za pomocą PyTables dostarczyć zapytania na pliki HDF5 może obsługiwać wszystkie te aplikacje. Może będzie obsługiwać tylko jedną lub dwie z nich. Być może będzie dostarczać postprocesorowi zapytania NA ŻYWO, ale okresowo zapisuje pliki pośredniczące dla innych aplikacji. Nie wiemy, ale z planowaniem, Ty możesz.

Niektóre ostateczne wytyczne:

  • trzymaj rzeczy proste!/ Align = "left" / Im bardziej złożone rozwiązanie, tym trudniejsze do wdrożenia i bardziej prawdopodobne, że zawiedzie. Użyj operacji najmniejszej liczby, użyj najmniej złożonych operacji. Czasami tylko jeden aplikacja do obsługi zapytań dla wszystkich innych części Twojej architektury jest najprostsza. Czasami lepsza jest aplikacja do obsługi zapytań "na żywo" i oddzielna aplikacja do obsługi "żądań wsadowych".
  • trzymaj rzeczy proste!To wielka sprawa! Nie pisz niczego, co można już zrobić za Ciebie. (Dlatego pliki pośredniczące mogą być tak świetne, że system operacyjny obsługuje wszystkie trudne części.) Również wspominasz, że relacyjna baza danych jest zbyt duża, ale zauważ, że relacyjna baza danych jest również wyposażona w bardzo ekspresyjny i dobrze znany język zapytań, protokół komunikacji sieciowej, który jest z nim związany, i nie musisz niczego rozwijać, aby go używać! Jakiekolwiek rozwiązanie, które wymyślisz, musi być lepsze niż używanie gotowego rozwiązania, które będzie działać, na pewno, bardzo dobrze, lub nie jest to najlepsze rozwiązanie.
  • często zapoznaj się z dokumentacją warstwy fizycznej , aby zrozumieć wykorzystanie zasobów Twoich rozważań. Powolne łącze sieciowe lub zbyt duże obciążenie jednego serwera może wykluczać dobre rozwiązania.
  • Zachowaj te dokumenty. cokolwiek zdecydujesz, dokumentacja wygenerowana w procesie jest cenna. Wiki-them lub file them away so you can whip them out again when the topic come up.

I odpowiedź na bezpośrednie pytanie " Jak sprawić, by Python i Java grały ładnie razem?"jest po prostu" używać języka agnostycznego metoda komunikacji."Prawda jest taka, że Python i Java nie są ważne dla Twojego zestawu problemów. Ważne są dane, które przez nie przepływają. Wszystko, co może łatwo i skutecznie udostępniać dane, będzie w porządku.

 13
Author: Travis Bradshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-23 17:27:12

Nie rób tego bardziej skomplikowanego, niż musi być.

Twój proces Java może -- po prostu -- wywołać oddzielny podproces do uruchamiania zapytań PyTables. Niech System Operacyjny robi to, co system operacyjny robi najlepiej.

Twoja aplikacja Java może po prostu rozwidlić proces, który ma niezbędne parametry jako opcje wiersza poleceń. Następnie Java może przejść do następnej rzeczy, gdy Python działa w tle.

Ma to ogromne zalety pod względem jednoczesnej wydajności. Twój Pyton "backend" działa jednocześnie z Twoją symulacją Java "front end".

 5
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-23 17:09:45

Możesz spróbować Jython, interpretera Pythona dla JVM, który może import klasy Javy.

Strona główna projektu Jython

niestety, to wszystko co wiem na ten temat.

 0
Author: badp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-23 16:19:31

Nie wiem, czy to dobra Etykieta. Nie mogłem zmieścić wszystkich moich komentarzy w normalnym komentarzu, a post nie ma aktywności przez 8 miesięcy.

Chciałem tylko zobaczyć jak ci idzie? Mamy bardzo bardzo podobną sytuację, w której pracuję - tylko symulacja jest napisana w C, a format zapisu to pliki binarne. Za każdym razem, gdy szef chce innego podsumowania, musimy zrobić / zmodyfikować odręczny kod, aby zrobić podsumowania. Nasze pliki binarne mają rozmiar około 10 GB i jest jeden z to dla każdego roku symulacji, więc jak można sobie wyobrazić, rzeczy stają się Owłosione, gdy chcemy je uruchomić z różnymi nasionami i tym podobne.

Właśnie odkryłem pyTables i miałem podobny pomysł do twojego. Miałem nadzieję zmienić nasz format pamięci na hdf5, a następnie uruchomić nasze raporty podsumowujące / zapytania za pomocą pytables. Część z nich obejmuje łączenie tabel z każdego roku. Czy miałeś dużo szczęścia w robieniu tego typu "łączy" za pomocą pytables?

 0
Author: oob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-21 22:55:46