docker 搭建大数据集群(hive、hbase、ZooKeeper、Scala、Spark)

发布时间 2023-03-28 17:29:18作者: 松晨

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;

注意:需要用外网的工具的连接需要下列操作:目录安装hadoop下(/usr/local/hadoop/etc/hadoop)

 

启动hive2: hive --service hiveserver2 &

 

(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