本地文件夹数据发送到kafka主题

一、创建kafka的工具类

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

import java.util.Properties

/**
 * @ Author: mashenmemei
 * @ Date: 20:52 2020/6/6
 * @ version: v1.0.0
 * @ description:
 */
object Properties2Kafka {
  def properties2Kafka: KafkaProducer[String, String] = {
    val prop = new Properties
    //指定请求的Kafka集群列表
    prop.put("bootstrap.servers", "192.168.10.102:9092,192.168.10.103:9092,192.168.10.104:9092")
    //指定响应方式 all 是 -1
    prop.put("acks", "all")
    //请求失败重试次数
    prop.put("retries", "3")
    //对发送消息进行序列化
    // 指定key的序列化方式,key是用于存放数据对应offset使用
    prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
    //指定value的序列化 消息是存储在value中
    prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
    //创建生产者(需要指定key和value的数据类型,必须和序列化的数据一致)
    // 构建参数是 当前配置properties对象
    val producer = new KafkaProducer[String, String](prop)
    producer
  }
}

二、发送遍历文件并向kafka指定topic发送数据

import com.tct.utils.Properties2Kafka
import org.apache.commons.lang3.StringUtils
import org.apache.kafka.clients.producer.ProducerRecord

import java.io._

/**
 * @ Author: mashenmemei
 * @ Date: 20:52 2020/6/6
 * @ version: v1.0.0
 * @ description:
 */
object ConstructDataTrain2 {
  val topic="ods_log_passenger"
  def main(args: Array[String]): Unit = {
    var dirPath = new File("D:\\other\\data\\source\\0203")
    ergodic(dirPath)
    println("结束任务")
  }

  /**
   * 获取目录下的所有文件
   * @param file
   */
  def ergodic(file: File): Unit = {
    val files = file.listFiles
    files.foreach(f => {
//      println(f.getAbsolutePath)
      largeFile(f.getAbsolutePath)
    })
  }


  /**
   * 读取单个文件内容并发送
   * @param inputFile
   */
  def largeFile(inputFile: String): Unit = {
    val file: File = new File(inputFile)
    var fileName=file.getName
    val bis = new BufferedInputStream(new FileInputStream(inputFile))
    val in = new BufferedReader(new InputStreamReader(bis, "gb2312"), 10 * 1024 * 1024) // 10M缓存
    var line: String = null;
    val pro = Properties2Kafka.properties2Kafka
    while ((line = in.readLine()) != null && StringUtils.isNotEmpty(line)) {
      val fieldArr: Array[String] = line.split(",")
      println(line)
      if(fieldArr.length==9){
      //对每行数据进行截取
        line=line.substring(0,line.lastIndexOf(",")+1)
        pro.send(new ProducerRecord[String, String](topic, line))
      }
    }
    pro.close()
  }
}

有收获?希望烙铁们来个三连击,让更多的同学看到这篇文章

1、烙铁们,关注我看完保证有所收获,不信你打我。

2、点个赞呗,可以让更多的人看到这篇文章,后续还会有很哇塞的产出。

本文章仅供学习及个人复习使用,如需转载请标明转载出处,如有错漏欢迎指出
务必注明来源(注明: 来源:csdn , 作者:-马什么梅-)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一马什么梅一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值