自己动手做大数据系统(第2版)

自己动手做大数据系统(第2版)

作者:飞谷云团队

编写时间:2020年2月(武汉加油、共克时艰)

交流QQ群:50926571

(镜像文件下载小程序)


  • 前言

为帮助读者更好地阅读和理解《自己动手做大数据系统》(第二版)中的实操部分,本文档主要讲解了如何使用Docker容器集群来运行书中的演示程序。容器集群共包括12个实例

镜像名称 功能 运行服务名
flink_single Flink单节点服务 StandaloneSessionClusterEntrypoint

TaskManagerRunner

hbase-master Hadoop、HBase、Spark集群主节点服务

HBaseThriftServer服务

SparkThriftServer服务

演示程序Flask服务

NameNode

SecondaryNameNode

HRegionServer

ThriftServer

Master

ResourceManager

SparkSubmit

HMaster

hbase-slave1 Hadoop、HBase、Spark集群从节点服务 HMaster --backup

HRegionServer

NodeManager

DataNode

CoarseGrainedExecutorBackend

Worker

hbase-slave2 Hadoop、HBase、Spark集群从节点服务

Hive metestore服务

上同hbase-slave1节点

多出来一个HiveMetaStore

kafka_single 使用本机ZooKeeper服务的单节点Kafka Broker服务 QuorumPeerMain

Kafka

mysql 存储Hive元数据和演示程序数据的MySQL数据库 mysqld
redis 单节点Redis数据库 redis-server
slave01 运行模拟站点2的Apache服务

收集本机web访问日志的flume agent服务

apache2

flume-ng

slave02 运行模拟站点1的Apache服务

收集本机web访问日志的flume agent服务

apache2

flume-ng

zoo1  

为HBase提供ZooKeeper服务的集群

QuorumPeerMain
zoo2 QuorumPeerMain
zoo3 QuorumPeerMain

 

注意:

  1. 阅读本文档假设你已经掌握了简单的Docker操作知识。
  2. 本镜像文件只是保证书中演示项目正常运行,并没有包含书中全部章节的演示代码内容。
  3. 本镜像文件中各个组件的配置文件不具有通用性,不要直接用于任何生产环境。
  4. 由于Docker容器的特性限制,集群中任何一个节点上新增或修改文件后,Docker容器重启后都会还原成初始状态。请特别注意!!
  5. 宿主机上的/root/feiguyun_book2/volume目录下的hadoop、hbase、mysql、spark、zk这5个目录不要做任何改动,不要删除这5个目录,也不要删除或添加目录中的任何内容。
  6. 宿主机上的/root/feiguyun_book2/volume/code目录映射到镜像节点hbase-master的/code目录,存放在code目录下的内容在Docker容器重启后不会丢失。

 

第一章 Docker环境安装和容器启动

一、选择宿主机操作系统

宿主机系统选用CentOS 6.10或7.x,或者是Ubuntu 18.04 LTS。本文档使用的是CentOS 7.6版本。在宿主机上统一使用root用户完成Docker镜像安装。以下命令查看OS版本号。

  • cat /etc/centos-release

CentOS Linux release 7.6.1810 (Core)

 

读者也可以在windows平台上先安装CentOS 的虚拟机,在虚拟机中运行Docker。本安装文档就是在虚拟机中测试完成的。无论使用实体机还是虚拟机作为宿主机,硬件资源最低需要硬盘为50G,内存为12G

二、修改yum源

由于在安装docker服务时会先安装一些前置工具,可以把CentOS的yum源改成国内的。具体方法可参考网上资料。(https://www.cnblogs.com/wdjsbk/p/9629931.html

 

三、在宿主机上安装Docker服务

依次运行以下命令

3-1. yum install -y yum-utils device-mapper-persistent-data lvm2

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

3-3. yum makecache fast

3-4. rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

 

四、安装docker-ce服务

4-1. yum install docker-ce

4-2. usermod -aG docker $(whoami)

4-3. systemctl enable docker.service

4-4. systemctl start docker.service

 

五、在宿主机上安装docker-compose服务

5-1. yum install epel-release -y

5-2. yum install -y python-pip

5-3. python -m pip install --upgrade pip -i https://pypi.douban.com/simple

5-4. pip --version

pip 20.0.2 from /usr/lib/python2.7/site-packages/pip (python 2.7)

 

5-5. yum install python-devel

5-6. yum groupinstall "Development Tools"

5-7. yum install -y gcc g++ kernel-devel

 

5-8. pip install docker-compose -i https://pypi.douban.com/simple

 

最后查看docker-compose版本号

5-9. docker-compose -version

docker-compose version 1.25.4, build unknown

六、加载镜像文件和启动容器实例

6-1. 在/root目录下创建文件夹feiguyun_book2,把百度云盘下载的所有tar.gz文件放入该文件夹下。从读者QQ群文件中下载docker-compose.yml文件放入文件夹feiguyun_book2。把从读者QQ群文件中下载的code文件夹放入/root/feiguyun_book2/volume/目录下

 

6-2. 进入/root/feiguyun_book2目录,运行docker images命令,确保没有任何镜像文件;运行docker ps命令,确保没有任何镜像进程运行。如下图:

 

6-3. 加载镜像文件,在/root/feiguyun_book2目录下,依次运行以下命令

docker load < 1

docker load < 2

docker load < 3

docker load < 4

docker load < 5

docker load < 6

docker load < 7

docker load < 8

docker load < 9

注意:当镜像文件比较大时,加载文件会比较慢

 

6-4. 加载完成后,查看所有镜像文件列表

6-5.使用命令 docker network create hadoop-docker 创建网络

 

6-6. 创建mysql数据库表存放目录。在feiguyun_book2目录下运行以下两个命令行

mkdir volume/mysql

chown -R 999 volume/mysql/

 

6-7. docker-compose up -d 启动Docker镜像服务

6-7. docker-compose ps查看所有镜像进程启动情况,如下图所示

第二章 大数据环境初始化及启动、验证

一、格式化HDFS。只需要运行一次

在/root/feiguyun_book2目录下运行命令:

  • docker-compose exec hbase-master hdfs namenode -format

最后运行的结果如下所示

二、初始化Hive元数据库。只需要运行一次

Hive的元数据存放在mysql节点的数据库中,需要先创建可以连接mysql数据库的账户。在/root/feiguyun_book2目录下运行命令:

2-1. docker-compose exec mysql bash

进入到mysql 节点,使用cli工具进入数据库(下面红色部分是输入的命令内容)

root@mysql:/# mysql -u root -p

Enter password:  ******     <root用户的密码是hadoop>

进入后输入如下红色部分:

mysql> use mysql;

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION;

mysql> FLUSH PRIVILEGES;

mysql> select host,user from user;

+-----------+---------------+

| host  | user     |

+-----------+---------------+

| %    | docker   |

| %     | root    |

| localhost | mysql.session |

| localhost | mysql.sys     |

| localhost | root   |

+-----------+---------------+

5 rows in set (0.00 sec)

 

 

运行完成,可以退出mysql 节点。

 

2-2. 在feiguyun_book2目录下输入以下命令,初始化hive数据库表数据

docker-compose exec hbase-master schematool -dbType mysql -initSchema

最后运行结果如下

三、启动Hadoop服务

在/root/feiguyun_book2目录下运行命令:

3-1. docker-compose exec hbase-master start-dfs.sh

3-2. docker-compose exec hbase-master start-yarn.sh

验证yarn服务和dfs服务

docker-compose exec hbase-master bash  输入命令进入hbase-master节点,在该节点中输入命令:

cd /root/hadoop/share/hadoop/mapreduce

3-4. hadoop jar hadoop-mapreduce-examples-2.7.7.jar pi 3 10

最后可以看到输出以下内容:

Estimated value of Pi is 3.60000000000000000000

 

 

四、启动Hive metastore服务

在/root/feiguyun_book2目录下运行命令:

docker-compose exec hbase-slave2 bash

进入hbase-slave2节点,启动服务,运行如下命令:

cd /root/hive/bin

4-1. nohup ./hive --service metastore&

 

启动后可以进入hive验证一下服务

在/root/feiguyun_book2目录下运行命令:

docker-compose exec hbase-master bash

进入hbase-master节点,启动hive cli,使用如下步骤:

[root@hbase-master /]# which hive

/root/hive/bin/hive

[root@hbase-master /]# hive

hive> show databases;

OK

default

Time taken: 1.767 seconds, Fetched: 1 row(s)

hive> exit;

 

五、启动HBase服务

在/root/feiguyun_book2目录下运行命令:

docker-compose exec hbase-master  bash

进入hbase-master节点,启动服务,运行如下命令:

cd /root/hbase/bin

5-1.  ./start-hbase.sh

启动后等待15秒左右,启动hbase shell,使用如下步骤:

[root@hbase-master /]# which hbase

/root/hbase/bin/hbase

[root@hbase-master /]# hbase shell

hbase(main):001:0> status

1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load

看到HBase节点状态都正常,顺便把两个表创建了,如下红色部分命令:

hbase(main):002:0> create 'rpt_artcl',{NAME=>'cf', VERSIONS=>3, COMPRESSION=>'GZ'}

0 row(s) in 5.7520 seconds

 

=> Hbase::Table - rpt_artcl

hbase(main):003:0> create 'access_log',{NAME=>'cf', VERSIONS=>3, COMPRESSION=>'GZ'}

0 row(s) in 2.4530 seconds

 

=> Hbase::Table - access_log

hbase(main):004:0> list

TABLE

access_log

rpt_artcl

2 row(s) in 0.0690 seconds

 

=> ["access_log", "rpt_artcl"]

最后使用exit退出HBase shell

【注】如果输入status命令显示ZooKeeper服务错误,请先查看文档最后“故障排除”中的解决办法。

 

在hbase-master节点启动Hbase thrift server服务

在/root/hbase/bin目录下运行命令

5-2.  sh  hbase-daemon.sh start thrift

 

六、启动Spark服务

在/root/feiguyun_book2目录下运行命令:

6-1. docker-compose exec hbase-master start-all.sh

启动后,登录hbase-slave2(或hbase-master、hbase-slave1)节点上验证spark服务

cd /root/spark/

6-2. ./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://hbase-master.hadoop-docker:7077 examples/jars/spark-examples_2.11-2.4.1.jar 10

运行最后可以看到输出的Pi值如下,说明Spark正常使用

Pi is roughly 3.141452

 

七、启动SparkThriftServer服务

在/root/feiguyun_book2目录下运行命令:

docker-compose exec hbase-master bash 进入hbase-master节点后,运行下面红色命令

7-1. hdfs dfs -chmod -R  777 /tmp

7-2. cd /root/spark/sbin/

7-3. ./start-thriftserver.sh --hiveconf hive.server2.thrift.http.port=10000 --master spark://hbase-master.hadoop-docker:7077 --jars $HIVE_HOME/lib/hive-hbase-handler-2.3.4.jar,$HIVE_HOME/lib/hbase-client-1.4.9.jar,$HIVE_HOME/lib/hbase-common-1.4.9.jar,$HIVE_HOME/lib/hbase-server-1.4.9.jar,$HIVE_HOME/lib/hbase-protocol-1.4.9.jar,$HIVE_HOME/lib/guava-12.0.1.jar,$HIVE_HOME/lib/htrace-core-3.2.0-incubating.jar

 

验证sparkThriftServer服务

登录hbase-slave2(或hbase-master、hbase-slave1)节点,输入下面红色部分

[root@hbase-slave2 /]# cd /root/spark/bin

[root@hbase-slave2 bin]# ./beeline

Beeline version 1.2.1.spark2 by Apache Hive

beeline>  !connect jdbc:hive2://hbase-master:10000/

Connecting to jdbc:hive2://hbase-master:10000/

Enter username for jdbc:hive2://hbase-master:10000/: root

Enter password for jdbc:hive2://hbase-master:10000/: ****

(注意:这里的登录账户是运行 beeline的用户的用户名和密码, root用户的密码是root)

SLF4J: ... ...

Connected to: Spark SQL (version 2.4.1)

Driver: Hive JDBC (version 1.2.1.spark2)

Transaction isolation: TRANSACTION_REPEATABLE_READ

0: jdbc:hive2://hbase-master:10000/> show databases;

+-------------------------+--+

| databaseName  |

+-------------------------+--+

| default        |

+-------------------------+--+

1 row selected (2.507 seconds)

0: jdbc:hive2://hbase-master:10000/> !q

Closing: 0: jdbc:hive2://hbase-master:10000/

 

第三章 演示程序数据初始化及运行步骤

一、初始化Hive表

在/root/feiguyun_book2目录下运行命令:

docker-compose exec hbase-master bash 进入节点后,运行下面命令

  • hive -f /code/source-code/ch4/create-tables.hql

运行后,如果没有出错,可以进入beeline客户端查看所有创建的表,共10张。如下图所示:

 

二、运行数据导入程序

在/root/feiguyun_book2目录下运行命令:

docker-compose exec hbase-master bash 进入hbase-master节点后,运行下面命令

2-1.  cd /code/source-code/ch4/etl_job/

2-2.  chmod +x artcl_hive2hbase/hive2hbase.sh

2-3.  python3.6 run.py 20200220      ß参数20200220也可以改成其他任意日期

初始化脚本会运行大概7分钟,最终把数据插入到HBase中。以下是运行截图。

正常执行完毕后,可以进入HBase中查看记录数量,如下所示

hbase(main):001:0> count 'rpt_artcl'

90 row(s) in 1.7790 seconds

=> 90

 

运行导入数据程序只需执行一次,无需更换成其他日期重复运行,因为输入数据是固定的。

三、启动Flask前端查看数据

在hbase-master节点上运行下面命令

python36 /code/ch7/flask_app/run.py

 

运行后不要关闭该窗口。然后在宿主机上打开浏览器,输入http://宿主机IP地址:5000/index 比如我的宿主机IP地址是192.168.1.4,则可以输入 http://192.168.1.4:5000/index

进入演示程序后,可以进入“检索抓取文章”页面,输入时间段进行检索,如下所示

时间段请选择2017-5-1至2019-5-1之间的日期,其他日期段没有数据。

 

四、确认两个模拟网站正常访问

比如我的宿主机IP地址是192.168.1.4,则可以在浏览器中输入以下网址查看模拟新闻站点

http://192.168.1.4:10080/site1.com/

http://192.168.1.4:20080/site2.com/

 

五、创建kafka主题

进入宿主机/root/feiguyun_book2目录,输入以下命令

docker  exec -it kafka_single bash

进入后创建weblog主题,如下命令

5-1.  kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic weblog

5-2.  kafka-topics.sh --list --zookeeper localhost:2181

以下是命令运行截图

创建后退出该节点即可。

 

六、启动两个Flume Agent客户端

进入宿主机/root/feiguyun_book2目录,输入以下命令

docker-compose exec slave01 bash

进入slave01节点后,在根目录输入如下命令,启动后不要关闭窗口

6-1.  flume-ng agent --conf /opt/flume/conf/ --f /opt/weblog2kafka.conf  --name a1 -Dflume.root.logger=INFO,console

 

在宿主机中启动新的terminal,进入/root/feiguyun_book2目录

docker-compose exec slave02 bash

进入slave02节点后,在根目录输入如下命令,启动后不要关闭窗口

6-2.  flume-ng agent --conf /opt/flume/conf/ --f /opt/weblog2kafka.conf  --name a1 -Dflume.root.logger=INFO,console

 

七、启动Flink并加载job

容器中Flink服务默认自动启动,只需要打开浏览器查看WebUI即可,比如我的宿主机IP地址是192.168.1.4,则可以在浏览器中输入http://192.168.1.4:8081/

参照本书11.5章节介绍的步骤,把flink2hbase_docker.jar提交作业至Flink(flink2hbase_docker.jar文件在QQ群文件中可以获得),如下图所示

 

八、运行站点模拟访问程序

在宿主机上打开浏览器,输入http://宿主机IP地址:5000/ pvchart,比如我的宿主机IP地址是192.168.1.4,则可以输入 http://192.168.1.4:5000/pvchart

点击开始模拟按钮,会刷新图表20秒,如下图所示

演示完成后,可以到“检索访问日志”页面查看刚才模拟访问的页面地址,在http://192.168.1.4:5000/access_log 页面,如下所示。注意查询开始结束时间要选择刚才模拟访问的时间段,其他区间可能没有数据。

 

九、运行词云图生成和统计程序

根据刚才模拟访问的日志,可以生成关键字词云图,访问地址是 http://192.168.1.4:5000/wordcloud,注意查询开始结束时间要选择刚才模拟访问的时间段,如下所示:

注意:其中的英文单词是未被剔除的HTML标签,有兴趣的读者可以完善自己的stopwords停用词典。如下图是生成访问关键字占比统计,时间段同样要选择刚才模拟访问的20秒。

第四章 如何关闭服务

一、关闭大数据组件服务步骤

离线大数据组件主要安装在hbase-master节点上,下面的操作都在hbase-master上运行:

cd /root/hbase/bin

./hbase-daemon.sh stop thrift

./stop-hbase.sh

 

cd /root/spark/sbin

./stop-thriftserver.sh

./stop-all.sh

 

cd /root/hadoop/sbin

./stop-yarn.sh

./stop-dfs.sh

 

流式大数据组件的服务不用手动关闭。

 

二、关闭容器集群

确认关闭hbase-master上的服务后,可以进入宿主机关闭容器集群服务。

在/root/feiguyun_book2目录下运行命令:

docker-compose down  如下所示

注意事项:

关闭容器集群后如果要再次启动,只需要在/root/feiguyun_book2目录下执行

docker-compose up -d

启动命令即可,不需要再次执行格式化HDFS和初始化Hive元数据库。

 

 

“非习劳无以进业”---- 希望您能通过以上步骤的指引,顺利运行演示程序,并最终学有所获!!

 

(完)

附录 故障排除

一、Hadoop启动失败

Hadoop集群启动后,可以分别登录hbase-master,hbase-slave1,hbase-slave2三个节点,依次查看Java进程是否正确。如果HDFS或MapReduce无法正常运行,可在hbase-master节点手动关闭dfs和yarn服务,尝试再次启动。

 

二、HBase启动失败

在虚拟机作为宿主机的场景下,经常会出现HBase首次启动失败,hbase-master节点上的HMaster进程启动后自动消失,进入hbase shell客户端使用status查看状态会提示ZooKeeper服务出错。

出现这种错误的原因是由于系统资源紧张,ZooKeeper集群和HBase通讯出故障。zoo1,zoo2,zoo3三个节点的ZooKeeper服务都是随着Docker服务自动启动的,不必手动运行。当HBase服务启动失败时,可以先进入hbase-slave1和hbase-slave2节点,使用kill命令杀掉HRegionServer服务,最后进入hbase-master节点,运行:

cd /root/hbase/bin/

./stop-hbase.sh

关闭HBase服务,再使用 ./start-hbase.sh 启动,往往就正常了。

三、Spark启动失败

Spark启动失败的情况比较少见,可以尝试关闭后再启动。或者可以修改hbase-master节点上Spark启动脚本里面内存使用量,由于本演示程序只使用Spark作为Hive的计算引擎这一个特性,可以把内存使用量调小,比如定义成256M。

四、初始化Hive表错误

Hive表DDL都定义在create-tables.hql文件中,只需要运行一次。如果第一次运行失败,再次运行前,要修改create-tables.hql文件,注释掉 create database feigu 这行。

五、运行数据导入程序错误

运行该步骤前要确保Hive metastore和HBase服务及SparkThriftServer服务都已正常启动,否则会报错。

六、运行站点模拟访问程序错误

点击开始模拟按钮后会出现坐标轴,但没有生成折线。出现这种错误要依次排查3处:

 

  • 模拟新闻站点运行是否正常

打开浏览器,访问slave01或slave02的新闻站点,同时进入slave01或slave02的终端,运行 tail -f /var/log/apache2/access.log 看是否有日志输出。

 

  • Kafka中weblog主题是否正常接收到数据

如果flume-ng可以收到日志数据,则进入kafka_single节点的终端,启动一个消费者

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic weblog --from-beginning

来订阅weblog主题的数据,看是否有数据输出

 

  • Flink作业是否运行正常

如果kafka主题可以接收到数据,要排查Flink作业日志输出,在WebUI上查看TaskManager的Logs中是否有异常抛出,如下所示

然后再查看Stdout页面中是否打印出如下内容

七、其他问题

可以在QQ群50926571中提问,或是在feiguyunai上发帖求助。