我来为您提供一个自动配置HBase集群的脚本,这个脚本包括主节点和从节点的配置,以及HDFS和ZooKeeper的配置。

HBase集群自动配置脚本
主脚本:hbase-auto-setup.sh
#!/bin/bash
# HBase集群自动配置脚本
# 使用方法: ./hbase-auto-setup.sh [master_node] [slave1_node] [slave2_node] ...
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 配置参数
HBASE_VERSION="2.5.5"
HADOOP_VERSION="3.3.4"
ZK_VERSION="3.8.1"
HBASE_HOME="/opt/hbase"
HADOOP_HOME="/opt/hadoop"
ZK_HOME="/opt/zookeeper"
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查root权限
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本必须以root权限运行"
exit 1
fi
}
# 环境准备
prepare_env() {
log_info "开始准备环境..."
# 更新系统
yum update -y || apt-get update -y
# 安装必要的软件包
if command -v yum &> /dev/null; then
yum install -y wget tar java-11-openjdk-devel net-tools openssh-server
elif command -v apt-get &> /dev/null; then
apt-get install -y wget tar openjdk-11-jdk net-tools openssh-server
fi
# 配置hosts文件
configure_hosts
}
# 配置hosts文件
configure_hosts() {
log_info "配置hosts文件..."
# 获取本机IP
LOCAL_IP=$(hostname -I | awk '{print $1}')
HOSTNAME=$(hostname)
# 添加本机到hosts
if ! grep -q "$LOCAL_IP" /etc/hosts; then
echo "$LOCAL_IP $HOSTNAME" >> /etc/hosts
fi
# 添加集群节点到hosts
for node in "$@"; do
if ! grep -q "$node" /etc/hosts; then
log_warn "请手动配置节点 $node 的IP地址到/etc/hosts"
fi
done
}
# 配置SSH免密登录
setup_ssh() {
log_info "配置SSH免密登录..."
# 生成SSH密钥
if [ ! -f ~/.ssh/id_rsa ]; then
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
fi
# 分发公钥到所有节点
for node in "$@"; do
if [ "$node" != "$(hostname)" ]; then
ssh-copy-id -i ~/.ssh/id_rsa.pub "root@$node"
fi
done
# 对本机也免密
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
}
# 安装Java
install_java() {
log_info "检查Java安装..."
if ! command -v java &> /dev/null; then
log_info "安装Java 11..."
if command -v yum &> /dev/null; then
yum install -y java-11-openjdk-devel
elif command -v apt-get &> /dev/null; then
apt-get install -y openjdk-11-jdk
fi
fi
# 设置JAVA_HOME
JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/bin/java::")
echo "export JAVA_HOME=$JAVA_HOME" >> /etc/profile
echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile
source /etc/profile
}
# 下载并安装HBase
install_hbase() {
log_info "下载并安装HBase..."
if [ ! -f "/tmp/hbase-${HBASE_VERSION}-bin.tar.gz" ]; then
wget -P /tmp "https://archive.apache.org/dist/hbase/${HBASE_VERSION}/hbase-${HBASE_VERSION}-bin.tar.gz"
fi
# 解压并安装
tar -xzf "/tmp/hbase-${HBASE_VERSION}-bin.tar.gz" -C /opt
mv "/opt/hbase-${HBASE_VERSION}" "$HBASE_HOME"
# 配置HBase环境变量
echo "export HBASE_HOME=$HBASE_HOME" >> /etc/profile
echo "export PATH=\$PATH:\$HBASE_HOME/bin" >> /etc/profile
}
# 配置HBase
configure_hbase() {
log_info "配置HBase..."
MASTER_NODE=$1
shift
SLAVE_NODES=("$@")
# 配置hbase-env.sh
cat > "$HBASE_HOME/conf/hbase-env.sh" << 'EOF'
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export HBASE_MANAGES_ZK=false
export HBASE_HEAPSIZE=2G
export HBASE_OPTS="-XX:+UseConcMarkSweepGC"
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
EOF
# 配置hbase-site.xml
cat > "$HBASE_HOME/conf/hbase-site.xml" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://${MASTER_NODE}:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>${MASTER_NODE}</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/zookeeper/data</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/opt/hbase/tmp</value>
</property>
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.regionserver.port</name>
<value>16020</value>
</property>
</configuration>
EOF
# 配置regionservers
> "$HBASE_HOME/conf/regionservers"
for slave in "${SLAVE_NODES[@]}"; do
if [ "$slave" != "$MASTER_NODE" ]; then
echo "$slave" >> "$HBASE_HOME/conf/regionservers"
fi
done
# 创建目录
mkdir -p /opt/hbase/tmp
mkdir -p /opt/zookeeper/data
# 设置权限
chown -R root:root "$HBASE_HOME"
chmod -R 755 "$HBASE_HOME"
}
# 配置Hadoop(HDFS依赖)
configure_hadoop() {
log_info "配置Hadoop环境..."
if [ ! -d "$HADOOP_HOME" ]; then
log_info "下载并安装Hadoop..."
if [ ! -f "/tmp/hadoop-${HADOOP_VERSION}.tar.gz" ]; then
wget -P /tmp "https://archive.apache.org/dist/hadoop/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz"
fi
tar -xzf "/tmp/hadoop-${HADOOP_VERSION}.tar.gz" -C /opt
mv "/opt/hadoop-${HADOOP_VERSION}" "$HADOOP_HOME"
# 配置Hadoop环境变量
echo "export HADOOP_HOME=$HADOOP_HOME" >> /etc/profile
echo "export PATH=\$PATH:\$HADOOP_HOME/bin" >> /etc/profile
fi
}
# 配置ZooKeeper
configure_zookeeper() {
log_info "配置ZooKeeper..."
if [ ! -d "$ZK_HOME" ]; then
log_info "下载并安装ZooKeeper..."
if [ ! -f "/tmp/apache-zookeeper-${ZK_VERSION}-bin.tar.gz" ]; then
wget -P /tmp "https://archive.apache.org/dist/zookeeper/zookeeper-${ZK_VERSION}/apache-zookeeper-${ZK_VERSION}-bin.tar.gz"
fi
tar -xzf "/tmp/apache-zookeeper-${ZK_VERSION}-bin.tar.gz" -C /opt
mv "/opt/apache-zookeeper-${ZK_VERSION}-bin" "$ZK_HOME"
fi
# 配置ZooKeeper
cat > "$ZK_HOME/conf/zoo.cfg" << EOF
tickTime=2000
dataDir=/opt/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=${MASTER_NODE}:2888:3888
EOF
# 创建myid文件
echo "1" > /opt/zookeeper/data/myid
}
# 启动服务
start_services() {
log_info "启动服务..."
# 启动ZooKeeper
"$ZK_HOME/bin/zkServer.sh" start
# 启动Hadoop(如果已配置)
if [ -f "$HADOOP_HOME/sbin/start-dfs.sh" ]; then
"$HADOOP_HOME/sbin/start-dfs.sh"
fi
# 启动HBase
"$HBASE_HOME/bin/start-hbase.sh"
log_info "HBase集群启动完成!"
}
# 验证安装
verify_installation() {
log_info "验证HBase安装..."
# 检查HBase进程
echo "检查HBase进程..."
jps | grep -E "HMaster|HRegionServer"
# 检查HBase shell
echo "检查HBase shell连接..."
echo "list" | "$HBASE_HOME/bin/hbase" shell
log_info "HBase集群验证完成!"
}
# 清理函数
cleanup() {
log_info "清理临时文件..."
rm -f /tmp/hbase-*.tar.gz
rm -f /tmp/hadoop-*.tar.gz
rm -f /tmp/apache-zookeeper-*.tar.gz
}
# 主函数
main() {
if [ $# -lt 2 ]; then
log_error "用法: $0 <master_node> <slave1_node> [slave2_node] ..."
log_error "示例: $0 master-node slave1-node slave2-node"
exit 1
fi
MASTER_NODE=$1
shift
SLAVE_NODES=("$@")
check_root
log_info "开始配置HBase集群"
log_info "主节点: $MASTER_NODE"
log_info "从节点: ${SLAVE_NODES[*]}"
prepare_env
setup_ssh "$MASTER_NODE" "${SLAVE_NODES[@]}"
install_java
install_hbase
configure_hbase "$MASTER_NODE" "${SLAVE_NODES[@]}"
configure_hadoop
configure_zookeeper
start_services
verify_installation
cleanup
log_info "HBase集群配置完成!"
log_info "Web UI: http://$MASTER_NODE:16010"
}
# 执行主函数
main "$@"
从节点配置脚本:hbase-slave-setup.sh
#!/bin/bash
# HBase从节点配置脚本
# 在从节点上执行
set -e
HBASE_MASTER_IP=$1
MASTER_USER="root"
# 配置SSH
configure_ssh() {
# 复制主节点的公钥
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 从主节点获取公钥
scp "$MASTER_USER@$HBASE_MASTER_IP:~/.ssh/id_rsa.pub" /tmp/master_key.pub
cat /tmp/master_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
}
# 同步配置文件
sync_configs() {
# 同步HBase配置
scp -r "$MASTER_USER@$HBASE_MASTER_IP:/opt/hbase" /opt/
# 同步ZooKeeper配置
scp -r "$MASTER_USER@$HBASE_MASTER_IP:/opt/zookeeper" /opt/
# 同步环境变量
scp "$MASTER_USER@$HBASE_MASTER_IP:/etc/profile" /etc/profile
source /etc/profile
}
# 启动从节点服务
start_slave_services() {
# 启动ZooKeeper
/opt/zookeeper/bin/zkServer.sh start
# 启动HBase RegionServer
/opt/hbase/bin/hbase-daemon.sh start regionserver
}
# 主函数
main() {
if [ -z "$HBASE_MASTER_IP" ]; then
echo "用法: $0 <master_ip>"
exit 1
fi
echo "配置HBase从节点..."
configure_ssh
sync_configs
start_slave_services
echo "从节点配置完成!"
}
main
使用说明
- 在主节点上运行:
# 赋予执行权限 chmod +x hbase-auto-setup.sh
运行脚本(需要root权限)
./hbase-auto-setup.sh master-node slave1-node slave2-node
2. **在从节点上运行:**
```bash
# 赋予执行权限
chmod +x hbase-slave-setup.sh
# 运行脚本
./hbase-slave-setup.sh <master_ip_address>
配置优化建议
如果需要优化性能,可以创建配置文件:hbase-optimize.sh
#!/bin/bash
# HBase性能优化配置
OPTIMIZE_CONFIG="
# HBase性能优化参数
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
</property>
<property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>4</value>
</property>
<property>
<name>hbase.hstore.compactionThreshold</name>
<value>3</value>
</property>
<property>
<name>hbase.hstore.blockingStoreFiles</name>
<value>10</value>
</property>
<property>
<name>hbase.client.scanner.caching</name>
<value>100</value>
</property>
"
# 将优化配置添加到hbase-site.xml
sed -i '/<\/configuration>/d' /opt/hbase/conf/hbase-site.xml
echo "$OPTIMIZE_CONFIG" >> /opt/hbase/conf/hbase-site.xml
echo "</configuration>" >> /opt/hbase/conf/hbase-site.xml
echo "HBase优化配置完成!"
注意事项
- 防火墙设置:确保开放必要的端口(ZooKeeper: 2181, HBase Master: 16000, HBase RegionServer: 16020)
- SSH配置:确保所有节点之间的SSH连接正常
- 网络配置:确保所有节点之间网络互通
- 系统要求:建议至少4GB内存,2核CPU
- Java版本:推荐使用Java 8或Java 11
这个脚本会自动完成HBase集群的配置,包括依赖的HDFS和ZooKeeper的配置,您可以根据实际需求调整配置参数。