blob: dcb88df2869af11e07c3cf03d7494b4b548e59b5 [file] [log] [blame]
#! /usr/bin/env bash
# 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.
function print_usage {
cat <<EOF
Usage: accumulo-cluster <command> (<argument> ...)
Commands:
create-config Creates cluster config
restart Restarts the Accumulo cluster
start Starts Accumulo cluster
stop Stops Accumulo cluster
kill Kills Accumulo cluster
start-non-tservers Starts all services except tservers
start-tservers Starts all tservers on cluster
stop-tservers Stops all tservers on cluster
start-here Starts all services on this node
stop-here Stops all services on this node
EOF
exit 1
}
function invalid_args {
echo -e "Invalid arguments: $1\n"
print_usage 1>&2
exit 1
}
function verify_config {
if [[ -f ${conf}/slaves ]]; then
echo "ERROR: A 'slaves' file was found in ${conf}/"
echo "Accumulo now reads tablet server hosts from 'tservers' and requires that the 'slaves' file not be present to reduce confusion."
echo "Please rename the 'slaves' file to 'tservers' or remove it if both exist."
exit 1
fi
if [[ ! -f ${conf}/tservers ]]; then
echo "ERROR: A 'tservers' file was not found at ${conf}/tservers"
echo "Please make sure it exists and is configured with tablet server hosts."
exit 1
fi
unset master1
if [[ -f "${conf}/masters" ]]; then
master1=$(egrep -v '(^#|^\s*$)' "${conf}/masters" | head -1)
fi
if [[ -z "${monitor}" ]] ; then
monitor=$master1
if [[ -f "${conf}/monitor" ]]; then
monitor=$(egrep -v '(^#|^\s*$)' "${conf}/monitor" | head -1)
fi
if [[ -z "${monitor}" ]] ; then
echo "Could not infer a Monitor role. You need to either define \"${conf}/monitor\","
echo "or make sure \"${conf}/masters\" is non-empty."
exit 1
fi
fi
if [[ ! -f "${conf}/tracers" ]]; then
if [[ -z "${master1}" ]] ; then
echo "Could not find a master node to use as a default for the tracer role."
echo "Either set up \"${conf}/tracers\" or make sure \"${conf}/masters\" is non-empty."
exit 1
else
echo "$master1" > "${conf}/tracers"
fi
fi
if [[ ! -f "${conf}/gc" ]]; then
if [[ -z "${master1}" ]] ; then
echo "Could not infer a GC role. You need to either set up \"${conf}/gc\" or make sure \"${conf}/masters\" is non-empty."
exit 1
else
echo "$master1" > "${conf}/gc"
fi
fi
}
function get_ip() {
ip_addr=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')
if [[ $? != 0 ]]; then
ip_addr=$(getent ahosts "$(hostname -f)" | grep DGRAM | cut -f 1 -d ' ')
fi
echo "$ip_addr"
}
function start_service() {
host="$1"
service="$2"
if [[ $host == "localhost" || $host == $(hostname -f) || $host == $(hostname -s) || $host == $(get_ip) ]]; then
"${bin}/accumulo-service" "$service" start
else
$SSH "$host" "bash -c '${bin}/accumulo-service \"$service\" start'"
fi
}
function start_tservers() {
echo -n "Starting tablet servers ..."
count=1
for server in $(egrep -v '(^#|^\s*$)' "${conf}/tservers"); do
echo -n "."
start_service "$server" tserver &
if (( ++count % 72 == 0 )) ;
then
echo
wait
fi
done
echo " done"
}
function start_all() {
unset DISPLAY
start_service "$monitor" monitor
if [[ "$1" != "--no-tservers" ]]; then
start_tservers
fi
for host in $(egrep -v '(^#|^\s*$)' "${conf}/masters"); do
start_service "$host" master
done
for host in $(egrep -v '(^#|^\s*$)' "${conf}/gc"); do
start_service "$host" gc
done
for host in $(egrep -v '(^#|^\s*$)' "${conf}/tracers"); do
start_service "$host" tracer
done
}
function start_here() {
local_hosts="$(hostname -a 2> /dev/null) $(hostname) localhost 127.0.0.1 $(get_ip)"
for host in $local_hosts; do
if grep -q "^${host}\$" "${conf}/tservers"; then
start_service "$host" tserver
break
fi
done
for host in $local_hosts; do
if grep -q "^${host}\$" "${conf}/masters"; then
start_service "$host" master
break
fi
done
for host in $local_hosts; do
if grep -q "^${host}\$" "${conf}/gc"; then
start_service "$host" gc
break
fi
done
for host in $local_hosts; do
if [[ "$host" == "$monitor" ]]; then
start_service "$host" monitor
break
fi
done
for host in $local_hosts; do
if grep -q "^${host}\$" "${conf}/tracers"; then
start_service "$host" tracer
break
fi
done
}
function end_service() {
host="$1"
service="$2"
end_cmd="$3"
if [[ $host == localhost || $host = "$(hostname -s)" || $host = "$(hostname -f)" || $host = $(get_ip) ]] ; then
"${bin}/accumulo-service" "$service" "$end_cmd"
else
$SSH "$host" "bash -c '${bin}/accumulo-service \"$service\" \"$end_cmd\"'"
fi
}
function stop_service() {
end_service "$1" "$2" "stop"
}
function kill_service() {
end_service "$1" "$2" "kill"
}
function stop_tservers() {
tserver_hosts=$(egrep -v '(^#|^\s*$)' "${conf}/tservers")
echo "Stopping unresponsive tablet servers (if any)..."
for host in ${tserver_hosts}; do
stop_service "$host" tserver &
done
sleep 10
echo "Stopping unresponsive tablet servers hard (if any)..."
for host in ${tserver_hosts}; do
kill_service "$host" tserver &
done
echo "Cleaning tablet server entries from zookeeper"
${accumulo_cmd} org.apache.accumulo.server.util.ZooZap -tservers
}
function kill_all() {
echo "Killing Accumulo cluster..."
for master in $(grep -v '^#' "${conf}/masters"); do
kill_service "$master" master
done
for gc in $(grep -v '^#' "${conf}/gc"); do
kill_service "$gc" gc
done
kill_service "$monitor" monitor
for tracer in $(egrep -v '(^#|^\s*$)' "${conf}/tracers"); do
kill_service "$tracer" tracer
done
for host in $(egrep -v '(^#|^\s*$)' "${conf}/tservers"); do
kill_service "$host" tserver
done
echo "Cleaning all server entries in ZooKeeper"
${accumulo_cmd} org.apache.accumulo.server.util.ZooZap -master -tservers -tracers
}
function stop_all() {
echo "Stopping Accumulo cluster..."
if ! ${accumulo_cmd} admin stopAll
then
echo "Invalid password or unable to connect to the master"
echo "Initiating forced shutdown in 15 seconds (Ctrl-C to abort)"
sleep 10
echo "Initiating forced shutdown in 5 seconds (Ctrl-C to abort)"
else
echo "Accumulo shut down cleanly"
echo "Utilities and unresponsive servers will shut down in 5 seconds (Ctrl-C to abort)"
fi
sleep 5
# Look for processes not killed by 'admin stopAll'
for end_cmd in "stop" "kill" ; do
for master in $(grep -v '^#' "${conf}/masters"); do
end_service "$master" master $end_cmd
done
for gc in $(grep -v '^#' "${conf}/gc"); do
end_service "$gc" gc $end_cmd
done
end_service "$monitor" monitor $end_cmd
for tracer in $(egrep -v '(^#|^\s*$)' "${conf}/tracers"); do
end_service "$tracer" tracer $end_cmd
done
done
# stop tserver still running
stop_tservers
echo "Cleaning all server entries in ZooKeeper"
${accumulo_cmd} org.apache.accumulo.server.util.ZooZap -master -tservers -tracers
}
function stop_here() {
# Determine hostname without errors to user
hosts_to_check=($(hostname -a 2> /dev/null | head -1) $(hostname -f))
if egrep -q localhost\|127.0.0.1 "${conf}/tservers"; then
${accumulo_cmd} admin stop localhost
else
for host in "${hosts_to_check[@]}"; do
if grep -q "$host" "${conf}/tservers"; then
${accumulo_cmd} admin stop "$host"
fi
done
fi
for host in "${hosts_to_check[@]}"; do
for end_cmd in "stop" "kill"; do
for svc in tserver gc master monitor tracer; do
end_service "$host" $svc $end_cmd
done
done
done
}
function main() {
if [[ -z $1 ]]; then
invalid_args "<command> cannot be empty"
fi
# Resolve base directory
SOURCE="${BASH_SOURCE[0]}"
while [ -h "${SOURCE}" ]; do
bin="$( cd -P "$( dirname "${SOURCE}" )" && pwd )"
SOURCE="$(readlink "${SOURCE}")"
[[ "${SOURCE}" != /* ]] && SOURCE="${bin}/${SOURCE}"
done
bin="$( cd -P "$( dirname "${SOURCE}" )" && pwd )"
basedir=$( cd -P "${bin}"/.. && pwd )
conf="${ACCUMULO_CONF_DIR:-${basedir}/conf}"
accumulo_cmd="${bin}/accumulo"
SSH='ssh -qnf -o ConnectTimeout=2'
case "$1" in
create-config)
echo "localhost" > "$conf/gc"
echo "localhost" > "$conf/masters"
echo "localhost" > "$conf/monitor"
echo "localhost" > "$conf/tracers"
echo "localhost" > "$conf/tservers"
;;
restart)
verify_config
stop_all
# Make sure the JVM has a chance to fully exit
sleep 1
start_all
;;
start)
verify_config
start_all
;;
stop)
verify_config
stop_all
;;
kill)
verify_config
kill_all
;;
start-non-tservers)
verify_config
start_all --no-tservers
;;
start-tservers)
verify_config
start_tservers
;;
start-here)
verify_config
start_here
;;
stop-tservers)
verify_config
stop_tservers
;;
stop-here)
verify_config
stop_here
;;
*)
invalid_args "'$1' is an invalid <command>"
;;
esac
}
main "$@"