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

news2025/1/15 16:37:20

目标:部署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: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 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-pvc
  namespace: dev
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: 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: mysql
  name: mysql
  namespace: dev
    spec:
      containers:
      - image: mysql:8.0
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-root-password
              key: password
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: svc-mysql
  name: svc-mysql
  namespace: dev
spec:
  selector:
    app: mysql
  type: NodePort
  ports:
  - port: 3306
    protocol: TCP
    targetPort: 3306
    nodePort: 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 -p
	123456

在这里插入图片描述

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_64

RUN 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 Beautifulsoup4


COPY ./script.sh /script.sh
COPY ./mysql.py /mysql.py
RUN chmod +x /script.sh
RUN chmod +x /mysql.py

CMD 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.coloradmin.cn/o/1470708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

apache 模式、优化、功能 与 nginx优化、应用

一、I/O模型——Input/Output模型 1.同步/异步 A程序需要调用B程序的某一个功能,A发送一个请求需要B完成一个任务 同步:B不会主动去通知A是否完成需要A自己去问 异步:B会主动通知A是否完成 2.阻塞/非阻塞 A发送一个请求需要B完成一个任务 …

【大数据】Flink SQL 语法篇(四):Group 聚合

Flink SQL 语法篇(四):Group 聚合 1.基础概念2.窗口聚合和 Group 聚合3.SQL 语义4.Group 聚合支持 Grouping sets、Rollup、Cube 1.基础概念 Group 聚合定义(支持 Batch / Streaming 任务):Flink 也支持 G…

Python及Pycharm专业版下载安装教程(Python 3.11版)附JetBrains学生认证教程

目录 一、Python下载及安装1、Python下载2、Python安装3、验证是否安装成功 二、PyCharm下载及安装1、PyCharm下载2、PyCharm安装3、激活PyCharm 三、JetBrains学生认证 本篇主要介绍Python和PyCharm专业版的下载及安装方式,以及通过两种方式进行JetBrains学生认证。…

第十篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:Microsoft Azure开发语音翻译应用程序经典案例

传奇开心果博文系列 系列博文目录Python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、Azure多语种支持示例代码四、Azure实时对话模式示例代码五、Azure自定义翻译模型示例代码六、Azure语音合成示例代码七、Azure用户界面优化示…

openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore

文章目录 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore229.1 设计原理229.2 核心优势229.3 使用指导 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore Ustore存储引擎,又名In-place Update存储引擎(原地更新&#xff09…

java面试(网络)

TCP和UDP有什么区别?TCP三次握手不是两次? TCP:面向连接,可靠的,传输层通信协议。点对点,占用资源多,效率低。 UDP:无连接,不可靠,传输层通信协议。广播&…

Nvidia Jetson Orin NX配置环境

Nvidia Jetson Orin NX配置环境配置环境 一、安装jetson5.1.2二、安装jtop三、配置CUDA和cuDNN四、安装Pytorch 先导片:Jetson采用arm64架构 一、安装jetson5.1.2 安装好jetson自带cuda、cudnn和tensorRT 官方文档 更换源 sudo vi /etc/apt/sources.list.d/nvidia…

力扣技巧题:丢失的数字

先排后找可以让结果更简单 int cmp(const void* a, const void* b){return *(int*)a - *(int*)b; } int missingNumber(int* nums, int numsSize){qsort(nums, numsSize, 4, cmp);for(int i0; i<numsSize; i){if(nums[i] i){continue;}else{return i;}}return numsSize; }…

10 在线逻辑分析仪的使用

在线逻辑分析仪简介 传统的 FPGA 板级调试是将逻辑分析仪连接到 FPGA 的 IO 引脚上 &#xff0c;然后将内部信号引出至 IO 引脚&#xff0c;再进行板级调试&#xff0c;这种方法的缺点是我们需要一个逻辑分析仪&#xff0c;且还要在 PCB 中预留测试点。在线逻辑分析仪克服了以…

使用 C++23 协程实现第一个 co_yield 同步风格调用接口--Qt计算排列组合

在C23的协程特性里&#xff0c; co_yield 用于从协程执行过程中返回值。这个功能乍一听起来很奇怪&#xff0c;网上的例子大多是用一个计数器来演示多次中断协程函数&#xff0c;返回顺序的计数值。这看起来毫无意义。 其实这个功能主要想演示的就是协程 co_yield 具备打断一个…

【数据结构】图——最短路径

最短路径问题&#xff1a;从在带权有向图G中的某一顶点出发&#xff0c;找出一条通往另一顶点的最短路径&#xff0c;最短也就是沿路径各边的权值总和达到最小。 最短路径分为图中单源路径和多源路径。 本文会介绍Dijkstra和Bellman-Ford解决单源路径的问题 Floyd-Warshall解…

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的多特征分类预测

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测 目录 SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍…

【牛客】2024牛客寒假算法基础集训营6ABCDEGHIJ

文章目录 A 宇宙的终结题目大意主要思路代码 B 爱恨的纠葛题目大意主要思路代码 C 心绪的解剖题目大意主要思路代码 D 友谊的套路题目大意主要思路代码 E 未来的预言题目大意主要思路代码 G 人生的起落题目大意主要思路代码 I 时空的交织题目大意主要思路代码 J 绝妙的平衡题目…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(三)

在人工智能成为我们日常互动中无处不在的一部分的时代&#xff0c;与大型语言模型(llm)有效沟通的能力是无价的。“良好提示的26条原则”为优化与这些复杂系统的交互提供了全面的指导。本指南证明了人类和人工智能之间的微妙关系&#xff0c;强调清晰、专一和结构化的沟通方法。…

leetcode hot100 买卖股票最佳时机3

本题中&#xff0c;依旧可以采用动态规划来进行解决&#xff0c;之前的两个题我们都是用二维数组dp[i][2]来表示的&#xff0c;其中i表示第i天&#xff0c;2表示长度为2&#xff0c;其中0表示不持有&#xff0c;1表示持有。 本题中&#xff0c;说至多完成两笔交易&#xff0c;也…

RabbitMQ 面试八股题整理

前言&#xff1a;本文是博主网络自行收集的一些RabbitMQ相关八股文&#xff0c;还在准备暑期实习&#xff0c;后续应该会持续更新...... 参考&#xff1a;三天吃透RabbitMQ面试八股文_牛客网 目录 RabbitMQ概述 什么是 RabbitMQ&#xff1f; 说一说RabbitMQ中的AMQP 为什么…

单机取证-信息安全管理与评估-2022年国赛真题-环境+wp

🍬 博主介绍 博主介绍:大家好,我是 Mikey ,很高兴认识大家~ 主攻:【应急响应】 【python】 【数字取证】【单机取证】【流量分析】【MISC】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步 作者水平有限,欢迎各…

网络层的DDoS攻击与应用层的DDoS攻击之间的区别

DDoS攻击&#xff08;即“分布是拒绝服务攻击”&#xff09;&#xff0c;是基于DoS的特殊形式的拒绝服务攻击&#xff0c;是一种分布式、协作的大规模攻击方式&#xff0c;主要瞄准一些企业或政府部门的网站发起攻击。根据攻击原理和方式的区别&#xff0c;可以把DDoS攻击分为两…

(done) 如何判断一个矩阵是否可逆?

参考视频&#xff1a;https://www.bilibili.com/video/BV15H4y1y737/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这个视频里还暗含了一些引理 1.若 AX XB 且 X 和 A,B 同阶可逆&#xff0c;那么 A 和 B 相似。原因&#xff1…

RDMA内核态函数ib_post_recv()源码分析

接上文&#xff0c;上文分析了内核rdma向发送队列添加发送请求的函数ib_post_send&#xff0c;本文分析一下向接收队列添加接收请求的函数ib_post_recv。其实函数调用流程与上文类似&#xff0c;不再重复说明&#xff0c;可参考链接。 函数调用过程 最终会调用到这个函数 下面…