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

目标:部署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)到阿里云仓库查看

在这里插入图片描述

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浪潮信息服务器蝉联全球第二,中国第一持续领跑

作为服务器领域的专家,浪潮信息多年来持续通过技术创新更新服务,提升产品竞争力,领衔全球服务器市场。根据国际权威研究机构高德纳(Gartner)公布的《2023年第3季度全球服务器市场追踪报告》可见,2023Q3全球…

Java里常用的集合哪些是线程安全的和不安全的

最近在做一个业务的时候,需要考虑线程的安全性,然后选用集合的时候专门去整理了一下。 线程安全的是: Hashtable,ConcurrentHashMap,Vector ,CopyOnWriteArrayList ,CopyOnWriteArraySet 线程不安全的是: H…

计算机网络:思科实验【4-生成树协议STP及虚拟局域网VLAN】

🌈个人主页:godspeed_lucip 🔥 系列专栏:Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学,回复思科获取下载链接。 实验目的实验环境实验内容交换机生成树协议**STP**虚拟局域网**VLAN…

vue3个人网站电子宠物

预览 具体代码 Attack.gif Attacked.gif Static.gif Walk.gif <template><div class"pet-container" ref"petContainer"><p class"pet-msg">{{ pet.msg }}</p><img ref"petRef" click"debounce(attc…

FreeRTOS学习第8篇--同步和互斥操作引子

目录 FreeRTOS学习第8篇--同步和互斥操作引子同步和互斥概念实现同步和互斥的机制PrintTask_Task任务相关代码片段CalcTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第8篇–同步和互斥操作引子 本文目标&#xff1a;学习与使用FreeRTOS中的同步和互斥操…

01背包问题:组合问题

01背包问题&#xff1a;组合问题 题目 思路 将nums数组分成left和right两组&#xff0c;分别表示相加和相减的两部分&#xff0c;则&#xff1a; left - right targetleft right sum 进而得到left为确定数如下&#xff0c;且left必须为整数&#xff0c;小数表示组合不存在&…

Android Gradle 开发与应用 (一) : Gradle基础

1. Gradle是什么 Gradle是一个通用的构建工具&#xff0c;支持诸多主要的 IDE&#xff0c;包括 Android Studio、IntelliJ IDEA、Visual Studio 等 Gradle 的底层实现(核心引擎和框架)其实是用 Java 编写的开发者通常使用 Groovy 或 Kotlin 来编写构建脚本 1.1 那么为什么Gra…

【JavaScript 漫游】【021】EventTarget 接口

事件的本质是程序各个组成部分之间的一种通信方式&#xff0c;也是异步编程的一种实现。DOM 支持大量的事件。 EventTarget 接口概述 DOM 的事件操作&#xff08;监听和触发&#xff09;&#xff0c;都定义在 EventTarget 接口。所有节点对象都部署了这个接口&#xff0c;其他…

Request 和 Response详解

文章目录 1.Request和Response的概述2.Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式 2.3 解决post请求乱码问题 掌握学习目标内容讲解内容小结 2.4 Request请求转发 3.HT…

electron+vue3全家桶+vite项目搭建【27】封装窗口工具类【1】雏形

文章目录 引入思路抽出公共声明文件抽出全局通用数据类型和方法主进程模块1.抽离基础常量2.封装窗口工具类 渲染进程模块测试结果 引入 demo项目地址 可以看到我们之前在主进程中的逻辑全部都塞到index.ts文件中&#xff0c;包括窗口的一些事件处理&#xff0c;handle监听&am…

docker 容器访问 GPU 资源使用指南

概述 nvidia-docker 和 nvidia-container-runtime 是用于在 NVIDIA GPU 上运行 Docker 容器的两个相关工具。它们的作用是提供 Docker 容器与 GPU 加速硬件的集成支持&#xff0c;使容器中的应用程序能够充分利用 GPU 资源。 nvidia-docker 为了提高 Nvidia GPU 在 docker 中的…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化

在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现…

C语言编程安全规范

目的 本规范旨在加强编程人员在编程过程中的安全意识,建立编程人员的攻击者思维,养成安全编码的习惯,编写出安全可靠的代码。 2 宏 2.1 用宏定义表达式时,要使用完备的括号 2.2 使用宏时,不允许参数发生变化 3 变量 3.1 所有变量在定义时必须赋初值 变量声明赋予初值,可…

matlab simulink永磁同步电机pid控制

1、内容简介 略 53-可以交流、咨询、答疑 2、内容说明 略 摘 要 19世纪90年代&#xff0c;美国西屋电气公司研制出了世界上第一台交流同步电机。随着科学技术的迅猛发展和生产工艺的持续进步&#xff0c;在20世纪50年代出现了永磁同步电机。它以永磁体代替电励磁绕组&#…

CSS重点

第一章&#xff1a;CSS类型 1、行内样式 <div style"color:red;font-size:30px;font-weight: 900;font-style: italic;">qcby</div>注意&#xff1a;行内样式&#xff0c;作用力优先级最高&#xff0c;但是不利于html与css的书写以及修改&#xff0c;会…

曲线生成 | 图解B样条曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 控制点计算之插值2 控制点计算之近似3 仿真实现3.1 ROS C实现3.2 Python实现3.3 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&a…

990-11产品经理:Team Building in Project Management 项目管理中的团队建设

Introduction One of the most important developments in management during the 1970’s has been the widespread application广泛应用 of project teams to a variety of complex tasks. Project managers quickly learn the critical significance批判意义 of the effect…

Android RecyclerView 如何展示自定义列表 Kotlin

Android RecyclerView 如何展示自定义列表 Kotlin 一、前提 有这么一个对象 class DeviceDemo (val name: String, val type: String, val address: String)要展示一个包含这个对象的列表 bluetoothDevices.add(DeviceDemo("bb 9800", "LE", "32:…

Qt QWiget 实现简约美观的加载动画 第三季

&#x1f603; 第三季来啦 &#x1f603; 这是最终效果: 只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]…

《Docker 简易速速上手小册》第8章 Docker 在企业中的应用(2024 最新版)

文章目录 8.1 Docker 在开发环境中的应用8.1.1 重点基础知识8.1.2 重点案例&#xff1a;Python Web 应用开发环境8.1.3 拓展案例 1&#xff1a;Python 数据分析环境8.1.4 拓展案例 2&#xff1a;Python 自动化测试环境 8.2 Docker 在生产环境的实践8.2.1 重点基础知识8.2.2 重点…