在线教育数仓项目(数据采集部分1)

news2024/12/26 23:14:55

文章目录

  • 数据仓库概念
  • 项目需求及架构设计
    • 项目需求分析
    • 系统数据流程设计
    • 框架版本选型
    • 集群规模估算
    • 集群资源规划设计
  • 数据生成模块
    • 目标数据
      • 页面
      • 事件
      • 曝光
      • 启动
      • 播放
      • 错误
    • 数据埋点
      • 主流埋点方式(了解)
      • 埋点数据上报时机
      • 埋点数据日志结构
    • 服务器和JDK准备
      • 服务器准备
      • 编写集群分发脚本xsync
      • SSH无密登录配置
      • JDK准备
      • 环境变量配置说明
        • 登录Shell和非登录Shell的区别
    • 模拟数据
      • 使用说明
      • 集群日志及业务数据生成脚本

数据仓库概念

数据仓库( Data Warehouse ),是为企业制定决策,提供数据支持的。可以帮助企业改进业务流程、提高产品质量等。

数据仓库的输入数据通常包括:业务数据、用户行为数据和爬虫数据等

业务数据:就是各行业在处理事务过程中产生的数据。比如用户在网站中登录、下单、支付等过程中,需要和网站后台数据库进行增删改查交互,产生的数据就是业务数据。业务数据通常存储在MySQL、Oracle等数据库中。

用户行为数据:用户在使用产品过程中,通过埋点收集与客户端产品交互过程中产生的数据,并发往日志服务器进行保存。比如页面浏览、点击、停留、评论、点赞、收藏等。用户行为数据通常存储在日志文件中。

爬虫数据:通常是通过技术手段获取其他公司网站的数据。

项目需求及架构设计

项目需求分析

1)采集平台
(1)用户行为数据采集平台搭建
(2)业务数据采集平台搭建

2)离线需求
在这里插入图片描述
3)实时需求
在这里插入图片描述

系统数据流程设计

在这里插入图片描述

框架版本选型

在这里插入图片描述

集群规模估算

在这里插入图片描述

集群资源规划设计

下面是根据您提供的信息转换成的Markdown表格:

服务名称子服务hadoop102hadoop103hadoop104
hadoop102服务器--
hadoop103服务器--
hadoop104服务器---
HDFSNameNode--
HDFSDataNode
HDFSSecondaryNameNode--
YarnNodeManager
YarnResourcemanager--
ZookeeperZookeeper Server
Flume(采集日志)Flume-
KafkaKafka
Flume(消费Kafka日志)Flume--
Flume(消费Kafka业务)Flume--
Hive
MySQLMySQL--
DataX
Spark
DolphinSchedulerApiApplicationServer--
DolphinSchedulerAlertServer--
DolphinSchedulerMasterServer--
DolphinSchedulerWorkerServer
DolphinSchedulerLoggerServer
SupersetSuperset--
服务数总计161112

数据生成模块

目标数据

我们要收集和分析的数据主要包括页面数据、事件数据、曝光数据、启动数据、播放数据和错误数据

页面

页面数据主要记录一个页面的用户访问情况,包括访问时间、停留时间、页面路径等信息。

1)日志范例如下

{
  "actions": [
…
  ],
  "common": {
…
  },
  "displays": [
    …
  ],
  "page": {
    "during_time": 11622,
    "item": "57",
    "item_type": "course_id",
    "last_page_id": "course_list",
    "page_id": "course_detail"
  },
  "ts": 1645529967261
}

2)所有页面类型如下:

home("首页")
course_list("列表页")
course_detail("商品详情")
chapter_video("章节视频")
cart("购物车")
order("下单结算")
payment("支付页面")
exam("考试")
mine("我的")

3)所有页面对象类型如下:

course_id("课程Id")
keyword("搜索关键词")
video_id("视频id")
chapter_id("章节id")
coupon_id("购物券id")
order_id("订单id")
paper_id("考卷id")
exam_id("考试id")

事件

事件数据主要记录应用内一个具体操作行为,包括操作类型、操作对象、操作对象描述等信息。

1)日志范例:

{
  "actions": [
    {
      "action_id": "favor_add",
      "item": "57",
      "item_type": "course_id",
      "ts": 1645529967261
    },
    {
      "action_id": "cart_add",
      "item": "57",
      "item_type": "course_id",
      "ts": 1645529967261
    }
  ],
  "common": {
…
  },
  "displays": [
…
  ],
  "page": {
…
  },
  "ts": 1645529967261
}

注:对于下单、支付等业务数据,可从业务数据库获取。

2)所有动作类型如下

favor_add(新增收藏)
review_add(新增课程评价)
comment_add(新增章节评价)
cart_add(加购物车)

3)所有动作目标类型如下:

course_id("课程Id")
keyword("搜索关键词")
video_id("视频id")
chapter_id("章节id")
coupon_id("购物券id")
order_id("订单id")
paper_id("考卷id")
exam_id("考试id")

曝光

曝光数据主要记录页面所展示的内容,包括曝光对象,曝光类型等信息。

1)曝光日志范例:

{
  "actions": [
    …
  ],
  "common": {
    …
  },
  "displays": [
    {
      "display_type": "query",
      "item": "6",
      "item_type": "course_id",
      "order": 1,
      "pos_id": 4
    },
    {
      "display_type": "query",
      "item": "8",
      "item_type": "course_id",
      "order": 2,
      "pos_id": 5
    },
    {
      "display_type": "query",
      "item": "1",
      "item_type": "course_id",
      "order": 3,
      "pos_id": 4
    },
    {
      "display_type": "query",
      "item": "10",
      "item_type": "course_id",
      "order": 4,
      "pos_id": 1
    },
    {
      "display_type": "promotion",
      "item": "4",
      "item_type": "course_id",
      "order": 5,
      "pos_id": 4
    },
    {
      "display_type": "promotion",
      "item": "4",
      "item_type": "course_id",
      "order": 6,
      "pos_id": 4
    },
    {
      "display_type": "query",
      "item": "9",
      "item_type": "course_id",
      "order": 7,
      "pos_id": 1
    }
  ],
  "page": {
    …
  },
  "ts": 1645529967261
}

2)所有曝光类型如下:

promotion("商品推广")
recommend("算法推荐商品")
query("查询结果商品")
activity("促销活动")

3)所有曝光对象类型如下:

course_id("课程Id")
keyword("搜索关键词")
video_id("视频id")
chapter_id("章节id")
coupon_id("购物券id")
order_id("订单id")
paper_id("考卷id")
exam_id("考试id")

启动

启动数据记录应用的启动信息。

1)启动日志范例:

{
  "common": {
    …
  },
  "start": {
    "entry": "notice",
    "first_open": 0,
    "loading_time": 17970,
    "open_ad_id": 20,
    "open_ad_ms": 2876,
    "open_ad_skip_ms": 0
  },
  "ts": 1645532980257
}

2)所有启动入口类型如下:

icon("图标"),
notice("通知"),
install("安装后启动");

播放

播放日志记录播放信息。

1)播放日志范例:

{
  "appVideo": {
    "play_sec": 19,
    "video_id": "3904"
  },
  "common": {
…
  },
  "ts": 1645526307119
}

错误

错误数据记录应用使用过程中的错误信息,包括错误编号及错误信息。

上述五种日志都有可能包含错误信息,此处仅对 appVideo 的错误日志进行展示。

1)错误日志范例

{
    "appVideo":{
  …
    },
    "common":{
  …
    },
    "err":{
        "error_code":3485,
        "msg":" Exception in thread \\  java.net.SocketTimeoutException\\n \\tat com.yudan.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)"
    },
    "ts":1645538276217
}

数据埋点

主流埋点方式(了解)

目前主流的埋点方式,有代码埋点(前端/后端)、可视化埋点、全埋点三种。

  • 代码埋点是通过调用埋点SDK函数,在需要埋点的业务逻辑功能位置调用接口,上报埋点数据。例如,我们对页面中的某个按钮埋点后,当这个按钮被点击时,可以在这个按钮对应的 OnClick 函数里面调用SDK提供的数据发送接口,来发送数据。
  • 可视化埋点只需要研发人员集成采集 SDK,不需要写埋点代码,业务人员就可以通过访问分析平台的“圈选”功能,来“圈”出需要对用户行为进行捕捉的控件,并对该事件进行命名。圈选完毕后,这些配置会同步到各个用户的终端上,由采集 SDK 按照圈选的配置自动进行用户行为数据的采集和发送。
  • 全埋点是通过在产品中嵌入SDK,前端自动采集页面上的全部用户行为事件,上报埋点数据,相当于做了一个统一的埋点。然后再通过界面配置哪些数据需要在系统里面进行分析。

埋点数据上报时机

埋点数据上报时机包括两种方式。

方式一,在离开该页面时,上传在这个页面产生的所有数据(页面、事件、曝光、错误等)。优点,批处理,减少了服务器接收数据压力。缺点,不是特别及时。

方式二,每个事件、动作、错误等,产生后,立即发送。优点,响应及时。缺点,对服务器接收数据压力比较大。

埋点数据日志结构

我们的日志结构大致可分为三类,一是普通页面埋点日志,二是启动日志,三是播放日志。

普通页面日志结构如下,每条日志包含了,当前页面的页面信息,所有事件(动作)、所有曝光信息以及错误信息。除此之外,还包含了一系列公共信息,包括设备信息,地理位置,应用信息等,即下边的common字段。

1)普通页面埋点日志格式

{
  "actions": [
    {
      "action_id": "favor_add",
      "item": "57",
      "item_type": "course_id",
      "ts": 1645529967261
    },
    {
      "action_id": "cart_add",
      "item": "57",
      "item_type": "course_id",
      "ts": 1645529967261
    }
  ],
  "common": {
    "ar": "16",
    "ba": "iPhone",
    "ch": "Appstore",
    "is_new": "1",--是否首日使用,首次使用的当日,该字段值为1,过了24:00,该字段置为0。
    "md": "iPhone 8",
    "mid": "mid_161",
    "os": "iOS 13.3.1",
    "sc": "2",
    "sid": "9acef85b-067d-49f9-9520-a0dda943304e",
    "uid": "272",
    "vc": "v2.1.134"
  },
  "displays": [
    {
      "display_type": "query",
      "item": "6",
      "item_type": "course_id",
      "order": 1,
      "pos_id": 4
    },
    {
      "display_type": "query",
      "item": "8",
      "item_type": "course_id",
      "order": 2,
      "pos_id": 5
    },
    {
      "display_type": "query",
      "item": "1",
      "item_type": "course_id",
      "order": 3,
      "pos_id": 4
    },
    {
      "display_type": "query",
      "item": "10",
      "item_type": "course_id",
      "order": 4,
      "pos_id": 1
    },
    {
      "display_type": "promotion",
      "item": "4",
      "item_type": "course_id",
      "order": 5,
      "pos_id": 4
    },
    {
      "display_type": "promotion",
      "item": "4",
      "item_type": "course_id",
      "order": 6,
      "pos_id": 4
    },
    {
      "display_type": "query",
      "item": "9",
      "item_type": "course_id",
      "order": 7,
      "pos_id": 1
    }
  ],
  "page": {
    "during_time": 11622,
    "item": "57",
    "item_type": "course_id",
    "last_page_id": "course_list",
    "page_id": "course_detail"
  },
  "err":{
    "error_code":1359,
    "msg":" Exception in thread \\  java.net.SocketTimeoutException\\n \\tat com.yudan.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)"
  },
  "ts": 1645529967261
}

2)启动日志格式

启动日志结构相对简单,主要包含公共信息,启动信息和错误信息。

{
  "common": {
    "ar": "1",
    "ba": "Redmi",
    "ch": "wandoujia",
    "is_new": "1",
    "md": "Redmi k30",
    "mid": "mid_356",
    "os": "Android 11.0",
    "sc": "2",
    "sid": "76909678-abaf-41c4-916d-a0a72f546bc1",
    "uid": "161",
    "vc": "v2.1.134"
  },
  "start": {
    "entry": "notice",
    "first_open": 0,
    "loading_time": 17970,
    "open_ad_id": 20,
    "open_ad_ms": 2876,
    "open_ad_skip_ms": 0
  },
  "err":{
    "error_code":2959,
    "msg":" Exception in thread \\  java.net.SocketTimeoutException\\n \\tat com.yudan.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)"
  },
  "ts": 1645532980257
}

3)播放日志

播放日志结构相对简单,主要包含公共信息,播放信息和错误信息。

{
  "appVideo": {
    "play_sec": 19,
    "video_id": "3904"
  },
  "common": {
    "ar": "4",
    "ba": "Sumsung",
    "ch": "oppo",
    "is_new": "0",
    "md": "Sumsung Galaxy S20",
    "mid": "mid_253",
    "os": "Android 11.0",
    "sc": "1",
    "sid": "47157c4a-4790-4b9a-a859-f0d36cd62a10",
    "uid": "329",
    "vc": "v2.1.134"
  },
  "err":{
    "error_code":3485,
    "msg":" Exception in thread \\  java.net.SocketTimeoutException\\n \\tat com.yudan.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)"
  },
  "ts": 1645526307119
}

服务器和JDK准备

服务器准备

安装如下文档配置步骤,分别安装hadoop102、hadoop103、hadoop104三台主机。
具体配置链接

编写集群分发脚本xsync

1)xsync集群分发脚本

  • 需求:循环复制文件到所有节点的相同目录下

  • 需求分析

    ①rsync命令原始拷贝:

    rsync -av /opt/module root@hadoop103:/opt/

    ②期望脚本:
    xsync要同步的文件名称

    说明:在/home/yudan/bin这个目录下存放的脚本,atguigu用户可以在系统任何地方直接执行。

  • 脚本实现

    ①在用的家目录/home/atguigu下创建bin文件夹

      [yudan@hadoop102 ~]$ mkdir bin
    

    ②在/home/yudan/bin目录下创建xsync文件,以便全局调用

      [yudan@hadoop102 ~]$ cd /home/yudan/bin
      [yudan@hadoop102 ~]$ vim xsync
    
    #!/bin/bash
    #1. 判断参数个数
    if [ $# -lt 1 ]
    then
      echo Not Enough Arguement!
      exit;
    fi
    #2. 遍历集群所有机器
    for host in hadoop102 hadoop103 hadoop104
    do
      echo ====================  $host  ====================
      #3. 遍历所有目录,挨个发送
      for file in $@
      do
        #4 判断文件是否存在
        if [ -e $file ]
        then
          #5. 获取父目录
          pdir=$(cd -P $(dirname $file); pwd)
          #6. 获取当前文件的名称
          fname=$(basename $file)
          ssh $host "mkdir -p $pdir"
          rsync -av $pdir/$fname $host:$pdir
        else
          echo $file does not exists!
        fi
      done
    done
    

    ③修改脚本xsync具有执行权限

      [yudan@hadoop102 bin]$ chmod +x xsync
    

    ④测试脚本

      [yudan@hadoop102 bin]$ xsync xsync
    

SSH无密登录配置

  • hadoop102上生成公钥和私钥:

      [yudan@hadoop102 .ssh]$ ssh-keygen -t rsa
    

    然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

  • 将hadoop102公钥拷贝到要免密登录的目标机器上

      [yudan@hadoop102 .ssh]$ ssh-copy-id hadoop102
      [yudan@hadoop102 .ssh]$ ssh-copy-id hadoop103
      [yudan@hadoop102 .ssh]$ ssh-copy-id hadoop104
    
  • hadoop103上生成公钥和私钥:

      [yudan@hadoop103 .ssh]$ ssh-keygen -t rsa
    

    然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

  • 将hadoop103公钥拷贝到要免密登录的目标机器上

      [yudan@hadoop103 .ssh]$ ssh-copy-id hadoop102
      [yudan@hadoop103 .ssh]$ ssh-copy-id hadoop103
      [yudan@hadoop103 .ssh]$ ssh-copy-id hadoop104
    
  • hadoop104上生成公钥和私钥:

      [yudan@hadoop104 .ssh]$ ssh-keygen -t rsa
    

    然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

  • 将hadoop104公钥拷贝到要免密登录的目标机器上

      [yudan@hadoop102 .ssh]$ ssh-copy-id hadoop102
      [yudan@hadoop103 .ssh]$ ssh-copy-id hadoop103
      [yudan@hadoop104 .ssh]$ ssh-copy-id hadoop104
    

JDK准备

  • 卸载现有JDK(3台节点)

      [yudan@hadoop102 opt]# sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps
      
      [yudan@hadoop103 opt]# sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps
      
      [yudan@hadoop104 opt]# sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps
    

    (1)rpm -qa:表示查询所有已经安装的软件包
    (2)grep -i:表示过滤时不区分大小写
    (3)xargs -n1:表示一次获取上次执行结果的一个值
    (4)rpm -e --nodeps:表示卸载软件

  • 将JDK导入到hadoop102的/opt/software文件夹下面

    JDK安装包
    链接: https://pan.baidu.com/s/1-bY0-GN85TJRhp-levcoSg?pwd=8ah6
    提取码: 8ah6

  • 在Linux系统下的opt目录中查看软件包是否导入成功

      [yudan@hadoop102 software]# ls /opt/software/
    
      看到如下结果:
      jdk-8u212-linux-x64.tar.gz
    
  • 解压JDK到/opt/module目录下

      [yudan@hadoop102 software]# tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
    
  • 配置JDK环境变量

    • 新建/etc/profile.d/my_env.sh文件

        [yudan@hadoop102 module]# sudo vim /etc/profile.d/my_env.sh
      
        #JAVA_HOME
        export JAVA_HOME=/opt/module/jdk1.8.0_212
        export PATH=$PATH:$JAVA_HOME/bin
      
    • 让环境变量生效

        [yudan@hadoop102 software]$ source /etc/profile.d/my_env.sh
      
  • 测试JDK是否安装成功

      [yudan@hadoop102 module]# java -version
    
      如果能看到以下结果、则Java正常安装
      java version "1.8.0_212"
    
  • 分发JDK

      [yudan@hadoop102 module]$ xsync /opt/module/jdk1.8.0_212/
    
  • 分发环境变量配置文件
    [yudan@hadoop102 module]$ sudo /home/yudan/bin/xsync /etc/profile.d/my_env.sh

  • 分别在hadoop103、hadoop104上执行source

      [yudan@hadoop103 module]$ source /etc/profile.d/my_env.sh
      [yudan@hadoop104 module]$ source /etc/profile.d/my_env.sh
    

环境变量配置说明

Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/*.sh,/.bashrc,/.bash_profile等,下面说明上述几个文件之间的关系和区别。

bash的运行模式可分为login shell和non-login shell

例如,我们通过终端,输入用户名、密码,登录系统之后,得到就是一个login shell。而当我们执行以下命令ssh hadoop103 command,在hadoop103执行command的就是一个non-login shell。

登录Shell和非登录Shell的区别

在这里插入图片描述
这两种shell的主要区别在于,它们启动时会加载不同的配置文件,login shell启动时会加载/etc/profile,/.bash_profile,/.bashrc。non-login shell启动时会加载~/.bashrc。

模拟数据

使用说明

模拟数据生成文件地址
链接: https://pan.baidu.com/s/1ZYFLlkhI4JqvzugvySs_Sg
提取码: k93s

  1. application.yml、edu2021-mock-2022-06-18.jar、path.json、edu0222.sql、logback.xml上传到hadoop102的/opt/module/data_mocker目录下

    创建applog路径

     [yudan@hadoop102 module]$ mkdir /opt/module/data_mocker
    
  2. 需要安装配置MySQL
    MySQL安装包
    链接: https://pan.baidu.com/s/1Yov8DpOPaji58Axzp6VDWA?pwd=us87
    提取码: us87

    (1)将MySQL安装文件拷贝到/opt/software

     01_mysql-community-common-5.7.16-1.el7.x86_64.rpm
     02_mysql-community-libs-5.7.16-1.el7.x86_64.rpm
     03_mysql-community-libs-compat-5.7.16-1.el7.x86_64.rpm
     04_mysql-community-client-5.7.16-1.el7.x86_64.rpm
     05_mysql-community-server-5.7.16-1.el7.x86_64.rpm
     mysql-connector-java-5.1.27-bin.jar
    

    (2)卸载自带的Mysql-libs(如果之前安装过MySQL,要全都卸载掉)

     [yudan@hadoop102 software]$ rpm -qa | grep -i -E mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps
    

    (3)安装 MySQL 依赖

     [yudan@hadoop102 software]$ sudo rpm -ivh 01_mysql-community-common-5.7.16-1.el7.x86_64.rpm
     [yudan@hadoop102 software]$ sudo rpm -ivh 02_mysql-community-libs-5.7.16-1.el7.x86_64.rpm
     [yudan@hadoop102 software]$ sudo rpm -ivh 03_mysql-community-libs-compat-5.7.16-1.el7.x86_64.rpm
    

    (4)安装 mysql-client

     [yudan@hadoop102 software]$ sudo rpm -ivh 04_mysql-community-client-5.7.16-1.el7.x86_64.rpm
    

    (5)安装 mysql-server

     [yudan@hadoop102 software]$ sudo rpm -ivh 05_mysql-community-server-5.7.16-1.el7.x86_64.rpm
    

    注意:如果报如下错误,这是由于yum安装了旧版本的GPG keys所造成,从rpm版本4.1后,在安装或升级软件包时会自动检查软件包的签名。

     warning: 05_mysql-community-server-5.7.16-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
     error: Failed dependencies:
     libaio.so.1()(64bit) is needed by mysql-community-server-5.7.16-1.el7.x86_64
    
     解决办法
     [yudan@hadoop102 software]$ sudo rpm -ivh 05_mysql-community-server-5.7.16-1.el7.x86_64.rpm --force --nodeps
    

    (6)启动 MySQL

     [yudan@hadoop102 software]$ sudo systemctl start mysqld
    

    (7)查看 MySQL 密码

     [yudan@hadoop102 software]$ sudo cat /var/log/mysqld.log | grep password
    

    (8)配置只要是root用户 + 密码,在任何主机上都能登录MySQL数据库。

     i)用刚刚查到的密码进入MySQL(如果报错,给密码加单引号)
     [yudan@hadoop102 software]$ mysql -uroot -p'password'
     
     ii)设置复杂密码(由于MySQL密码策略,此密码必须足够复杂)
     mysql> set password=password("Qs23=zs32");
     
     iii)更改MySQL密码策略
     mysql> set global validate_password_length=4;
     mysql> set global validate_password_policy=0;
     
     iv)设置简单好记的密码
     mysql> set password=password("000000");
     
     v)进入MySQL库
     mysql> use mysql
     
     vi)查询user表
     mysql> select user, host from user;
     
     vii)修改user表,把Host表内容修改为%
     mysql> update user set host="%" where user="root";
     
     viii)刷新
     mysql> flush privileges;
     
     ix)退出
     mysql> quit;
    
  3. 需要安装配置MySQL

    sql文件地址
    通过网盘分享的文件:edu.sql
    链接: https://pan.baidu.com/s/1gQ3z-boyI7aSaPC8t2Yz3A?pwd=fyxm
    提取码: fyxm

(1)登录Navicat等连接MySQL工具,创建数据库edu

(2)在数据库edu下,运行edu.sql文件

集群日志及业务数据生成脚本

在hadoop102的/home/atguigu目录下创建bin目录,这样脚本可以在服务器的任何目录执行。

[yudan@hadoop102 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yudan/.local/bin:/home/yudan/bin

1)在/home/yudan/bin目录下创建脚本mock.sh

[yudan@hadoop102 bin]$ vim mock.sh

2)在脚本中编写如下内容

#! /bin/bash
ssh hadoop102 "cd /opt/module/data_mocker/;java -jar edu2021-mock-2022-06-18.jar 1>/dev/null 2>&1 &"

3)修改脚本执行权限

[yudan@hadoop102 bin]$ chmod +x mock.sh

4)测试脚本

[yudan@hadoop102 module]$ mock.sh

5)在hadoop102的/opt/module/data_mocker/log目录上查看生成的数据

[yudan@hadoop102 log]$ ls
app.log

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

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

相关文章

C++(入门1)

C参考文档 Reference - C Reference C 参考手册 - cppreference.com cppreference.com 第一个C程序 #include<stdio.h> int main() {printf("Hello C\n");return 0; }由上述代码可知C是兼容C语言 第一个C标准程序 #include<iostream> using names…

C#初级——枚举

枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且&#xff0c;在这个整型常量列表中&#xff0c;通常默认第一位枚举符号的值为0&#xff0c;此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…

[MySQL][深入理解隔离性][下][Read View]详细讲解

目录 1.Read View1.是什么&#xff1f;2.理解3.整体流程 2.RR与RC的本质区别1.当前读和快照读在RR级别下的区别2.RR与RC的本质区别 1.Read View 1.是什么&#xff1f; Read View就是事务进行 快照读 操作的时候生产的 读视图(Read View)&#xff0c;在该事务执行快照读的那一…

白嫖游戏指南,Epic喜加一:《暗影火炬城》

前言 Epic喜加一&#xff1a;《暗影火炬城》《暗影火炬城》简介&#xff1a; 前言 接下来有时间会分享一些游戏相关可以白嫖的资源&#xff0c;包括游戏本体、游戏素材资源等等。 有需要的小伙伴可以关注这个专栏&#xff0c;不定期更新哦&#xff01; 专栏&#xff1a;白嫖…

学习型组织:知识创造的 SECI 螺旋模型 —— 隐性知识和显性知识的转换

《创造知识的企业》的日本学者野中郁次郎用了 30 多年的时间跟踪日本企业的变化&#xff0c;揭示日本企业成功的奥秘。 在野中之前和之后&#xff0c;也有不少学者聚焦日本&#xff0c;但是&#xff0c;多数人看到的&#xff0c;只是优良的生产技术&#xff0c;企业和顾客、供…

【计算机网络】DHCP实验

一&#xff1a;实验目的 1&#xff1a;深入理解DHCP&#xff08;动态主机配置协议&#xff09;的工作原理和数据包交换过程。 2&#xff1a;掌握如何通过命令行释放和重新获取IP地址&#xff0c;并通过抓包软件分析DHCP消息的具体内容。 二&#xff1a;实验仪器设备及软件 硬…

数据挖掘-数据预处理

来自&#x1f96c;&#x1f436;程序员 Truraly | 田园 的博客&#xff0c;最新文章首发于&#xff1a;田园幻想乡 | 原文链接 | github &#xff08;欢迎关注&#xff09; 文章目录 3.3.1 数据的中心趋势平均数和加权平均数众数&#xff0c;中位数和均值描述数据的离散程度 &a…

推荐3款将相片变为动漫风格的免费AI工具推荐

toonme ToonMe是一款功能强大的在线和移动端应用&#xff0c;专门用于将照片转换成卡通风格图像。该工具利用先进的AI技术&#xff0c;能够快速识别照片中的面部特征&#xff0c;并进行智能处理&#xff0c;生成高清晰度的卡通肖像。 功能特点 ToonMe通过其内置的人工智能算法…

AJAX-XMLHttpRequest 详解

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 XMLHttpRequest 概述 主要用途 工作流程 示例代码 GET 请求示例 POST 请求示例 注意事项 工作…

Java集合——Array、ArrayList、LinkedList

1. ArrayList和Array的区别 1. 大小和自动扩容 Array&#xff1a;创建时指定大小&#xff0c;大小固定。若数组被创建&#xff0c;其大小不能更改 ArrayList&#xff1a;动态数组实现&#xff0c;可以动态增长或缩小。在不断添加元素时&#xff0c;ArrayList会自动进行扩容 …

模式Hash和history

vuerouter有两种路由模式Hash和history。区别&#xff1a;Hash为默认模式&#xff0c;url中包含一个#符号的哈希部分。优势&#xff1a;兼容性好&#xff0c;不需要后端服务器的特殊配置。缺点&#xff1a;不够美观&#xff0c;搜索引擎优化较差。History模式使用的浏览器的His…

Cmake生成的Xcode工程相对路径与绝对路径的问题

Cmake生成的Xcode工程相对路径与绝对路径的问题 文章目录 Cmake生成的Xcode工程相对路径与绝对路径的问题前言修改.pbxproj文件验证工程小结 前言 由于Cmake的跨平台的自动化构建的方便性以及他广泛应用于编译过程的管理&#xff0c;在开发过程中难免用到Cmake。我也使用Cmake…

CTF-NSSCTF[GKCTF 2021]

[GKCTF 2021]easycms 考察&#xff1a; 用扫描工具扫描目录&#xff0c;扫描到后台登录界面/admin.php 题目提示了密码是五位弱口令&#xff0c;试了试弱口令admin和12345直接成功了 任意文件下载 点击设计-->主题然后随便选择一个主题&#xff0c;点击自定义&#xff0…

C++客户端Qt开发——Qt窗口(浮动窗口)

4.浮动窗口 在Qt中&#xff0c;浮动窗口也称之为铆接部件。浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口一般是位于核心部件的周围&#xff0c;可以有多个。 设置一个浮动窗口并添加控件 #include "mainwindow.h" #include "ui_mainwindow.h"…

现代Java开发:使用jjwt实现JWT认证

前言 jjwt 库 是一个流行的 Java 库&#xff0c;用于创建和解析 JWT。我在学习spring security 的过程中看到了很多关于jwt的教程&#xff0c;其中最流行的就是使用jjwt实现jwt认证&#xff0c;但是教程之中依然使用的旧版的jjwt库&#xff0c;许多的类与方法已经标记弃用或者…

人工智能GPT技术进步的新时代,你做好准备了吗?

OpenAI 最新发布的 GPT-4o Mini 模型以其卓越的性能和极具竞争力的价格引发了广泛关注。这款模型在提供高级语言理解和生成能力的同时&#xff0c;也在计算资源的消耗和部署成本上做出了显著优化&#xff0c;使得更多开发者能够轻松访问和使用。这篇文章将分析 GPT-4o Mini 在技…

python爬虫【3】—— 爬虫反反爬

一、常见的反爬手段和解决方法 二、splash 介绍与安装 三、验证码识别 图片验证码的处理方案 手动输入(input) 这种方法仅限于登录一次就可持续使用的情况图像识别引擎解析 使用光学识别引擎处理图片中的数据&#xff0c;目前常用于图片数据提取&#xff0c;较少用于验证码…

从零搭建pytorch模型教程(八)实践部分(二)目标检测数据集格式转换

前言 图像目标检测领域有一个非常著名的数据集叫做COCO&#xff0c;基本上现在在目标检测领域发论文&#xff0c;COCO是不可能绕过的Benchmark。因此许多的开源目标检测算法框架都会支持解析COCO数据集格式。通过将其他数据集格式转换成COCO格式可以无痛的使用这些开源框架来训…

【计算机网络】DNS命令练习与抓包分析实验

一&#xff1a;实验目的 1&#xff1a;掌握DNS缓存的清除方法&#xff0c;了解DNS缓存的作用和影响。 2&#xff1a;熟悉nslookup和dig等DNS查询工具的使用&#xff0c;理解DNS查询的基本原理和过程。 3&#xff1a;通过抓包和分析&#xff0c;深入了解DNS查询和响应消息的格…

探索 LLamaWorker 本地大模型API服务的新功能:函数调用

LLamaWorker 是一个基于 LLamaSharp 项目开发的可以在本地运行大模型服务&#xff0c;并提供与 OpenAI / Azure OpenAI 兼容的 API。同时&#xff0c;通过工具提示词的配置&#xff0c;提供函数调用 Function Call 能力&#xff0c;为开发者提供更多的可能。 1. 背景 在人工智…