基于容器和集群技术的数据自动化采集设计和实现

目标:部署mysql服务容器并使用docker构建包含python爬虫脚本的容器采集数据到mysql数据库。

环境:Centos7、已配置Kubernetes集群及docker。

环境配置请参考以下文章:
CentOS7搭建Kubernetes集群

Kubernetes集群信息如下(虚拟机主机名和IP地址):

主机名IP地址
master192.168.138.110
slave1192.168.138.111
slave2192.168.138.112

1. 安装MySQL数据库

1.1 创建 namespace

创建namespace,用于部署mysql,使其与其他应用程序隔离

kubectl create namespace dev

1.2 创建持久卷 PV

1)创建PV(持久数据卷),用于存储mysql数据文件

mdir -p /nfs/data/01

2)编写msql-pv.yaml文件,内容如下:

apiVersion: v1
kind: PersistentVolume
metadata:name: pv-1gi
spec:capacity:storage: 1GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/01server: 192.168.138.110

3)创建PV对象

kubectl create -f mysql-pv.yaml

4)查看创建结果

kubectl get pv
kubectl describe pv pv-1gi

在这里插入图片描述

1.3 创建持久卷声明 PVC

1)编写mysql-pvc.yaml文件,文件内容如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvcnamespace: dev
spec:accessModes:- ReadWriteManyresources:requests:storage: 1GistorageClassName: nfs

2)创建此PVC对象

kubectl create -f mysql-pvc.yaml

3)查看创建结果

kubectl get pvc -n dev

在这里插入图片描述

可以看到,mysql-pvc对象已经和pv-1gi对象绑定。

1.4 创建Secret对象以保存mysql的root用户密码

1)执行创建命令,并将密码设置为 123456

kubectl create secret generic mysql-root-password --from-literal=password=123456 -n dev

2)查看创建结果

kubectl get secret -n dev
kubectl get secret mysql-root-password -n dev -o yaml

在这里插入图片描述

1.5 创建Service

1)编辑mysql-svc.yaml文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: mysqlname: mysqlnamespace: devspec:containers:- image: mysql:8.0name: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-root-passwordkey: passwordports:- containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:labels:app: svc-mysqlname: svc-mysqlnamespace: dev
spec:selector:app: mysqltype: NodePortports:- port: 3306protocol: TCPtargetPort: 3306nodePort: 31233

2)创建mysql-svc

kubectl create -f mysql-svc.yqml

3)查看创建结果

kubectl get pod, svc -n dev

在这里插入图片描述

2. 设置mysql数据库远程连接

2.1 进入容器设置远程连接

1)进入容器

kubectl exec -it mysql /bin/bash -n dev

2)登录mysql

mysql -u root -p123456

在这里插入图片描述

3)配置root用户可远程连接

mysql> ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)mysql> ALTER USER root@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)

4)创建mydb库并授权给root用户

mysql> create database mydb;mysql> grant all privileges on mydb.* to 'root'@'%';
flush privileges;

5)使用可视化软件进行远程连接

查看mysql部署在集群的哪个节点上

kubectl get service -n dev -o wide

在这里插入图片描述

在navicat新键连接,使用slave2的IP地址和映射端口即192.168.138.112:31233

在这里插入图片描述

测试连接

在这里插入图片描述

注:若是连接失败,使用命令kubectl get pods -n kube-system获取pod名称查看coredns的状态,若为CrashLoopBackOff(这是因为每次挂机再启动之后,/etc/resolv.conf主机下的nameserver都被修改为8.8.8.8和114.114.114.114),则需要进行如下修改:

将nameserver 修改为master主机的ip(三台主机都修改)

vim /etc/resolv.conf

在这里插入图片描述

在这里插入图片描述

修改成功后,再删除异常coredns的两个pod即可,通过 kubectl get pods -n kube-system获取pod名称。

删除成功之后k8s会自动创建两个coredns。

再通过 kubectl get pods -n kube-system查看coredns的状态,状态是running的时候,java-web和k8s配置的数据库就可以访问了。

在这里插入图片描述

2.2 建表

1)在数据库mydb中建product_info

# 切换数据库
use mydb	
# 建product_info表
CREATE TABLE product_info(	
product_name varchar (1000)
, supplier varchar (1000)
, supplier_web varchar (1000)
, product_desc varchar (1000)
,product_img varchar (1000)
, product_price varchar (1000)
, addr varchar (1000)
, mailing_ins varchar (1000));

在这里插入图片描述

2)查看表

show tables;

在这里插入图片描述

3. 采集数据存入数据库

3.1 创建定时任务Dockerfile及脚本

1)创建爬虫脚本

vim mysql.sh

#!/usr/bin/env python
# coding: utf-8# In[1]:import urllib.request
from time import sleep
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin
import pymysql# In[2]:headers = {'User-Agent': 'Mozilla/6.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
}# In[3]:def get_info(page):url='https://www.cnhnb.com/p/mianfen-0-0-0-0-{}/'.format(page)req = urllib.request.Request(url, headers=headers)html = urllib.request.urlopen(req)soup = bs(html.read(), 'html.parser')lu = soup.find_all('div',class_='show-ctn')product_all=[]for i in lu:product_name=i.find('h2').get_text()#产品名称supplier=i.find("a").get_text()#供应商supplier_web=i.find("a").attrs['href']#供应商网址product_desc=i.find('div',class_='shop-image').img.attrs['alt']#产品介绍product_img=i.find('div',class_='shop-image').img.attrs['src']#产品图片product_price=str(i.find('div',class_='shops-price').get_text()).strip().replace('\n','').replace(' ','')#产品价格addr=str(i.find('div',class_='r-shop-btm').get_text())#发货地mailing_ins=str(i.find('div',class_='cw-tags').get_text()).strip().replace('\n','').replace(' ','')#邮寄说明product=[product_name,supplier,supplier_web,product_desc,product_img,product_price,addr,mailing_ins]product_all.append(product)return product_all# In[12]:def save_mysql(all_data):conn = pymysql.connect(host='192.168.138.112', user='root', port=31233, password='123456', db='mydb', charset='utf8')curson = conn.cursor()# 创建表sql语句#ctablesql = 'CREATE TABLE product_info(product_name varchar (1000), supplier varchar (1000), supplier_web varchar (1000), product_desc varchar (1000),product_img varchar (1000), product_price varchar (1000), addr varchar (1000), mailing_ins varchar (1000))'#curson.execute(ctablesql)# 插入数据SQL语句insertsql = 'insert into product_info(product_name,supplier,supplier_web,product_desc,product_img,product_price,addr,mailing_ins) value (%s,%s,%s,%s,%s,%s,%s,%s)'for data in all_data:data = tuple(data)curson.execute(insertsql, data)conn.commit()# In[13]:if __name__ == '__main__':for i in range(1,89):all_data=get_info(i)save_mysql(all_data)

注:save_mysql函数conn = pymysql.connect(host='192.168.138.112', user='root', port=31233, password='123456', db='mydb', charset='utf8')语句中的host要更改为自己mysql服务容器部署的那个节点。

2)创建执行脚本

vim script.sh

python3 /mysql.py >> /var/log/cron.log 2>&1

如果脚本执行出现异常则将异常信息追加到/var/log/cron.log文件中。

3)创建定时任务脚本

vim Dockerfile

内容如下:

FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN yum makecache fast;
RUN yum -y update && \yum -y install cronie.x86_64RUN yum install python3-devel python3-pip -y
RUN pip3 install -i https://pypi.douban.com/simple pymysql
RUN pip3 install -i https://pypi.douban.com/simple Beautifulsoup4COPY ./script.sh /script.sh
COPY ./mysql.py /mysql.py
RUN chmod +x /script.sh
RUN chmod +x /mysql.pyCMD crond

此处包含了两层调度,crond命令定时调度script.sh脚本,script.sh脚本又调度了python爬虫脚本。

注:这三个文件要放在同一级目录下,方便后续的镜像构建。

3.2 创建镜像

利用Dockerfile构建镜像

docker build -t docker-crond .

创建完成后如下:

在这里插入图片描述

3.3 执行脚本

1)进入容器内部

创建docker-crond容器并进入容器内部

docker run -it docker-crond /bin/bash

2)配置定时任务

设定时程表

crond
crontab -e

添加内容如下:

*/5 * * * * /script.sh >> /var/log/cron.log 2>&1

在这里插入图片描述

注:2>&1是一个重定向操作符,用于将标准错误(文件描述符2)重定向到标准输出(文件描述符1)。

之后保存退出,脚本就会自动执行。

在这里插入图片描述

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。

3.4 查看结果

因为脚本设定是每5分钟执行一次,一共执行两次,所以10分钟后查看。

在这里插入图片描述

可以看到据容器运行已经11分钟,进入到navicat查看表内容

select count(1) from product_info;select * from product_info;

在这里插入图片描述

在这里插入图片描述

4. docker commit构建镜像并推送到镜像仓库

1)查看容器

docker ps 

在这里插入图片描述

2)将指定容器构建成为镜像

docker commit dreamy_sammet registry.cn-hangzhou.aliyuncs.com/hadooptian/docker-crond:v1

注:要根据特定格式打标签即registry.cn-hangzhou.aliyuncs.com/用户名/镜像名称:版本号

在这里插入图片描述

3)查看构建完成的镜像

docker images

在这里插入图片描述

4)登录阿里云镜像仓库

docker login --username=hadooptian registry.cn-hangzhou.aliyuncs.com

在这里插入图片描述

5)推送镜像

docker push registry.cn-hangzhou.aliyuncs.com/hadooptian/docker-crond:v1

在这里插入图片描述

6)到阿里云仓库查看

在这里插入图片描述

可以看到,构建的镜像已经被推送到阿里云镜像仓库中了。

至此,基于容器和集群技术的数据自动化采集设计和实现项目完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/264978.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建Facebook直播网络对IP有要求吗?

在当今数字化时代,Facebook直播已经成为了一种极具吸引力的社交形式,为个人和企业提供了与观众直接互动的机会,成为推广产品、分享经验、建立品牌形象的重要途径。然而,对于许多人来说,搭建一个稳定、高质量的Facebook…

[Docker 教学] 常用的Docker 命令

Docker是一种流行的容器化技术。使用Docker可以将数据科学应用程序连同代码和所需的依赖关系打包成一个名为镜像的便携式工件。因此,Docker可以简化开发环境的复制,并使本地开发变得轻松。 以下是一些必备的Docker命令列表,这些命令将在你下一…

Open CASCADE学习|GC_MakeArcOfCircle构造圆弧

目录 1、通过圆及圆的两个参数创建圆弧,参数为弧度角 2、通过圆及圆上的一点、圆的1个参数创建圆弧,参数为弧度角,Sense决定方向 3、通过圆及圆上的两个点创建圆弧,Sense决定方向 4、通过三点创建圆弧,最后一点应安…

设计模式学习笔记 - 面向对象 - 8.实践:贫血模型和充血模型的原理及实践

1.Web开发常用的贫血MVC架构违背OOP吗? 前面我们依据讲过了面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格,基于接口而非实现编程和多用组合少用继承设计思想。接下来,通过实战来学习如何将这些理论应用到实际的开发中。 大部…

“目标检测”任务基础认识

“目标检测”任务基础认识 1.目标检测初识 目标检测任务关注的是图片中特定目标物体的位置。 目标检测最终目的:检测在一个窗口中是否有物体。 eg:以猫脸检测举例,当给出一张图片时,我们需要框出猫脸的位置并给出猫脸的大小,如…

CS_上线三层跨网段机器(完整过程还原)

以前讲过用cs_smb_beacon上线不出网机器,但是真实的网络拓扑肯定不止这么一层的网络! 所以我就来搭建一个复杂一点的网络环境!! 当然了,这三台电脑之间都是不同的网段,(但是同属于一个域环境&a…

第五节:Vben Admin权限-前端控制方式

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 文章目录 系列文章目录前言一、Vben Admin权…

R语言混合效应(多水平/层次/嵌套)模型及贝叶斯实现技术应用

回归分析是科学研究中十分重要的数据分析工具。随着现代统计技术发展,回归分析方法得到了极大改进。混合效应模型(Mixed effect model),即多水平模(Multilevel model)/分层模型(Hierarchical Model)/嵌套模…

【总第49篇】2.3深度学习开发任务实例(2)机器学习和深度学习的对比【大厂AI课学习笔记】

机器学习和深度学习都是用于图片分类任务的强大工具,但它们采用的方法和原理有所不同。下面我将分别解释这两种技术是如何应用于图片分类的,并着重讨论深度学习中的卷积概念。 机器学习在图片分类中的应用 传统的机器学习方法在进行图片分类时&#xf…

python爬虫实战:获取电子邮件和联系人信息

引言 在数字时代,电子邮件和联系人信息成为了许多企业和个人重要的资源,在本文中,我们将探讨如何使用Python爬虫从网页中提取电子邮件和联系人信息,并附上示例代码。 目录 引言 二、准备工作 你可以使用以下命令来安装这些库&a…

VSCode远程开发 Windows11 Linux

问题背景 之前一直用JetBrains的Gateway和本地Linux虚拟机开发,不过笔记本配置不够,太卡了。最近租了个国外的便宜服务器,JetBrains的Gateway总断连,也不知道为什么,所以试试VSCode。 本地 Windows 11 ,远…

vuex配置和使用(vue3配置)

个人理解可能会有所偏差 1、基础使用 首先在创建项目时可以选择vuex和一些其他的配置,如果选择那么他会自动创建store文件夹生成默认格式,如果没有选择可以使用指令: npm install vuexnext --save 然后手动创建即可 import { createStore }…

10 Redis之SB整合Redis+ 高并发问题 + 分布式锁

7. SB整合Redis Spring Boot 中可以直接使用 Jedis 实现对 Redis 的操作,但一般不这样用,而是使用 Redis操作模板 RedisTemplate 类的实例来操作 Redis。 RedisTemplate 类是一个对 Redis 进行操作的模板类。该模板类中具有很多方法,这些方…

git commit 后,本地远端都没有记录,消失不见

今天git commit 之后发现远端没有记录,本地没有最新代码记录 git commit 后,提交记录会消失不见的原因可能是: git只git commit了,没有push到远程分支,切换到其他分支时丢失。而且看不到提交记录,和找不到…

【AIGC】基于深度学习的图像生成与增强技术

摘要: 本论文探讨基于深度学习的图像生成与增强技术在图像处理和计算机视觉领域的应用。我们综合分析了主流的深度学习模型,特别是生成对抗网络(GAN)和变分自编码器(VAE)等,并就它们在实际应用中…

Maya笔记 设置工作目录

Maya会把素材场景等自动保存在工作目录里,我们可以自己定义工作目录 步骤1 创建workspace.mel文件 文件/设置项目 ——>选择一个文件夹,点击设置——>创建默认工作区 这一个后,可以在文件夹里看到.mel文件 步骤2 自动创建文件夹…

Qt程序设计-钟表自定义控件实例

本文讲解Qt钟表自定义控件实例。 效果如下: 创建钟表类 #ifndef TIMEPIECE_H #define TIMEPIECE_H#include <QWidget> #include <QPropertyAnimation> #include <QDebug> #include <QPainter> #include <QtMath>#include <QTimer>#incl…

Spring Boot与Netty:构建高性能的网络应用

点击下载《Spring Boot与Netty&#xff1a;构建高性能的网络应用》 1. 前言 本文将详细探讨如何在Spring Boot应用中集成Netty&#xff0c;以构建高性能的网络应用。我们将首先了解Netty的原理和优势&#xff0c;然后介绍如何在Spring Boot项目中集成Netty&#xff0c;包括详…

Linux进程 ----- 信号处理

目录 前言 一、信号的处理时机 1.1 处理时面临的情况 1.2 “合适”的时机 二、用户态与内核态 2.1 概念理论 2.2 再现 进程地址空间 2.3 信号处理过程 三、信号的捕捉 3.1 内核实现 3.2 sigaction 四、信号部分小结 前言 从信号产生到信号保存&#xff0c;中间经历…

计算机网络-后退N帧协议(弊端 滑动窗口 运行中的GBN 滑动窗口长度习题 GBN协议性能分析 )

文章目录 停等协议的弊端后退N帧协议中的滑动窗口GBN发送方必须响应的三件事GBN接受方要做的事运行中的GBN滑动窗口长度GBN协议重点总结习题1习题2GBN协议性能分析小结 停等协议的弊端 信道利用率低&#xff1a;在停等协议中&#xff0c;发送方在发送完一帧后必须等待接收方确…