文章目錄
安裝虛擬機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
,所以NAME
和DEVICE
都設置成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 httpd
,systemctl 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 vsftpd
,systemctl 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
文件內容如下。注意SERVERS
和PASSWORD
。
#!/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
文件發送到slave1
和slave2
機器的/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_HOME
和HADOOP_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
文件內容如下,指定slave1
和slave2
機器作爲slave節點。
slave1
slave2
- 將上面的操作在
slave1
和slave2
機器執行一遍以保證集羣配置一樣。然後啓動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