大数据Spark实时处理--数据采集2(构建日志服务器)

  • yml配置文件的作用
  • 1)生产中,不建议使用src/main/resources中的application.properties,这种方式进行配置。
  • 2)首先注释掉application.properties:更改名字为application.properties-bak。即注释掉。
  • 3)在C:\Users\jieqiong\IdeaProjects\spark-log4j\log-web\src\main\resources----->new----->file:application.yml
  • 4)建议在SpringBoot,使用yml配置文件
  • 5)浏览界面:localhost:9527/imooc-web/hellolocalhost:9527/imooc-web/world01
server:
  port: 9527
  servlet:
    context-path: /imooc-web

 

  • 开发日志服务Controller
  • 1)构建日志服务器:开发一个web服务,提供一个接口(方法)出来,并使外面的数据落地即可。
  • 2)在src/main/java/com/imooc/bigdata/controller中新建LogController.java
  • 3)暴露出来接口,即LogController开发完成。
  • 4)这一步是开发服务端的代码。下一步是开发客户端的代码,把数据传上来的过程。最后进行联调
  • 5)getLogger报错:注意子pom里的org.slf4j依赖配置
package com.imooc.bigdata.controller;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/*
 * 日志服务流程:
 * client客户端 发送数据到-----》LogController类中,调用/upload请求 -----> 然后info数据落地到磁盘
 *                                                             ---》1)在这里先输出到磁盘
 *                                                             ---》2)再落到磁盘
 */
@Controller
public class LogController {

    //这里使用log4j的方式,将数据输出到磁盘上
    private static final Logger logger = Logger.getLogger(LogController.class);

    //上传日志方法
    //发送这种数据一般使用post,这是http中方法的区别
    @ResponseBody
    @PostMapping("/upload")
    public void upload(String info){

        //info信息直接打印到控制台
        logger.info(info);
    }
}

 

  •  客户端上报日志功能开发
  • 1)创建package:在IdeaProjects\spark-log4j\log-service\src\main\java\com\imooc\bigdata\log建立domain,放置对象类
  • 2)创建package:在IdeaProjects\spark-log4j\log-service\src\main\java\com\imooc\bigdata\log建立utils,放置工具类
  • 3)Access.java
  • 在domain包中,创建Access类,用于简单的测试:id、name、time
  • 然后生成get/set方法。右键----->Generate----->Getter and Setter
  • 并实现toString方法:通过toString方法,可以实现最终的日志输出格式。右键----->Generate----->toString
  • 4)UploadUtils.java
  • 在utils包中
  • 上传数据的工具类:一条数据过来,上传一下。
  • 这个工具类就是用于发送方法的,通过方法发送数据。
  • 定义一个方法:这里设定一个静态方法upload(String path, String log)
  • 5)MockData.java
  • 在utils包中
  • 这是一个造数据的工具类,使用单元测试进行测试。直接调用UploadUtils.java中的upload()方法
  • 所以先定义好path
  • 6)客户端和服务端的都已开发完成,之后进行联调测试。
package com.imooc.bigdata.log.domain;

public class Access {
    private int id;
    private String name;
    private String time;

    @Override
    //Generate----->toString
    //日志输出格式
    public String toString() {
        return id + "\t" + name + "\t" + time;
    }

    //Generate----->Getter and Setter
    //get及set方法
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}
package com.imooc.bigdata.log.utils;

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;

/*
 * 上传日志数据的工具类
 * 即通过方法发送数据的
 */
public class UploadUtils {

    //假如一条数据过来,传一下
    public static void upload(String path, String log){

        try {
            URL url = new URL(path);
            //做一个强制类型转换
            //URLConnection urlConnection = url.openConnection();
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();

            //设置请求方式为post,因为在LogController.java中使用的是post方法
            conn.setRequestMethod("POST");
            //设置允许上传数据
            conn.setDoOutput(true);
            //添加请求属性
            conn.setRequestProperty("Content-Type","application/json");
            //拿到一个输出流
            OutputStream out = conn.getOutputStream();
            //输出,变成字节数组
            out.write(log.getBytes());
            out.flush();
            out.close();

            //用于测试
            //拿返回码ResponseCode,查看是否成功
            int code = conn.getResponseCode();
            //输出返回码ResponseCode
            System.out.println(code);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.imooc.bigdata.log.utils;

import com.imooc.bigdata.log.domain.Access;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 造数据的工具类
 * 这里使用单元测试进行测试
 */
public class MockData {

    //定义好路径
    public static final String url = "http://localhost:9527/imooc-web/upload";

    @Test
    public void testUpload() throws Exception{

        //直接调用src/main/java/com/imooc/bigdata/log/utils/UploadUtils.java中的Upload方法

        //获取时间
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");

        //传一波100条数据
        for(int i=1; i<=100; i++){

            //设置对象
            Access access = new Access();
            access.setId(i);
            access.setName("name" + i );
            access.setTime(format.format(new Date()));

            //调用工具类
            UploadUtils.upload(url, access.toString());
        }
    }
}

 

  • 客户端与日志服务器联调测试
  • 1)先打开主类LogWebApplication.java,并运行。
  • 2)clear all 日志数据
  • 3)打开MockData.java----->run testUpload()
  • 此时数据已有,但是服务端没有任何输出
  • 4)log4j.properties
  • 在C:\Users\jieqiong\IdeaProjects\spark-log4j\log-web\src\main\resources下new----->file----->log4j.properties
//落在控制台
log4j.rootCategory=info, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss} %p %c{1}: %m%n
  • 5)添加@RequestBody
  • 在C:\Users\jieqiong\IdeaProjects\spark-log4j\log-web\src\main\java\com\imooc\bigdata\controller\LogController.java中添加@RequestBody
  • 因为在UploadUtils.java、LogController.java中,设置请求方式为post。若不添加@RequestBody则默认的是get方式。
  • post方式,内容是在请求体body中带来的。get方式,内容是在url尾巴后带来的。
  • 6)数据输出到控制台
  • 先运行LogWebApplication主类,再运行MockData数据产生类中的testUpload(),此时服务器上接收到数据。数据输出到控制台上了。
  • 7)数据落到磁盘
  • 修改C:\Users\jieqiong\IdeaProjects\spark-log4j\log-web\src\main\resources中的log4j.properties
  • 先运行主类LogWebApplication.java
  • 再运行MockData.java
  • 进入C:\Users\jieqiong\IdeaProjects中,查找/logs/access.log(模拟数据),即客户端发起的请求,成功落在磁盘上。
//落在控制台
log4j.rootCategory=info, zjq log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss} %p %c{1}: %m%n //落在磁盘 log4j.appender.zjq=org.apache.log4j.DailyRollingFileAppender log4j.appender.zjq.DatePattern='.'yyyy-MM-dd log4j.appender.zjq.file=../logs/access.log log4j.appender.zjq.layout=org.apache.log4j.PatternLayout log4j.appender.zjq.layout.ConversionPattern=%m%n

 

  • 日志服务部署到服务器上运行并联调
  • 1)打开右侧Maven视图----->spark-log4j(root)----->lifecycle----->package----->run maven build
  • 2)打开右侧Maven视图----->log-web(root)----->lifecycle----->package----->run maven build
  • 3)打开C:\Users\jieqiong\IdeaProjects\spark-log4j\log-web\target中----->log-web-1.jar
  • 4)将此jar包从本地拷贝进服务器中:scp log-web-1.jar hadoop@spark000:~/lib/
  • 5)以后台方式运行此jar包,到运行中,找到9527端口及路径/imooc-web
[hadoop@spark000 ~]$ cd lib/
[hadoop@spark000 lib]$ ls
log-web-1.jar  nohup.out
[hadoop@spark000 lib]$ nohup java -jar log-web-0.0.1.jar
nohup: ignoring input and appending output to ‘nohup.out’
[hadoop@spark000 lib]$ tail -200f nohup.out
  • 6)修改MockData.java中的url
//原本的定义好路径
    //public static final String url = "http://localhost:9527/imooc-web/upload";
//数据落在服务器上的路径
      public static final String url = "http://spark000:9527/imooc-web/upload";
  • 7)先进入lib目录,再运行log-web-1.jar包
[hadoop@spark000 ~]$ cd logs
[hadoop@spark000 logs]$ ls
access.log
[hadoop@spark000 logs]$ tail -200f access.log
  • 8)运行本地MockData.java,进入服务器/home/hadoop/logs查看模拟的数据结果

 

  • 对接项目数据到日志服务器
  • 1)上述已经将本地简单的日志数据定义好了
  • 2)现在,我们要将本次项目当中的用到的数据,和日志服务器进行一个对接。
  • 3)在spark-log4j\log-service\src\main\java\com\imooc\bigdata\log\utils中新建Test.java
package com.imooc.bigdata.log.utils;

import com.imooc.bigdata.gen.LogGenerator;

public class Test {
    public static void main(String[] args) throws Exception{
        String url = "http://spark000:9527/imooc-web/upload";
        String code = "C2227953FD78B343";
        LogGenerator.generator(url, code);
    }
}
  • 4)在C:\Users\jieqiong\IdeaProjects\spark-log4j\log-service\pom.xml下添加依赖
<dependency>
     <groupId>com.imooc.bigdata</groupId>
     <artifactId>log-generator</artifactId>
     <version>1.0</version>
</dependency>
  • 5)在C:/Users/jieqiong/IdeaProjects/spark-log4j/log-service中放置jar包log-generator-1.0.jar
  • 6)在本地执行
C:\Users\jieqiong>mvn install:install-file -Dfile=C://Users/jieqiong/Desktop/log-generator-1.0.jar -DgroupId=com.imooc.bigdata -DartifactId=log-gen -Dversion=1.0 -Dpackaging=jar

  • 7)配置文件

C:\Users\jieqiong\IdeaProjects\spark-log4j\log-service\pom.xml

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.74</version>
        </dependency>
        <dependency>
            <groupId>com.imooc.bigdata</groupId>
            <artifactId>log-generator</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/log-generator-1.0.jar</systemPath>
        </dependency>
  • 8)课程中所有封装的字段全部在以下,我们就不用关注这些字段是怎么来的了,直接调用就ok。
    String url = "http://spark000:9527/imooc-web/upload";
    String code = "C2227953FD78B343";
    LogGenerator.generator(url, code);
  • 9)启动服务器
  • 其中access-right-log.log的日志是拷贝来的,并非正式生成。
[hadoop@spark000 ~]$ cd lib/
[hadoop@spark000 lib]$ ls
log-generator-1.0.jar  log-web-0.0.1.jar  nohup.out
[hadoop@spark000 lib]$ nohup java -jar log-web-1.jar
[hadoop@spark000 lib]$ tail -299f nohup.out
[hadoop@spark000 ~]$ cd logs
[hadoop@spark000 logs]$ ls
access.log  access.log.2020-08-06  access.log.2020-08-10  access-right-log.log
[hadoop@spark000 logs]$
  • 10)运行Test.java
  • 在本地IDEA运行的方式,将日志落入磁盘中
  • 日志会生成自动落入服务器中的Logs----->access.java
  • 11)若想在服务器端运行,将日志落入磁盘中
[hadoop@spark000 ~]$ cd lib/
[hadoop@spark000 lib]$ ls
log-generator-1.0.jar  log-web-0.0.1.jar  nohup.out
[hadoop@spark000 lib]$ java -jar log-generator-1.0.jar
no main manifest attribute, in log-generator-1.0.jar
[hadoop@spark000 lib]$ java -jar log-generator-1.0.jar http://spark000:9527/imooc-web/upload C2227953FD78B343
[hadoop@spark000 ~]$ cd logs
[hadoop@spark000 logs]$ ls
access.log

 

作业:

1、部署一个Nginx

(1)如何给日志服务器提供一个统一的url

(2)通过Nginx做负载均衡的操作。多个Nginx提供一个统一的地址,也就是客户端的数据打到同一个地址上,之后再Nginx中做内部分发,落到不同的日志服务器上(3个),

2、做数据加密

(1)在MockData中,UploadUtils.upload(url, access.toString());做加密处理。

(2)加密分为可逆和不可逆的过程,这里选择一个可逆的加密过程。Base64。

 

posted @ 2021-11-01 14:23  酱汁怪兽  阅读(328)  评论(0)    收藏  举报