Docker搭建大數據集群 Hadoop Spark HBase Hive Zookeeper Scala


Docker搭建大數據集群

給出一個完全分布式hadoop+spark集群搭建完整文檔,從環境准備(包括機器名,ip映射步驟,ssh免密,Java等)開始,包括zookeeper,hadoop,hive,spark,eclipse/idea安裝全過程,3-4節點,集群部署自己確定,比如集群涉及的多種角色namenode,secondary namenode, datanode,resourcemanager等的節點分配,並用表格形式給出。給出可訪問的ip,用戶名密碼。(阿里雲直接給公網ip,校園網需給公網和校園網ip)。

(1)本機系統設置

電腦設置虛擬緩存(設置為自動管理)

虛擬機設置內存和CPU

內存設置為8G(或以上)

CPU稍微設置高一點(三個虛擬化能開就開)

虛擬機系統配置阿里源

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

虛擬機更新包

yum update

(2)安裝Docker

移除以前docker相關包

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

添加yum源

sudo yum install -y yum-utils

sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安裝docker

sudo yum install -y docker-ce docker-ce-cli containerd.io

啟動Docker

systemctl enable docker --now

配置docker下載鏡像

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

(3)安裝Hadoop

拉取hadoop鏡像

docker pull registry.cn-shenzhen.aliyuncs.com/jonil/hadoop:base

(4)運行容器

指定docker內部網絡

docker network create --driver=bridge --subnet=172.19.0.0/16  hadoop

創建時最好指定容器端口號映射。10000端口為hiveserver端口,后面本地客戶端要通過beeline連接hive使用,有其他組件要安裝的話可以提前把端口都映射出來,畢竟后面容器運行后再添加端口還是有點麻煩的。

建立Master容器

docker run -it --network hadoop -h Master --name Master -p 9870:9870 -p 8088:8088 -p 10000:10000 registry.cn-shenzhen.aliyuncs.com/jonil/hadoop:base bash

提示:CTRL + D 退出容器

docker exec -it [容器名] bash

建立Slave1容器

docker run -it --network hadoop -h Slave1 --name Slave1 registry.cn-shenzhen.aliyuncs.com/jonil/hadoop:base bash

建立Slave2容器

docker run -it --network hadoop -h Slave2 --name Slave2 registry.cn-shenzhen.aliyuncs.com/jonil/hadoop:base bash

三台機器修改hosts

vim /etc/hosts

//修改為以下格式
172.19.0.2	Master
172.19.0.3	Slave1
172.19.0.4	Slave2

提示:每個容器的ip都需要通過命令ifconfig查看,或者在創建的時候通過‘ --ip ’指定ip地址

docker查看運行中的容器

docker ps

確保三個容器都在運行,不然后續的步驟無法進行,最好每個容器開一個終端

進入Master容器

docker exec -it Master /bin/bash

格式化hdfs

hadoop namenode -format

啟動hadoop所有服務

tart-all.sh

提示:雖然容器里面已經把 hadoop 路徑配置在系統變量里面,但由於docker和linux的特殊性,每次進入需要運行以下命令才能生效使用。

source /etc/profile

小黃象頁面

文件網站

查看分布式文件分布狀態

hdfs dfsadmin -report

運行結果

Live datanodes (3):

Name: 172.19.0.2:9866 (Master)
Hostname: Master
Decommission Status : Normal
Configured Capacity: 19001245696 (17.70 GB)
DFS Used: 4096 (4 KB)
Non DFS Used: 7302295552 (6.80 GB)
DFS Remaining: 11698946048 (10.90 GB)
DFS Used%: 0.00%
DFS Remaining%: 61.57%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sun Nov 07 02:27:39 GMT 2021
Last Block Report: Sun Nov 07 02:26:03 GMT 2021
Num of Blocks: 0
//其余節點省略

運行實例測試hadoop集群運行狀況

分布式實例

//創建目錄
hdfs dfs -mkdir -p /user/hadoop
//創建目錄
hdfs dfs -mkdir /input
//放置文件
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml /input
//運行mapreduce實例
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep /input /output 'dfs[a-z.]+'
//查看結果
hdfs dfs -cat /output/*

運行結果

2021-11-07 02:45:31,924 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
1	dfsadmin
1	dfs.replication
1	dfs.namenode.name.dir
1	dfs.namenode.data.dir

(5)安裝Hive

下載Hive-3.1.2

https://dlcdn.apache.org/hive/hive-3.1.2/

將文件復制到虛擬機后上傳到容器內

docker cp apache-hive-3.1.2-bin.tar.gz Master:/usr/local

進入Master容器,解壓文件

tar -zvxf apache-hive-3.1.2-bin.tar.gz

修改配置文件

cd /usr/local/apache-hive-3.1.2-bin/conf
cp hive-default.xml.template hive-site.xml
vim hive-site.xml

追加文件內容,保存后退出

<property>
    <name>system:java.io.tmpdir</name>
    <value>/tmp/hive/java</value>
</property>
<property>
    <name>system:user.name</name>
    <value>${user.name}</value>
</property>

配置hive相關環境變量

vim /etc/profile
export HIVE_HOME="/usr/local/apache-hive-3.1.2-bin"
export PATH=$PATH:$HIVE_HOME/bin

最后刷新配置文件

source /etc/profile

(6)配置MySQL作為元數據庫

拉取MySQL鏡像

docker pull mysql:8.0.22

建立mysql容器(注意:這里的ip對應mysql_hive的ip)

docker run --name mysql_hive -p 4306:3306 --net hadoop --ip 172.19.0.5 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:8.0.22

進入該容器

docker exec -it mysql_hive bash

進入mysql,密碼是abc123456,可以在創建的時候通過“ -e MYSQL_ROOT_PASSWORD= ”更改

mysql -uroot -p

創建hive數據庫

create database hive;

修改遠程連接權限

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123456';

返回Master容器

docker exec -it Master bash

修改關聯數據庫的配置

vim /usr/local/apache-hive-3.1.2-bin/conf/hive-site.xml

提示:hive配置文件里面使用 & 作為分隔,高版本mysql需要SSL驗證,在這里設置關閉

  • 設置數據庫驅動
  • 設置數據庫地址
  • 設置數據庫用戶
  • 設置數據庫密碼
<property>
  <name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://172.19.0.5:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>abc123456</value>
</property>
<property>
  <name>hive.metastore.schema.verification</name>
  <value>false</value>
</property>

下載MySQL驅動

https://downloads.mysql.com/archives/c-j/

把下載的驅動解壓,然后復制myslq驅動到hive的lib文件夾下

docker cp mysql-connector-java-8.0.22.jar Master:usr/local/apache-hive-3.1.2-bin/lib

確認jar包在對應的目錄下

對hive的lib文件夾下部分文件做修改,防止初始化數據庫的時候報錯

slf4j這個包hadoop及hive兩邊只能有一個,這里刪掉hive這邊

cd /usr/local/apache-hive-3.1.2-bin/lib
rm log4j-slf4j-impl-2.10.0.jar 

guava這個包hadoop及hive兩邊只刪掉版本低的那個,把版本高的復制過去,這里刪掉hive,復制hadoop的過去

cd /usr/local/hadoop/share/hadoop/common/lib
cp guava-27.0-jre.jar /usr/local/apache-hive-3.1.2-bin/lib
rm /usr/local/apache-hive-3.1.2-bin/lib/guava-19.0.jar

初始化元數據庫

cd /usr/local/apache-hive-3.1.2-bin/bin
./schematool -dbType mysql -initSchema

驗證hive是否正確搭建

創建測試數據文件

cd /usr/local
vim test.txt
//輸入以下內容
1,jack
2,ben
3,sam

進入hive交互界面

hive

創建表格

create table test(
    > id int,name string
    > )
    > row format delimited
    > fields terminated by ',';

載入數據

load data local inpath '/usr/local/test.txt' into table test;

選擇數據

select * from test;

(7)安裝ZooKeeper

下載ZooKeeper

https://archive.apache.org/dist/zookeeper/zookeeper-3.7.0/

在容器外復制到容器內

docker cp apache-zookeeper-3.7.0-bin.tar.gz Master:/usr

解壓zookeeper壓縮包

tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz

改名

mv apache-zookeeper-3.7.0-bin/ zookeeper

創建兩個工作目錄,並對兩個工作目錄進行權限開放

cd /usr/zookeeper
mkdir zkdata
mkdir zkdatalog
chmod 777 zkdata
chmod 777 zkdatalog

修改配置文件

cd /usr/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
//修改或追加以下內容
dataDir=/usr/zookeeper/zkdata
dataLogDir=/usr/zookeeper/zkdatalog
server.1=Master:2888:3888
server.2=Slave1:2888:3888
server.3=Slave2:2888:3888

進入zkdata文件夾,創建文件myid

cd zkdata
vim myid
1

Slave1的myid為2

Slave2的myid為3


修改環境變量

#zookeeper
export ZOOKEEPER_HOME=/usr/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

刷新環境變量

source /etc/profile

其他兩個容器也執行以上操作

啟動zookeeper集群

zkServer.sh start

查看zookeeper集群狀態

zkServer.sh status

關閉zookeeper集群

zkServer.sh stop



至此zookeeper安裝完成

(8)安裝HBase

下載HBase

http://archive.apache.org/dist/hbase/2.2.6/

復制HBase鏡像到Master容器

docker cp hbase-2.2.6-bin.tar.gz Master:/usr/local

配置HBase環境變量

docker exec -ti Master bash
vim /etc/profile
追加以下內容
#hbase
export HBASE_HOME=/usr/local/hbase
export PATH=$HBASE_HOME/bin:$PATH

刷新源文件

source /etc/profile

復制/usr/local/hadoop/etc/hadoop下的core-site.xml和hdfs-site.xml到/usr/local/hbase/conf文件夾下

cd /usr/local/hadoop/etc/hadoop
cp core-site.xml /usr/local/hbase/conf/
cp hdfs-site.xml /usr/local/hbase/conf/
cd /usr/local/hbase/conf
vim hbase-site.xml

配置hbase-site.xml

提示:hbase.zookeeper.property.dataDir這里配置自己的文件地址,不要直接復制這里的

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://Master:9000/hbase</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value> 
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>Master,Slave1,Slave2</value>
</property> 
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/usr/zookeeper/zkdata</value>
</property> 
<property>
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
</property>
<property>
        <name>hbase.master</name>
        <value>hdfs://Master:6000</value>
</property>

設置hbase的JAVA_HOME和zookeeper

cd /usr/local/hbase/conf
vim hbase-env.sh
//修改或追加以下內容
//如果你用自己安裝的zookeeper,這里設置為false(反之為true),但是啟動之前要先啟動zookeeper集群
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64


移除沖突jar包,防止報錯

cd /usr/local/hbase/lib/client-facing-thirdparty/
//可以直接rm刪除,也可以mv改名,我這里選擇改名
mv slf4j-log4j12-1.7.25.jar slf4j-log4j12-1.7.25.jar.bak

其他容器進行相同操作(省略)

調試一下hbase看看能不能運行

start-all.sh
start-hbase.sh
hbase shell

嘗試創建個test表

hbase(main):001:0> create 'test','id'
Created table test
Took 3.9776 seconds                                                             
=> Hbase::Table - test

(9)安裝Scala

下載scala

https://www.scala-lang.org/download/2.12.12.html

復制到docker容器內

docker cp scala-2.12.12.tgz Master:/usr/local/

解壓scala壓縮包

tar -zxvf scala-2.12.12.tgz

配置環境變量

vim /etc/profile
//追加以下內容
#scala
export SCALA_HOME=/usr/local/scala-2.12.12
export PATH=$SCALA_HOME/bin:$PATH

刷新環境變量

source /etc/profile

查看Scala版本

scala -version

Scala code runner version 2.12.12 -- Copyright 2002-2020, LAMP/EPFL and Lightbend, Inc.

(10)安裝Spark

下載Spark

http://archive.apache.org/dist/spark/spark-3.0.1/

復制Spark壓縮包到容器

docker cp spark-3.0.1-bin-hadoop3.2.tgz Master:/usr/local

進入容器,解壓spark壓縮包

tar -zxvf spark-3.0.1-bin-hadoop3.2.tgz

文件夾改名

mv spark-3.0.1-bin-hadoop3.2 spark-3.0.1

mv spark-3.0.1-bin-hadoop3.2 spark-3.0.1

cd /usr/local/spark-3.0.1/conf
cp spark-env.sh.template spark-env.sh
vim spark-env.sh
//修改或追加以下內容
#spark
export SPARK_MASTER_HOST=Master
export SPARK_MEM=1G
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_MEMORY=1G
#java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export SCALA_HOME=/usr/local/scala-2.12.12
#hadoop
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

修改slaves文件

cp slaves.template slaves
vim slaves
//修改如下
Slave1
Slave2

配置Spark環境變量

vim /etc/profile
//追加以下內容
#spark
export SPARK_HOME=/usr/local/spark-3.0.1
export PATH=$SPARK_HOME/bin:$PATH

刷新源文件

source /etc/profile

其他節點也如上配置spark

最后在Master節點啟動Spark

start-all.sh


運行簡單操作

val textFile = sc.textFile("file:///usr/local/spark-3.0.1/README.md")
//scala操作
//獲取RDD文件textFile的第一行內容
textFile.first()
//獲取RDD文件textFile所有項的計數
textFile.count()
//抽取含有“Spark”的行,返回一個新的RDD
val lineWithSpark = textFile.filter(line => line.contains("Spark"))
//統計新的RDD的行數
lineWithSpark.count()
//找出文本中每行的最多單詞數
textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
//退出spark-shell
:quit

關閉所有程序

stop-all.sh

到此本次大數據集群搭建完畢

(13)附錄

軟件清單:

  • Windows 11

  • VMware Workstation 16

  • CentOS 7

  • Docker-20.10.10

  • Hadoop-3.2.1

  • Hive-3.1.2

  • MySQL-8.0.22

  • HBase-2.2.6

  • Scala-2.12.12

  • Spark-3.0.1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM