Skip to content

Instantly share code, notes, and snippets.

@Kostassoid
Last active February 9, 2016 21:05
Show Gist options
  • Save Kostassoid/8fd9563adfb85ee38ba6 to your computer and use it in GitHub Desktop.
Save Kostassoid/8fd9563adfb85ee38ba6 to your computer and use it in GitHub Desktop.
Makes precise changes to Kafka topic partitioning config. Supports changing replication factor.
#!/usr/bin/python
import sys, argparse, json, random
def main(argv):
parser = argparse.ArgumentParser(description='Repartitioner.')
parser.add_argument('input', help='current partitioning info file')
parser.add_argument('output', help='output partitioning info file')
parser.add_argument('brokers', help='brokers list')
parser.add_argument('--replication-factor', type=int, help='replication factor')
args = parser.parse_args()
brokers = map(lambda x: int(x), args.brokers.split(","))
with open(args.input) as infile:
conf = json.loads(infile.read())
for p in conf["partitions"]:
replicas = p["replicas"]
targetRf = len(replicas) if args.replication_factor == None else args.replication_factor
newReplicas = list()
for r in replicas:
if r in brokers and len(newReplicas) < targetRf:
newReplicas.append(r)
if len(newReplicas) < targetRf:
for i in range(len(newReplicas), targetRf):
newReplicas.append(random.choice(list(set(brokers) - set(newReplicas))))
p["replicas"] = newReplicas
with open(args.output, 'w') as outfile:
json.dump(conf, outfile)
if __name__ == "__main__":
main(sys.argv[1:])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment