自动配置HBase集群的脚本

wen 实用脚本 6

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

自动配置HBase集群的脚本

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

使用说明

  1. 在主节点上运行:
    # 赋予执行权限
    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优化配置完成!"

注意事项

  1. 防火墙设置:确保开放必要的端口(ZooKeeper: 2181, HBase Master: 16000, HBase RegionServer: 16020)
  2. SSH配置:确保所有节点之间的SSH连接正常
  3. 网络配置:确保所有节点之间网络互通
  4. 系统要求:建议至少4GB内存,2核CPU
  5. Java版本:推荐使用Java 8或Java 11

这个脚本会自动完成HBase集群的配置,包括依赖的HDFS和ZooKeeper的配置,您可以根据实际需求调整配置参数。

抱歉,评论功能暂时关闭!