大数据常用实时流处理方式(Kafka+SparkStream or ETL+Kudu)

这两天刚完成一个项目,我有个习惯就是完了项目做一下总结和复盘

正好这两天没有事情,根据项目顺手做了一个Demo,算是对项目做一个实例化吧。

一、项目流程

项目核心:展现实时数据流的常规处理方式

整体流程:
流程图

规划项目流程后,我们便可以对其进行一一拆分实现。


二、模拟数据发送到UDP

UDP是参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。

SCADA(Supervisory Control And Data Acquisition)系统,即数据采集与监视控制系统。SCADA系统是以计算机为基础的DCS与电力自动化监控系统;它应用领域很广,可以应用于电力、冶金、石油、化工、燃气、铁路等领域的数据采集与监视控制以及过程控制等诸多领域。

UDP在Scada系统中有一定的应用,故也可以作为实时数据流程中的一个小部分(如物理设备发送到指定端口,底层存储监听该端口获取数据)。

虽然是造数据,但是也要造的有模有样的~
设计了5列:time、date、id、name、value
其中,time精确到秒,date是日期(yyyy-mm-dd),id是递增的int类型,value是随机random的值产生的。

对这个稍加思索,我们不难发现,我们可以划分为三个类或方法,降低复杂度, 提高可读性。
分别是:

  • 格式化日期类
  • 获取随机值类
  • 发送到UDP类

1. 格式化日期类

主要是获取当前时间戳,然后转为秒级数据和日期级数据。main方法是打印输出的,可省略。

package com.example.utils;
import java.text.SimpleDateFormat;
public class TimeStampFormat {
   
   
    // 获取时间戳
    private Long timestamp = System.currentTimeMillis();
    // 时间戳转时间
    public String getTime() {
   
   
        SimpleDateFormat formatTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatTime.format(timestamp);
    }
    // 时间转日期
    public String getDate() {
   
   
        SimpleDateFormat formatTime = new SimpleDateFormat("yyyy-MM-dd");
        return formatTime.format(timestamp);
    }
    public static void main(String[] args) {
   
   
        String time = new TimeStampFormat().getTime();
        String date = new TimeStampFormat().getDate();
        System.out.println(time);
        System.out.println(date);
    }
}

2. 获取随机值类

getInt方法是后面造name的时候,有一个姓和名的数组,用于随便获取一个姓名的。

package com.example.utils;

public class GetRandom {
   
   
    // 获取一个随机数
    private double random = Math.random();

    // 随机数转整数,用于当索引下标
    public int getInt() {
   
   
        return (int)(random * 10);
    }

    // 随机数转固定位小数(6位)
    public Double getDouble() {
   
   
        return Double.valueOf(String.format("%.6f",random * 100));
    }

    public static void main(String[] args) {
   
   
        System.out.println(new GetRandom().getInt());
        System.out.println(new GetRandom().getDouble());
        System.out.println(new GetRandom().random);
    }
}

3. 发送到UDP类

最开始是把发送方法直接写到main当中的,但是还是抽成一个方法了,比较直观。

Tips:这个send方法基本上就是两个new ,一个send,一个close。对资源的占用和消耗比较大,其实可以换一种方式,减小Java创建对象开销。

package com.example.service;

import com.example.utils.GetRandom;
import com.example.utils.TimeStampFormat;

import java.io.IOException;
import java.net.*;
import java.util.concurrent.TimeUnit;


public class SendToUDP {
   
   
    // IP
    private static String IP = "10.168.1.xx";
//    private static String IP = "127.0.0.1";

    // port
    private static String PORT = "3927";

    private static void send(byte[] sendValue) throws SocketException, UnknownHostException {
   
   
        // 创建socket对象
        DatagramSocket ds = new DatagramSocket();

        // 打包数据
        DatagramPacket datagramPacket = new DatagramPacket(sendValue, sendValue.length, InetAddress.getByName(IP), Integer.parseInt(PORT));

        // send
        try {
   
   
            ds.send(datagramPacket);
        } catch (IOException e) {
   
   
            e.printStackTrace();
        } finally {
   
   
            ds.close();
        }
    }

    public static void main(String[] args) throws InterruptedException, SocketException, UnknownHostException {
   
   
        // 创建数据  1 时间戳;2 时间;3 ID;4 Name ;5 Values;
        int i = 0;
        String[] surNameList = "李、王、张、刘、陈、杨、赵、黄、周、吴".split("、");
        String[] nameList = "梦琪、忆柳、之桃、慕青、问兰、尔岚、元香、初夏、沛菡、傲珊".split("、");

        while (true) {
   
    // 一直发送数据
            TimeStampFormat ts = new TimeStampFormat();
            GetRandom rd = new GetRandom();

            // 1 time
            String time = ts.getTime();

            // 2 date
            String date = ts.getDate();

            // 3 id
            i ++ ;

            // 4 Name  name = surNameList[i] + nameList[index]
            String name = surNameList[rd.getInt()] + nameList[rd.getInt()];

            // 5 values
            Double doubleValues = rd.getDouble();

            // 拼接数据
            byte[] sendValue = String.format("%s,%s,%s,%s,%s", time, date, i, name, doubleValues).getBytes();

            System.out.println(String.format("%s,%s,%s,%s,%s", time, date, i, name, doubleValues));

            send(sendValue);
            // 休眠1纳秒再发送
            TimeUnit.NANOSECONDS.sleep(1);
        }
    }
}

运行效果:
发送到UDP

三、解析UDP发送到Kafka

这一块比较简单,直接配置Kafka Producer,然后将接收到的UDP包解析为逗号分隔的格式,发送到Kafka即可。

1. Kafka帮助类

package com.example.utils;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;


import java.util.Properties;

public class KafkaUtils {
   
   
    public Producer getProducer
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值