使用 Shell 腳本進(jìn)行 Hadoop Spark 集群的批量安裝

雖然有一些自動(dòng)化安裝的工具,但是功能越多,越專業(yè)的工具,可能也需要越高的學(xué)習(xí)成本,而我們并非專業(yè)運(yùn)維,但是又必須做這些事情的話,不妨選擇用 Shell 腳本來(lái)完成集群的安裝。

當(dāng)然了,現(xiàn)在也有很多使用 docker 的做法,安裝與部署也非常方便。

整個(gè)過(guò)程其實(shí)很簡(jiǎn)單,就是對(duì)安裝過(guò)程中的一些手動(dòng)操作使用 Shell 腳本進(jìn)行替代。對(duì)腳本比較熟悉的話,應(yīng)該很容易看懂。推薦一個(gè)網(wǎng)站,explainshell, 輸入 Shell 命令,它會(huì)對(duì)命令的各部分進(jìn)行詳細(xì)的解釋。

以下內(nèi)容雖在 Ubuntu 16.04 試用過(guò),但有些細(xì)節(jié)可能由于時(shí)間因素,難免會(huì)有偏差。如有問(wèn)題,歡迎指正。

其他系統(tǒng)要安裝的話可適當(dāng)參照,步驟上大致相同,只是有些細(xì)節(jié)需要針對(duì)性調(diào)整。在所有安裝步驟中,最重要的一步是配置 SSH 無(wú)密碼登錄。如果不明白腳本的內(nèi)容,不要使用我的安裝腳本,明白可以抽取部分自用。

對(duì)安裝過(guò)程不太熟的話,建議先跟著廈門大學(xué)的教程做:Spark2.1.0入門:Spark的安裝和使用,里面涉及了 Hadoop 與 Spark 等各種軟件的安裝,十分詳細(xì),對(duì)新手很友好。只有對(duì)手動(dòng)安裝的整個(gè)過(guò)程了然于心,自動(dòng)化安裝才能得心應(yīng)手。

為了避免因?yàn)橛脩魴?quán)限要求輸入密碼的麻煩,以下所有操作均在 root 用戶 ,全新系統(tǒng)環(huán)境下執(zhí)行。

以下所涉及的所有腳本我都已經(jīng)放到了 GitHub 上,點(diǎn)擊 這里 查看,距離腳本寫完已經(jīng)有一段時(shí)間,懶得對(duì)代碼結(jié)構(gòu)進(jìn)行優(yōu)化了:)。如果對(duì)某個(gè)腳本有疑問(wèn),可以自行單獨(dú)拿出來(lái),在本地進(jìn)行測(cè)試與驗(yàn)證。

另外,集群的安裝基本上都差不多,這里是陳天奇在 EC2 上安裝 yarn 集群的腳本:https://github.com/tqchen/yarn-ec2 ,有興趣可以看一下。

用到主要工具有 rsync 和 expect, rsync 用于同步文件,expect 用于處理需要手動(dòng)輸入的情況。

1. 安裝必要的軟件

比如 Java,openssh-server,expect(用于自動(dòng)處理一些交互, 只在
Master 節(jié)點(diǎn)上安裝即可),vim 等。在 Master 和 Slave 都要安裝這些軟件,可以將在配置好 ssh 無(wú)密碼登錄后,將安裝腳本同步到各 Slave 進(jìn)行安裝。

基本的軟件安裝

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 節(jié)點(diǎn)可以無(wú)密碼 SSH 登陸各個(gè) Slave 節(jié)點(diǎn)

這一步非常重要,如果 Master 無(wú)法無(wú)密碼 SSH 登錄 Slave,下面進(jìn)一步的修改 hostname,hosts 等也就無(wú)法自動(dòng)完成了。關(guān)于 SSH 登錄的原理,可以查看 SSH原理與運(yùn)用(一):遠(yuǎn)程登錄

配置 Master 無(wú)密碼 SSH 登錄 Slave,主要分為兩步:

  1. 在 Master 節(jié)點(diǎn)上使用 ssh-keygen 生成無(wú)密碼的密鑰對(duì),主要是 id_rsa 與 id_rsa.pub 兩個(gè)文件。

    默認(rèn)情況下,/root/.ssh 不存在。

    由于在操作過(guò)程中,可能會(huì)需要輸入一些信息,我們使用 expect 來(lái)完成這些信息的自動(dòng)輸入。可自行了解 expect 的更多內(nèi)容。

# 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 拷貝到每個(gè) Slave 節(jié)點(diǎn)的 ~/.ssh/authorized_keys. authorized_keys 默認(rèn)不存在,需要自行創(chuàng)建。
# 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
}

整個(gè) ssh 無(wú)密碼登錄的內(nèi)容在 ssh-auto-login.sh 中, slaves.txt 文件放的是 Slave 的 IP 地址,一行一個(gè)。

3. 批量修改 Slave hostname 和 hosts

主要是修改兩個(gè)文件:/etc/hostname/etc/hosts。將 Slave 的 IP 和 hostname 信息存到文件中備用,比如 ip_hostname.txt 和 slaves.txt。實(shí)際上只要一個(gè)文件 ip_hostname.txt 就夠了,目的就是為了提供 Slave 主機(jī)的信息而已。

hostname

為方便起見,集群中每臺(tái)機(jī)器的 /etc/hostname 都不同,并用 Master,Slave1,Slave2 等進(jìn)行對(duì) hostname 進(jìn)行命名,即在每臺(tái)機(jī)器上的 /etc/hostname 分別寫入 Master,Slave1,Slave2 等。

以 Master 為例,在 Ubuntu 16.04 下,/etc/hostname 默認(rèn)為空,直接使用命令 echo "Master" > /etc/hostname 即可。由于 Slave 節(jié)點(diǎn)可能很多,我們用腳本來(lái)完成。先準(zhǔn)備一個(gè)包含 Slave IP 與 hostname 的文件,比如,叫做 ip_hostname.txt, 里面內(nèi)容如下, 每一行是 IP:hostname

172.109.109.123:Slave1
172.109.109.124:Slave2

由于已經(jīng)配置好 SSH 無(wú)密碼登錄,所以直接使用 SSH 遠(yuǎn)程執(zhí)行命令即可。

#!/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 比較簡(jiǎn)單,在 Master 上修改完 /etc/hosts,隨后直接復(fù)制到其他 Slave 節(jié)點(diǎn)。將 ip_hostname.txt 里面的內(nèi)容附加到 /etc/hosts 尾部,再加上一個(gè) Master 節(jié)點(diǎn)的 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. 復(fù)制 Master 節(jié)點(diǎn)上 /usr/local/hadoop 等目錄到 Slave 節(jié)點(diǎn)

我們打算將 Hadoop,Spark 安裝在 /usr/local 目錄下,也就是 /usr/local/hadoop /usr/local/spark 。上面的工作完成后,就可以將 Master 節(jié)點(diǎn)下面這些目錄復(fù)制到各個(gè) Slave 節(jié)點(diǎn)。使用 rsync 工具來(lái)同步目錄。

slaves.txt 里面的內(nèi)容為各 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 完整的目錄后,我們還需要對(duì) Hadoop 進(jìn)行一些配置,比如要進(jìn)行完全分布式的配置,修改 hdfs-site.xml 等等文件。配置完成后,對(duì)這些配置目錄也進(jìn)行同步,比如 Hadoop 下面的 etc ,Spark 與 HBase 下面的 conf 目錄。具體配置哪些文件, 修改哪些內(nèi)容可參看上面的廈門大學(xué)安裝教程。

#!/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

到這里就差不多了。一兩臺(tái)機(jī)器完全可以手動(dòng)安裝,稍微多點(diǎn)的話,寫個(gè)腳本也還是十分有用的。本文涉及的安裝文件已經(jīng)放在了 GitHub:cluster-auto-installer .

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1.Linux安裝前的配置 1.1.關(guān)閉防火墻 本站文檔是假定「服務(wù)器在防火墻以內(nèi)」的前提下編纂的,在這個(gè)前提下...
    lao男孩閱讀 3,350評(píng)論 0 4
  • 最近在學(xué)習(xí)大數(shù)據(jù)技術(shù),朋友叫我直接學(xué)習(xí)Spark,英雄不問(wèn)出處,菜鳥不問(wèn)對(duì)錯(cuò),于是我就開始了Spark學(xué)習(xí)。 為什...
    Plokmijn閱讀 26,641評(píng)論 6 26
  • --------"道路是曲折的,前途是光明的。"最近又涉及到了hadoop以及spark的安裝,之前課題設(shè)計(jì)中有要...
    九七學(xué)姐閱讀 3,084評(píng)論 3 5
  • 一、Spark集群部署 1、軟件版本 OS版本:Ubuntu 14.04 Hadoop版本:Hadoop 2.6....
    ZyZhu閱讀 1,251評(píng)論 1 2
  • 之前的有點(diǎn)忘記了,這里在云筆記拿出來(lái)再玩玩.看不懂的可以留言 大家可以嘗試下Ambari來(lái)配置Hadoop的相關(guān)環(huán)...
    HT_Jonson閱讀 2,997評(píng)論 0 50