2017-05-30 75 views
7

Moja aplikacja Java działa na odwzorowaniu i tworzy procesy potomne za pomocą Qubole API. Aplikacja przechowuje child qubole queryIDs. Muszę przechwycić sygnał zabicia i wyłączyć procesy potomne przed wyjściem. hadoop job -kill jobId i yarn application -kill applicationId komendy zabijają zadania w sposób SIGKILL, nie wiem jak przechwycić wyłączenie. Czy jest możliwe przechwycenie zabicia pracy w jakiś sposób lub skonfigurowanie hasoop, aby dać szansę aplikacji na zamknięcie z wdziękiem?Jak zabezpieczyć pracę hadoop z wdziękiem/przechwycić `hadoop job -kill`

Aplikacja pomyślnie przechwytuje zamykanie przy użyciu ShutdownHook, gdy działa lokalnie, a nie w kontenerze mapperów i może zabić procesy potomne.

Proszę zasugerować, jak przechwycić zamknięcie podczas pracy w programie odwzorowującym, czy może robię coś nie tak?

+0

Jeśli nie wykonano ShutdownHooks, oczekuje się, że aplikacja zostanie zabita przy pomocy SIGKILL, (patrz: https://stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal- in-java). Nie wierzę, że możesz "obsłużyć" SIGKILL, jak wspomniano w linku, możesz monitorować stan pracy. O ile mi wiadomo, żadne narzędzia nie pozwalają na jak najlepsze "zamknięcie" dotychczasowych miejsc pracy. – Adonis

Odpowiedz

2

SIGKILL jest nie do powstrzymania i żaden proces nie może go złapać. Ani Twoja aplikacja Java, ani sama JVM ... W rzeczywistości nie jest wysyłane zdarzenie do procesu. Traktuj to bardziej jako bezpośrednie zamówienie jądra, aby bezzwłocznie zniszczyć wszystkie zasoby procesowe.

Od man 7 signal:

Sygnały SIGKILL i SIGSTOP nie można się zarazić, zablokowane lub ignorowane.

Jest to natywna funkcja jądra jądra, nie można jej ominąć.

Należy również pamiętać, że zgodnie z Prabhu(15.07.2015) na how to kill hadoop jobs:

użycie następującego polecenia są amortyzowane

hadoop job -list 
hadoop job -kill $jobId 

rozważyć użycie

mapred job -list 
mapred job -kill $jobId 

Zostało to sprawdzone na Apache Hadoop - Deprecated API Documentation Nie można jednak kontrolować rodzaju wysyłanego sygnału w celu zakończenia pracy.

+0

Nie mogę więc kontrolować typu wysyłanego sygnału, aby zakończyć pracę i nie można zamknąć z wdziękiem. – leftjoin

+0

Cóż, nie mówię, że nie możesz, ale oczywiście sposoby na to nie są standardami i będą wymagały (dużo) więcej kodu/skryptów do utrzymania ... Najprawdopodobniej kończy się to rozwiązaniem dla majsterkowiczów. – Fabien