前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 Shell 脚本进行 Hadoop Spark 集群的批量安装

使用 Shell 脚本进行 Hadoop Spark 集群的批量安装

作者头像
用户1558438
发布2018-08-23 17:39:26
1K0
发布2018-08-23 17:39:26
举报
文章被收录于专栏:liuchengxuliuchengxu

虽然有一些自动化安装的工具,但是功能越多,越专业的工具,可能也需要越高的学习成本,而我们并非专业运维,但是又必须做这些事情的话,不妨选择用 Shell 脚本来完成集群的安装。

当然了,现在也有很多使用 docker 的做法,安装与部署也非常方便。

整个过程其实很简单,就是对安装过程中的一些手动操作使用 Shell 脚本进行替代。对脚本比较熟悉的话,应该很容易看懂。推荐一个网站,explainshell, 输入 Shell 命令,它会对命令的各部分进行详细的解释。

以下内容虽在 Ubuntu 16.04 试用过,但有些细节可能由于时间因素,难免会有偏差。如有问题,欢迎指正。

其他系统要安装的话可适当参照,步骤上大致相同,只是有些细节需要针对性调整。在所有安装步骤中,最重要的一步是配置 SSH 无密码登录。如果不明白脚本的内容,不要使用我的安装脚本,明白可以抽取部分自用。

对安装过程不太熟的话,建议先跟着厦门大学的教程做:Spark2.1.0入门:Spark的安装和使用,里面涉及了 Hadoop 与 Spark 等各种软件的安装,十分详细,对新手很友好。只有对手动安装的整个过程了然于心,自动化安装才能得心应手。

为了避免因为用户权限要求输入密码的麻烦,以下所有操作均在 root 用户 ,全新系统环境下执行。

以下所涉及的所有脚本我都已经放到了 GitHub 上,点击 这里 查看,距离脚本写完已经有一段时间,懒得对代码结构进行优化了:)。如果对某个脚本有疑问,可以自行单独拿出来,在本地进行测试与验证。

另外,集群的安装基本上都差不多,这里是陈天奇在 EC2 上安装 yarn 集群的脚本:https://github.com/tqchen/yarn-ec2 ,有兴趣可以看一下。

用到主要工具有 rsync 和 expect, rsync 用于同步文件,expect 用于处理需要手动输入的情况。

1. 安装必要的软件

比如 Java,openssh-server,expect(用于自动处理一些交互, 只在 Master 节点上安装即可),vim 等。在 Master 和 Slave 都要安装这些软件,可以将在配置好 ssh 无密码登录后,将安装脚本同步到各 Slave 进行安装。

基本的软件安装

pre-install.sh:

#!/usr/bin/env bash

# 安装 Vim8,方便修改配置文件
apt install software-properties-common
add-apt-repository ppa:jonathonf/vim
apt update
apt install vim

# 安装 git, expect, openssh-server
apt install git expect openssh-server

# Install Java8
apt install openjdk-8-jre openjdk-8-jdk

# Set JAVA_HOME
JAVA_PATH=$(update-alternatives --list java)
JAVA_HOME=${JAVA_PATH%/jre/bin*}
echo "export JAVA_HOME=$JAVA_HOME" >> "$HOME/.bashrc"
安装 Hadoop

安装 Hadoop, 大致为 wget 下载 Hadoop,然后解压到 /usr/local/hadoop。install-hadoop.sh:

#!/usr/bin/env bash

HADOOP_DOWNLOAD_URL=https://mirrors.cnnic.cn/apache/hadoop/common/stable/hadoop-2.7.3.tar.gz
HADOOP_TAR_GZ=${HADOOP_DOWNLOAD_URL##*/} # hadoop-2.7.3.tar.gz
HADOOP_VER=${HADOOP_TAR_GZ%%.tar.gz}     # hadoop-2.7.3


if [ ! -d /usr/local/hadoop ]; then
    [ ! -f /tmp/$HADOOP_TAR_GZ ] && wget -P /tmp --no-check-certificate $HADOOP_DOWNLOAD_URL
    tar -zxf /tmp/$HADOOP_TAR_GZ -C /usr/local
    mv /usr/local/$HADOOP_VER /usr/local/hadoop
else
    echo ">>>> /usr/local/hadoop already exists."
fi


[ -z "${HADOOP_HOME}" ] && echo "export HADOOP_HOME=/usr/local/hadoop" >> "$HOME/.bashrc"
[ -z "${HADOOP_COMMON_LIB_NATIVE_DIR}" ] && echo "export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native" >> "$HOME/.bashrc"


# Set JAVA_HOME in hadoop-env.sh
JAVA_PATH=$(update-alternatives --list java)
JAVA_HOME=${JAVA_PATH%/jre/bin*}
HADOOP_ENV=/usr/local/hadoop/etc/hadoop/hadoop-env.sh
[ -f $HADOOP_ENV ] && echo "export JAVA_HOME=$JAVA_HOME" >> "$HADOOP_ENV"
安装 Spark

安装 Spark,步骤类似,先下载再解压到指定目录,install-spark.sh:

#!/usr/bin/env bash

SPARK_DOWNLOAD_URL=https://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz
SPARK_TGZ=${SPARK_DOWNLOAD_URL##*/} # spark-2.2.0-bin-hadoop2.7.tgz
SPARK_VER=${SPARK_TGZ%%.tgz}        # spark-2.2.0-bin-hadoop2.7

if [ ! -d /usr/local/spark ]; then
    [ ! -f /tmp/$SPARK_TGZ ] && wget -P /tmp --no-check-certificate $SPARK_DOWNLOAD_URL
    tar -zxf /tmp/$SPARK_TGZ -C /usr/local
    mv /usr/local/$SPARK_VER /usr/local/spark
else
    echo ">>>> /usr/local/spark already exists."
fi
安装 HBase

安装 HBase,install-hbase.sh:

#!/usr/bin/env bash

HBASE_DOWNLOAD_URL=http://apache.mirror.vexxhost.com/hbase/stable/hbase-1.2.6-bin.tar.gz
HBASE_TAR_GZ=${HBASE_DOWNLOAD_URL##*/} # hbase-1.2.6-bin.tar.gz
HBASE_VER=${HBASE_TAR_GZ%%-bin.tar.gz} # hbase-1.2.6

if [ ! -d /usr/local/hbase ]; then
    [ ! -f /tmp/$HBASE_TAR_GZ ] && wget -P /tmp --no-check-certificate $HBASE_DOWNLOAD_URL
    tar -zxf /tmp/$HBASE_TAR_GZ -C /usr/local
    mv /usr/local/$HBASE_VER /usr/local/hbase
else
    echo ">>>> /usr/local/hbase already exists."
fi

2. 配置 Master 节点可以无密码 SSH 登陆各个 Slave 节点

这一步非常重要,如果 Master 无法无密码 SSH 登录 Slave,下面进一步的修改 hostname,hosts 等也就无法自动完成了。关于 SSH 登录的原理,可以查看 SSH原理与运用(一):远程登录

配置 Master 无密码 SSH 登录 Slave,主要分为两步:

  1. 在 Master 节点上使用 ssh-keygen 生成无密码的密钥对,主要是 id_rsa 与 id_rsa.pub 两个文件。 默认情况下,/root/.ssh 不存在。 由于在操作过程中,可能会需要输入一些信息,我们使用 expect 来完成这些信息的自动输入。可自行了解 expect 的更多内容。
# Generate pubkey in remote host
# Usage: generate_pub user host password
generate_pub() {
    local username=$1
    local host=$2
    local password=$3

    expect << EOF
spawn ssh $username@$host "mkdir -p ~/.ssh; cd ~/.ssh; rm ./id_rsa*; ssh-keygen -t rsa"
while 1 {
    expect {
        "*assword:"                            { send "$password\n" }
        "yes/no*"                              { send "yes\n"       }
        "Enter file in which to save the key*" { send "\n"          }
        "Enter passphrase*"                    { send "\n"          }
        "Enter same passphrase again:"         { send "\n"          }
        "Overwrite (y/n)"                      { send "y\n"         }
        eof                                    { exit               }
    }
}
EOF
}
  1. 将生成的公钥文件 id_rsa.pub 拷贝到每个 Slave 节点的 ~/.ssh/authorized_keys. authorized_keys 默认不存在,需要自行创建。
# Append id_rsa.pub to authorized_keys in remote host
# Usage: append_pub user host password
append_pub() {
    src_pub="$(cat /tmp/id_rsa.pub)"

    local username=$1
    local host=$2
    local password=$3

    expect << EOF
spawn ssh $username@$host "mkdir -p ~/.ssh; echo $src_pub >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys"
expect {
    "*assword:" { send "$password\n"; exp_continue }
    "yes/no*"   { send "yes\n"      ; exp_continue }
    eof         { exit                             }
}
EOF
}

整个 ssh 无密码登录的内容在 ssh-auto-login.sh 中, slaves.txt 文件放的是 Slave 的 IP 地址,一行一个。

3. 批量修改 Slave hostname 和 hosts

主要是修改两个文件:/etc/hostname/etc/hosts。将 Slave 的 IP 和 hostname 信息存到文件中备用,比如 ip_hostname.txt 和 slaves.txt。实际上只要一个文件 ip_hostname.txt 就够了,目的就是为了提供 Slave 主机的信息而已。

hostname

为方便起见,集群中每台机器的 /etc/hostname 都不同,并用 Master,Slave1,Slave2 等进行对 hostname 进行命名,即在每台机器上的 /etc/hostname 分别写入 Master,Slave1,Slave2 等。

以 Master 为例,在 Ubuntu 16.04 下,/etc/hostname 默认为空,直接使用命令 echo "Master" > /etc/hostname 即可。由于 Slave 节点可能很多,我们用脚本来完成。先准备一个包含 Slave IP 与 hostname 的文件,比如,叫做 ip_hostname.txt, 里面内容如下, 每一行是 IP:hostname

172.109.109.123:Slave1
172.109.109.124:Slave2

由于已经配置好 SSH 无密码登录,所以直接使用 SSH 远程执行命令即可。

#!/usr/bin/env bash

# ip_hostname.txt:
# ip:hostname
for line in $(cat ip_hostname.txt); do
    ip=${line%%:*}
    hostname=${line##*:}
    ssh "root@$ip" "echo "$hostname" > /etc/hostname"
done
hosts

hosts 比较简单,在 Master 上修改完 /etc/hosts,随后直接复制到其他 Slave 节点。将 ip_hostname.txt 里面的内容附加到 /etc/hosts 尾部,再加上一个 Master 节点的 IP 与 hostname 即可。

#!/usr/bin/env bash

# ip_hostname.txt:
# ip:hostname
for line in $(cat ip_hostname.txt); do
    ip=${line%%:*}
    hostname=${line##*:}
    echo "$ip    $hostname" >> /etc/hosts
done

MASTER="MASTER IP"
HOSTANME="Master"
echo  "$MASTER    $HOSTANME" >> /etc/hosts

echo "/etc/hosts has been upadted!"

4. 复制 Master 节点上 /usr/local/hadoop 等目录到 Slave 节点

我们打算将 Hadoop,Spark 安装在 /usr/local 目录下,也就是 /usr/local/hadoop /usr/local/spark 。上面的工作完成后,就可以将 Master 节点下面这些目录复制到各个 Slave 节点。使用 rsync 工具来同步目录。

slaves.txt 里面的内容为各 Slave 的 hostname :

Slave1
Slave2
#!/usr/bin/env bash

DIR='/usr/local/hadoop /usr/local/spark /usr/local/hbase'

for slave in $(cat slaves.txt); do
    rsync -avz $HOME/.bashrc   "root@$slave":$HOME/.bashrc
    rsync -avz $HOME/bin       "root@$slave":$HOME
    rsync -avz /etc/hosts      "root@$slave":/etc

    for dir in $DIR; do
        rsync -avz $dir "root@$slave":/usr/local
    done
done

5. 同步 hadoop/spark 的配置目录

同步完 Hadoop 和 Spark 完整的目录后,我们还需要对 Hadoop 进行一些配置,比如要进行完全分布式的配置,修改 hdfs-site.xml 等等文件。配置完成后,对这些配置目录也进行同步,比如 Hadoop 下面的 etc ,Spark 与 HBase 下面的 conf 目录。具体配置哪些文件, 修改哪些内容可参看上面的厦门大学安装教程。

#!/usr/bin/env bash

DIR='/usr/local/hadoop/etc /usr/local/spark/conf /usr/local/hbase/conf'

for slave in $(cat slaves.txt); do
    rsync -avz $HOME/.bashrc   "root@$slave":$HOME/.bashrc
    rsync -avz $HOME/bin       "root@$slave":$HOME
    rsync -avz /etc/hosts      "root@$slave":/etc

    for dir in $DIR; do
        rsync -avz $dir "root@$slave":/usr/local
    done
done

到这里就差不多了。一两台机器完全可以手动安装,稍微多点的话,写个脚本也还是十分有用的。本文涉及的安装文件已经放在了 GitHub:cluster-auto-installer .

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.08.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 安装必要的软件
    • 基本的软件安装
      • 安装 Hadoop
        • 安装 Spark
          • 安装 HBase
          • 2. 配置 Master 节点可以无密码 SSH 登陆各个 Slave 节点
          • 3. 批量修改 Slave hostname 和 hosts
            • hostname
              • hosts
              • 4. 复制 Master 节点上 /usr/local/hadoop 等目录到 Slave 节点
              • 5. 同步 hadoop/spark 的配置目录
              相关产品与服务
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档