虛擬機安裝、hadoop集羣安裝

安裝虛擬機CentOS7

首先下載鏡像文件如CentOS-7-x86_64-DVD-1908.iso,然後通過VMWare workstation安裝CentOS7,採用自定義的方式安裝,過程比較簡單此處就不在這裏截圖說明。
如下圖所示。注意此處我採用的橋接模式連接網絡,這樣你的虛擬機就相當於你局域網內的一臺真實主機。

機器 硬件
master 8G內存 處理器4 100G硬盤
slave1 6G內存 處理器4 60G硬盤
slave2 6G內存 處理器4 60G硬盤

配置網絡

/etc/sysconfig/network-scripts/ifcfg-ens33 文件內容修改如下。

TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.3.20
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
DNS1=192.168.3.1

由於我們的網絡設備是用ens33,所以NAMEDEVICE都設置成ens33
採用靜態設置IP的方式故設置BOOTPROTO=static
由於是靜態設置IP,所以IP地址(IPADDR)需要自定義,子網掩碼(NETMASK)和網關GATEWAY及DNS服務器地址(DNS1)需要和當前主機的網絡環境保持一致。如下圖
在這裏插入圖片描述
通過 systemctl restart network 可重啓網絡,ip addr查看IP地址
在這裏插入圖片描述

設置hostname

hostnamectl set-hostname master就將當前機器的hostname設置爲master。該命令在重啓機器後依然生效。

配置/etc/hosts文件

在這裏插入圖片描述

關閉防火牆

systemctl stop firewalld 關閉防火牆
systemctl disable firewalld 禁止防火牆開啓啓動

永久禁用selinux

編輯vi /etc/selinux/config文件,內容如下圖。修改後重啓機器即可。
在這裏插入圖片描述
也可通過setenforce 0臨時關閉然後通過getenforce查看
在這裏插入圖片描述

配置本地yum源

  • 創建目錄mkdir /usr/local/src/packages,通過WIN SCP上傳鏡像文件CentOS-7-x86_64-DVD-1908.iso到剛剛創建的目錄。
  • 創建掛載目錄 mkdir /media/centos-7
  • 掛載鏡像文件 mount -t iso9660 -o loop /usr/local/src/packages/CentOS-7-x86_64-DVD-1908.iso /media/centos-7
    在這裏插入圖片描述
  • 設置開機自動掛載(因爲上面的掛載只是臨時的),編輯文件vi /etc/fstab,在最後面添加如下一行
/usr/local/src/packages/CentOS-7-x86_64-DVD-1908.iso /media/centos-7 iso9660 defaults,loop 0 0
  • 添加自定義yum文件,新增vi /etc/yum.repos.d/centos-7.repo文件,內容如下
[7-Localsource]
name=CentOS7
baseurl=file:///media/centos-7
enabled=1
gpgcheck=0
  • 刪除/etc/yum.repos.d目錄下其他的repo文件,或者將其備份到一個文件夾/etc/yum.repos.d/bak

  • 執行yum -y install vim來安裝vim命令看是否成功。yum makecache可以做本地yum緩存,yum clean all可清除緩存。
    在這裏插入圖片描述

  • 採用httpd服務器給其他局域網內的機器做局部yum源,這樣就不用在每臺機器上重複上面的操作了。我們以master機器爲例,在其安裝httpd服務,yum -y install httpd

    啓動httpd服務並執行開啓自啓,systemctl start httpdsystemctl enable httpd
    建立軟連接,並通過瀏覽器查看

cd /var/www/html/
ln -s /media/centos-7 centos-7

在這裏插入圖片描述

  • 其他機器的yum文件/etc/yum.repos.d/centos-7.repo就可以配置成如下
    注意baseurl,其中master機器地址就是192.168.3.20
[7-Localsource]
name=CentOS7
baseurl=http://192.168.3.20/centos-7
enabled=1
gpgcheck=0
  • 或者採用ftp服務器作爲局部yum源。我們以master機器爲例,在其安裝vsftpd服務,yum -y install vsftpd
    • 啓動並開機自啓vsftpd服務,systemctl start vsftpdsystemctl enable httpd
    • 修改配置文件/etc/vsftpd/vsftpd.conf,在其最後添加 anon_root=/media 作爲匿名用戶的目錄
      -
    • 禁用掉selinux,臨時關閉可執行setenforce 0,不關閉的話在瀏覽器上輸入ftp://192.168.3.20/centos-7是無法看到鏡像文件內容的
      在這裏插入圖片描述
  • 其他機器的yum文件/etc/yum.repos.d/centos-7.repo就可以配置成如下
    注意baseurl,其中master機器地址就是192.168.3.20
[7-Localsource]
name=CentOS7
baseurl=ftp://192.168.3.20/centos-7
enabled=1
gpgcheck=0

配置免密登錄

在三臺機器都執行了上面的操作並配置好yum源後,執行如下的腳本進行免密登錄。
/root目錄下創建文件夾auto-ssh,然後將如下3個文件放入文件夾auto-ssh內,最後執行./boot.sh即可完成免密的配置。
在這裏插入圖片描述
auto.sh文件內容如下。注意SERVERS是所有的機器主機名(用空格隔開),PASSWORD是所有機器統一的root密碼。

#!/bin/bash

SERVERS="master slave1 slave2"
PASSWORD=root

auto_ssh_copy_id() {
    expect -c "set timeout -1;
        spawn ssh-copy-id $1;
        expect {
            *(yes/no)* {send -- yes\r;exp_continue;}
            *assword:* {send -- $2\r;exp_continue;}
            eof        {exit 0;}
        }";
}

ssh_copy_id_to_all() {
    for SERVER in $SERVERS
    do
        auto_ssh_copy_id $SERVER $PASSWORD
    done
}

ssh_copy_id_to_all

boot.sh文件內容如下。注意SERVERSPASSWORD

#!/bin/bash

SERVERS="master slave1 slave2"
PASSWORD=root

auto_ssh_copy_id() {
    expect -c "set timeout -1;
        spawn ssh-copy-id $1;
        expect {
            *(yes/no)* {send -- yes\r;exp_continue;}
            *assword:* {send -- $2\r;exp_continue;}
            eof        {exit 0;}
        }";
}

ssh_copy_id_to_all() {
    for SERVER in $SERVERS
    do
        auto_ssh_copy_id $SERVER $PASSWORD
    done
}

yum -y install expect
expect key.exp
ssh_copy_id_to_all

for SERVER in $SERVERS
do
    scp -r /root/auto-ssh root@$SERVER:/root
    ssh root@$SERVER "yum -y install expect; expect /root/auto-ssh/key.exp; /root/auto-ssh/auto.sh"
done

key.exp文件內容如下

#!/usr/bin/expect

spawn ssh-keygen

expect {
"save the key" {send "\n"; exp_continue}
"Overwrite (y/n)" {send "n\n"}
"Enter passphrase" {send "\n"; exp_continue}
"Enter same passphrase again" {send "\n"}
timeout {puts "expect connect timeout."; return}
}

expect eof

配置JDK

下載jdk文件如jdk-8u221-linux-x64.tar.gz。一樣上傳到目錄/usr/local/src/packages/

cd /usr/local/src
tar zxPvf packages/jdk-8u221-linux-x64.tar.gz -C ./
ln -s jdk1.8.0_221 jdk

設置環境變量, 編輯vim /etc/profile文件,在文件最後添加如下內容

export SRC_HOME=/usr/local/src
export JAVA_HOME=${SRC_HOME}/jdk

export PATH=$PATH:$JAVA_HOME/bin

在這裏插入圖片描述

簡單的集羣操作腳本

該集羣操作腳本只需在master機器上運行,而無須像上面的操作一樣需要在每臺機器運行。
創建目錄mkdir /root/cluster,該目錄下有如下3個腳本
在這裏插入圖片描述
common.sh是用來存儲公共方法的。

distribute.sh是用來在集羣分發文件的。
用法如 ./distribute.sh -h slave1,slave2 -s /etc/profile -d /etc
該命令是將當前主機的/etc/profile文件發送到slave1slave2機器的/etc目錄下,-h指定主機列表(用逗號隔開),-s表示源文件(或目錄),-d表示目的主機的目錄。-s-d指定的文件路徑都是絕對路徑。
在這裏插入圖片描述

exec.sh是用來在集羣每臺機器內執行命令的。
用法如 ./exec.sh -h master,slave1,slave2 -c "java -version;"
該命令是在這三臺機器上分別執行java -version命令。-h指定主機列表(用逗號隔開),-c指定要執行的命令。
在這裏插入圖片描述

common.sh文件內容如下

#!/bin/bash
#常用方法集合

function is_empty(){
    if [ -z "$1" ]; then
        echo "STRING is empty"
        return 2
    fi
}

## Error
function red(){
    echo -e "`date '+%Y-%m-%d %H:%M:%S'` \033[31m\033[01m[ $1 ]\033[0m"
}

distribute.sh文件內容如下

#!/bin/bash
#該文件是用來分發文件的

cd `dirname $0`
#加載公共方法
source ./common.sh

#主機列表,用逗號隔開
hostnames=""
#當前主機文件夾
source_dir=""
#目的主機文件夾
dest_dir=""

#解析參數
while getopts ":h:s:d:" opt
do
    case $opt in
        h)
        echo "指定的主機列表是 $OPTARG"
        hostnames=$OPTARG
        ;;
        s)
        echo "當前主機文件夾是 \"$OPTARG\""
        source_dir=$OPTARG
        ;;
        d)
        echo "目的主機文件夾是 \"$OPTARG\""
        dest_dir=$OPTARG
        ;;
        ?)
        echo "未知參數"
        exit 1;;
    esac
done

is_empty $hostnames
if [ $? -eq 2 ]; then
red "主機列表爲空"
exit 1
fi

is_empty $source_dir
if [ $? -eq 2 ]; then
red "當前主機文件夾爲空"
exit 1
fi

is_empty $dest_dir
if [ $? -eq 2 ]; then
red "目的主機文件夾爲空"
exit 1
fi

host_arr=(${hostnames//,/ })
for var in ${host_arr[@]}
do
   echo "the host is $var."
   scp -r $source_dir root@$var:$dest_dir
done

exec.sh文件內容如下

#!/bin/bash

#主機列表,用逗號隔開
hostnames=""
#在各個主機中需要執行的命令
cmd=""

#解析參數
while getopts ":h:c:" opt
do
    case $opt in
        h)
        echo "指定的主機列表是 $OPTARG"
        hostnames=$OPTARG
        ;;
        c)
        echo "待執行的命令是 \"$OPTARG\""
        cmd=$OPTARG
        ;;
        ?)
        echo "未知參數"
        exit 1;;
    esac
done


host_arr=(${hostnames//,/ })
for var in ${host_arr[@]}
do
   echo "the host is $var."
   ssh -o ConnectTimeout=10 root@$var "source /etc/profile;$cmd"
   echo ""
done

安裝hadoop集羣

hadoop-2.6.5.tar.gz安裝包爲例,放在/usr/local/src目錄下。

cd /usr/local/src
tar zxPvf packages/hadoop-2.6.5.tar.gz -C ./
ln -s hadoop-2.6.5 hadoop
  • 配置環境變量 vim /etc/profile,添加如下內容。並source /etc/profile使環境變量生效。
export HADOOP_HOME=${SRC_HOME}/hadoop

export PATH=$PATH:$JAVA_HOME/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
  • 修改${HADOOP_HOME}/etc/hadoop/hadoop-env.sh文件。JAVA_HOMEHADOOP_PID_DIR配置成指定目錄。
# The java implementation to use.
export JAVA_HOME=/usr/local/src/jdk

# Assuming your installation directory is /usr/local/src/hadoop
export HADOOP_PREFIX=/usr/local/src/hadoop

# 該參數大約在97行左右能看到
export HADOOP_PID_DIR=${HADOOP_PREFIX}/pids

在這裏插入圖片描述
在這裏插入圖片描述

  • 修改${HADOOP_HOME}/etc/hadoop/mapred-env.sh文件。指定PID目錄。
export HADOOP_PREFIX=/usr/local/src/hadoop
export HADOOP_MAPRED_PID_DIR=${HADOOP_PREFIX}/pids
  • ${HADOOP_HOME}/etc/hadoop/core-site.xml文件內容如下
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/src/hadoop/tmp</value>
    </property>
    <!--將root用戶設置爲代理用戶-->
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>
    <!--hdfsui的訪問用戶從dr.who改爲root,默認是dr.who-->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
</configuration>
  • ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml文件內容如下
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///usr/local/src/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///usr/local/src/hadoop/dfs/data</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>master:50090</value>
    </property>
</configuration>
  • ${HADOOP_HOME}/etc/hadoop/mapred-site.xml文件內容如下
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.map.memory.mb</name>
        <value>900</value>
    </property>
    <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>900</value>
    </property>
    <property>
        <name>mapreduce.map.java.opts</name>
        <!--<value>-Xmx900M -verbose:gc -Xloggc:/tmp/@[email protected] -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=fals
        -->
        <value>-Xmx900M</value>
    </property>
    <property>
        <name>mapreduce.reduce.java.opts</name>
        <!--<value>-Xmx920M -verbose:gc -Xloggc:/tmp/@[email protected] -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false</value>
        --><value>-Xmx900M</value>
    </property>
</configuration>
  • ${HADOOP_HOME}/etc/hadoop/yarn-site.xml文件內容如下
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>false</value>
    </property>
    <!--Configurations for NodeManager-->

    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    </property>
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1024</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>8192</value>
    </property>
    <!--Configurations for NodeManager-->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>5.0</value>
    </property>
    <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/usr/local/src/hadoop/tmp/nm-local-dir</value>
        <description>List of directories to store localized files in. 存儲媒介數據文件的</description>
    </property>
    <property>
        <name>yarn.nodemanager.log-dirs</name>
        <value>${yarn.log.dir}/userlogs</value>
        <description>Where to store container logs</description>
    </property>
    <property>
        <name>yarn.nodemanager.log.retain-seconds</name>
        <value>108000</value>
        <description>Time in seconds to retain user logs</description>
    </property>
    <property>
        <name>yarn.nodemanager.remote-app-log-dir</name>
        <value>/tmp/logs</value>
    </property>
    <property>
        <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
        <value>logs</value>
    </property>

    <!--Monitoring the health of NodeManagers-->
    <property>
        <name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name>
        <value>0.25</value>
        <description>The minimum fraction of number of disks to be healthy for the nodemanager to launch new containers</description>
    </property>
    <property>
        <name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name>
        <value>90.0</value>
        <description>The maximum percentage of disk space utilization allowed after which a disk is marked as bad</description>
    </property>
</configuration>
  • 格式化namenode,執行hdfs namenode -format觀看有下面日誌即代表成功
    在這裏插入圖片描述
  • ${HADOOP_HOME}/etc/hadoop/slaves文件內容如下,指定slave1slave2機器作爲slave節點。
slave1
slave2
  • 將上面的操作在slave1slave2機器執行一遍以保證集羣配置一樣。然後啓動hdfs和yarn。
    在這裏插入圖片描述
    /root/cluster/start-mrjobhistory.sh腳本內容如下,比較簡單,就是啓動每個nodemanager節點對應的MapReduceJobHistoryServer。當然我已經把/root/cluster目錄放到PATH環境變量裏了,這樣就能直接運行。
#!/bin/bash

# 獲取當前執行腳本的目錄
dir=`dirname $0`
# 進入腳本所在目錄
cd $dir

cmd="mr-jobhistory-daemon.sh start historyserver"
./exec.sh -h slave1,slave2 -c "source /etc/profile; $cmd"

在這裏插入圖片描述

測試hdfs和yarn

可以通過http://192.168.3.20:50070查看HDFS UI界面,也可以通過命令行。
在這裏插入圖片描述
簡單的在hdfs上創建目錄、上傳文件、查看目錄

hdfs dfs -mkdir /abc
hdfs dfs -put ${HADOOP_HOME}/etc/hadoop/core-site.xml /abc
hdfs dfs -ls /abc

在這裏插入圖片描述
執行官方提供的wordCount例子,注意輸出目錄/out不能已存在否則會報錯。

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /abc /out

在這裏插入圖片描述
查看wordCount結果

hdfs dfs -cat /out/* | tail

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章