web-dev-qa-db-ja.com

KafkaがPythonスクリプトから開始された場合、

いくつかのApache Kafkaインスタンスをリモートノードにデプロイした後、kafka-server-stop.sh Kafkaアーカイブの一部であるスクリプト。

デフォルトでは以下が含まれます:

#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
# 
#    http://www.Apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
ps ax | grep -i 'kafka\.Kafka' | grep Java | grep -v grep | awk '{print $1}' | xargs kill -SIGTERM

このスクリプトは、バックグラウンドプロセスではなく、Apache kafkaとして実行すると、たとえば次のようにうまく機能します。

/var/lib/kafka/bin/kafka-server-start.sh /var/lib/kafka/config/server.properties

また、バックグラウンドプロセスとして実行すると機能します。

/var/lib/kafka/bin/kafka-server-start.sh /var/lib/kafka/config/server.properties &

しかし、私のリモートノードでは、(Ansibleを使用して)次のpythonスクリプトで実行します。

#!/usr/bin/env python
import argparse
import os
import subprocess

KAFKA_PATH = "/var/lib/kafka/"

def execute_command_pipe_output(command_to_call):
  return subprocess.Popen(command_to_call, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

def execute_command_no_output(command_to_call):
  with open(os.devnull, "w") as null_file:
    return subprocess.Popen(command_to_call, stdout=null_file, stderr=subprocess.STDOUT)  

def start_kafka(args):
  command_to_call = ["Nohup"]
  command_to_call += [KAFKA_PATH + "bin/zookeeper-server-start.sh"]
  command_to_call += [KAFKA_PATH + "config/zookeeper.properties"]

  proc = execute_command_no_output(command_to_call)

  command_to_call = ["Nohup"]
  command_to_call += [KAFKA_PATH + "bin/kafka-server-start.sh"]
  command_to_call += [KAFKA_PATH + "config/server.properties"]

  proc = execute_command_no_output(command_to_call)

def stop_kafka(args):
  command_to_call = [KAFKA_PATH + "bin/kafka-server-stop.sh"]

  proc = execute_command_pipe_output(command_to_call)
  for line in iter(proc.stdout.readline, b''):
    print line,

  command_to_call = [KAFKA_PATH + "bin/zookeeper-server-stop.sh"]

  proc = execute_command_pipe_output(command_to_call)
  for line in iter(proc.stdout.readline, b''):
    print line,


if __name__ == "__main__":
  parser = argparse.ArgumentParser(description="Starting Zookeeper and Kafka instances")
  parser.add_argument('action', choices=['start', 'stop'], help="action to take")

  args = parser.parse_args()

  if args.action == 'start':
    start_kafka(args)
  Elif args.action == 'stop':
    stop_kafka(args)
  else:
    parser.print_help()

実行後

manage-kafka.py start
manage-kafka.py stop

Zookeeperはシャットダウンされます(本来あるべき状態ですが)Kafkaはまだ実行中です。

私が(手で)呼び出すとき、もっと面白いことは何ですか

Nohup /var/lib/kafka/bin/kafka-server-stop.sh

または

Nohup /var/lib/kafka/bin/kafka-server-stop.sh &

kafka-server-stop.sh適切にシャットダウンするKafkaインスタンス。この問題は、Linux/Pythonの問題が原因であると思われます。

16
Andna

この問題を解決するための力ずくの方法を理解する前に、私はこの問題に何度も直面しました。つまり、Kafka=が突然終了しましたが、ポートはまだ使用中です。

次の手順に従ってください。

  1. そのポートで実行されているプロセスのプロセスIDを見つけます:lsof -t -i :YOUR_PORT_NUMBER。 ##これはMac用です
  2. そのプロセスを強制終了kill -9 process_id
8
anarcky

Kafkaは、飼育係がシャットダウンする前にシャットダウンプロセスを完了する必要があります。

したがって、start the zookeepers、次にブローカーはシャットダウンプロセスを再試行しますです。

私にも似たような事件がありました。問題は、私の構成がkafkaブローカーのシャットダウンを待機していないことでした。これが誰かの役に立つことを願っています。それを理解するのにしばらく時間がかかりました...

7
Vicente Rocha

Kafka-zookeeper-stop.sh管理ツールを実行する前に、kafka-server-stop.shを実行してください。最初にサーバーをzookeeperから切断し、次にzookeeper自体を停止します。再開するには、3〜4秒かかります。

0
user9059436

私の推測では、kafka-server-stop.shはシェルパイプを使用しています。したがって、PopenはShell=True引数。

https://docs.python.org/2/library/subprocess.html#subprocess.Popen を参照してください

0
Stephane Martin

kafka-server-stop.shのコマンドをこれに変更すると、私の問題が解決しました:

PIDS=$(ps axww | grep -i 'kafka\.Kafka' | grep Java | grep -v grep | nawk '{print $1}')


説明:
問題は、kafka-server-stop.shが次のコマンドを使用してPIDSを強制終了することです。

PIDS=$(ps ax | grep -i 'kafka\.Kafka' | grep Java | grep -v grep | awk '{print $1}')

'ps'端末での80列の問題:
これの問題は、ps axの出力がxx列に切り捨てられているため、コマンドのすべての出力が表示されないことです(通常80カラム、昔のデフォルトの端末幅) )。鉱山はstty -aで定義されている168列でした。 ps axwwに変更すると、簡単に出力が広がります。

awk入力レコード長の問題:
もう1つの問題は、awkにCharacters per input record limitation of 3000 charsが記述されている ここ があることです。逆にnawkC longの値によって制限されず、制限されます。 gawkも機能します。

これの欠点は、コアスクリプトを変更しているため、アップグレード中に上書きされる可能性があることです。それは迅速で、おそらくdirtyですが、私にとっては仕事です。

PS興味があればjira here を見つけました。

0
jumping_monkey