Spark Streaming接收Kafka数据存储到Hbase
Spark Streaming接收Kafka数据存储到Hbase
主要参考了这篇文章https://yq.aliyun.com/articles/60712([点我])(https://yq.aliyun.com/articles/60712), 不过这篇文章使用的spark貌似是spark1.x的。我这里主要是改为了spark2.x的方式
kafka生产数据
闲话少叙,直接上代码:
- import java.util.{Properties, UUID}
- import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}
- import org.apache.kafka.common.serialization.StringSerializer
- import scala.util.Random
- object KafkaProducerTest {
- def main(args: Array[String]): Unit = {
- val rnd = new Random()
- // val topics = "world"
- val topics = "test"
- val brokers = "localhost:9092"
- val props = new Properties()
- props.put("delete.topic.enable", "true")
- props.put("key.serializer", classOf[StringSerializer])
- // props.put("value.serializer", "org.apache.kafka.common.serialization.StringDeserializer")
- props.put("value.serializer", classOf[StringSerializer])
- props.put("bootstrap.servers", brokers)
- //props.put("batch.num.messages","10");//props.put("batch.num.messages","10");
- //props.put("queue.buffering.max.messages", "20");
- //linger.ms should be 0~100 ms
- props.put("linger.ms", "50")
- //props.put("block.on.buffer.full", "true");
- //props.put("max.block.ms", "100000");
- //batch.size and buffer.memory should be changed with "the kafka message size and message sending speed"
- props.put("batch.size", "16384")
- props.put("buffer.memory", "1638400")
- props.put("queue.buffering.max.messages", "1000000")
- props.put("queue.enqueue.timeout.ms", "20000000")
- props.put("producer.type", "sync")
- val producer = new KafkaProducer[String,String](props)
- for(i <- 1001 to 2000){
- val key = UUID.randomUUID().toString.substring(0,5)
- val value = "fly_" + i + "_" + key
- producer.send(new ProducerRecord[String, String](topics,key, value))//.get()
- }
- producer.flush()
- }
- }
生产的数据格式为(key,value) = (uuid, fly_i_key) 的形式
spark streaming 读取kafka并保存到hbase
当kafka里面有数据后,使用spark streaming 读取,并存。直接上代码:
- import java.util.UUID
- import org.apache.hadoop.hbase.HBaseConfiguration
- import org.apache.hadoop.hbase.client.{Mutation, Put}
- import org.apache.hadoop.hbase.io.ImmutableBytesWritable
- import org.apache.hadoop.hbase.mapreduce.TableOutputFormat
- import org.apache.hadoop.hbase.util.Bytes
- import org.apache.hadoop.mapred.JobConf
- import org.apache.hadoop.mapreduce.OutputFormat
- import org.apache.kafka.clients.consumer.ConsumerRecord
- import org.apache.kafka.common.serialization.StringDeserializer
- import org.apache.spark.rdd.RDD
- import org.apache.spark.sql.SparkSession
- import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
- import org.apache.spark.streaming.kafka010.KafkaUtils
- import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
- import org.apache.spark.streaming.{Seconds, StreamingContext}
- /**
- * spark streaming 写入到hbase
- * Sparkstreaming读取Kafka消息再结合SparkSQL,将结果保存到HBase
- */
- object OBDSQL {
- case class Person(name: String, age: Int, key: String)
- def main(args: Array[String]): Unit = {
- val spark = SparkSession
- .builder()
- .appName("sparkSql")
- .master("local[4]")
- .getOrCreate()
- val sc = spark.sparkContext
- val ssc = new StreamingContext(sc, Seconds(5))
- val topics = Array("test")
- val kafkaParams = Map(
- "bootstrap.servers" -> "localhost:9092,anotherhost:9092",
- "key.deserializer" -> classOf[StringDeserializer],
- "value.deserializer" -> classOf[StringDeserializer],
- // "group.id" -> "use_a_separate_group_id_for_each_stream",
- "group.id" -> "use_a_separate_group_id_for_each_stream_fly",
- // "auto.offset.reset" -> "latest",
- "auto.offset.reset" -> "earliest",
- // "auto.offset.reset" -> "none",
- "enable.auto.commit" -> (false: java.lang.Boolean)
- )
- val lines = KafkaUtils.createDirectStream[String, String](
- ssc,
- PreferConsistent,
- Subscribe[String, String](topics, kafkaParams)
- )
- // lines.map(record => (record.key, record.value)).print()
- // lines.map(record => record.value.split("_")).map(x=> (x(0),x(1), x(2))).print()
- lines.foreachRDD((rdd: RDD[ConsumerRecord[String, String]]) => {
- import spark.implicits._
- if (!rdd.isEmpty()) {
- // temp table
- rdd.map(_.value.split("_")).map(p => Person(p(0), p(1).trim.toInt, p(2))).toDF.createOrReplaceTempView("temp")
- // use spark sql
- val rs = spark.sql("select * from temp")
- // create hbase conf
- val hconf = HBaseConfiguration.create
- hconf.set("hbase.zookeeper.quorum", "localhost"); //ZKFC
- hconf.set("hbase.zookeeper.property.clientPort", "2181")
- hconf.set("hbase.defaults.for.version.skip", "true")
- hconf.set(TableOutputFormat.OUTPUT_TABLE, "t1") // t1是表名, 表里面有一个列簇 cf1
- hconf.setClass("mapreduce.job.outputformat.class", classOf[TableOutputFormat[String]], classOf[OutputFormat[String, Mutation]])
- val jobConf = new JobConf(hconf)
- // convert every line to hbase lines
- rs.rdd.map(line => {
- val put = new Put(Bytes.toBytes(UUID.randomUUID().toString.substring(0, 9)))
- put.addColumn(Bytes.toBytes("cf1")
- , Bytes.toBytes("name")
- , Bytes.toBytes(line.get(0).toString)
- )
- put.addColumn(Bytes.toBytes("cf1")
- , Bytes.toBytes("age")
- , Bytes.toBytes(line.get(1).toString)
- )
- put.addColumn(Bytes.toBytes("cf1")
- , Bytes.toBytes("key")
- , Bytes.toBytes(line.get(2).toString)
- )
- (new ImmutableBytesWritable, put)
- }).saveAsNewAPIHadoopDataset(jobConf)
- }
- })
- lines.map(record => record.value.split("_")).map(x=> (x(0),x(1), x(2))).print()
- ssc start()
- ssc awaitTermination()
- }
- }
Spark Streaming接收Kafka数据存储到Hbase的更多相关文章
- demo1 spark streaming 接收 kafka 数据java代码WordCount示例
1. 首先启动zookeeper windows上的安装见zk 02之 Windows安装和使用zookeeper 启动后见: 2. 启动kafka windows的安装kafka见Windows上搭 ...
- spark streaming 接收 kafka 数据java代码WordCount示例
http://www.cnblogs.com/gaopeng527/p/4959633.html
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十二)Spark Streaming接收流数据及使用窗口函数
官网文档:<http://spark.apache.org/docs/latest/streaming-programming-guide.html#a-quick-example> Sp ...
- spark streaming 接收kafka消息之五 -- spark streaming 和 kafka 的对接总结
Spark streaming 和kafka 处理确保消息不丢失的总结 接入kafka 我们前面的1到4 都在说 spark streaming 接入 kafka 消息的事情.讲了两种接入方式,以及s ...
- spark streaming 接收kafka消息之四 -- 运行在 worker 上的 receiver
使用分布式receiver来获取数据使用 WAL 来实现 exactly-once 操作: conf.set("spark.streaming.receiver.writeAheadLog. ...
- spark streaming 接收kafka消息之一 -- 两种接收方式
源码分析的spark版本是1.6. 首先,先看一下 org.apache.spark.streaming.dstream.InputDStream 的 类说明: This is the abstrac ...
- spark streaming 接收kafka消息之二 -- 运行在driver端的receiver
先从源码来深入理解一下 DirectKafkaInputDStream 的将 kafka 作为输入流时,如何确保 exactly-once 语义. val stream: InputDStream[( ...
- spark streaming 接收kafka消息之三 -- kafka broker 如何处理 fetch 请求
首先看一下 KafkaServer 这个类的声明: Represents the lifecycle of a single Kafka broker. Handles all functionali ...
- Spark streaming消费Kafka的正确姿势
前言 在游戏项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从kafka中不 ...
随机推荐
- distpicker三级联动,动态改变省市信息
一.引入3个js文件 <script type="text/javascript" src="js/distpicker.data.js">< ...
- 数据库mysql原生代码基本操作
创建表: CREATE TABLE `biao` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '测试表', `createtime` ...
- HTML--使用提交按钮,提交数据
在表单中有两种按钮可以使用,分别为:提交按钮.重置.这一小节讲解提交按钮:当用户需要提交表单信息到服务器时,需要用到提交按钮. 语法: <input type="submit" ...
- ACM_三角形蛇形矩阵
三角形蛇形矩阵 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小铠觉得各类题型是要温故而知新的,所以他叫小发出一道类似做过的题. ...
- Kafka的3节点集群详细启动步骤(Zookeeper是外装)
首先,声明,kafka集群是搭建在hadoop1.hadoop2和hadoop3机器上. kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载.安装和配置(图文详细教程)绝对干货 如下分 ...
- Java系列学习(十)-包与权限修饰符
1.形式参数和返回值的问题 (1)形式参数: A:类名:需要该类的对象 B:抽象类名:需要改类的子类对象 C:接口名:需要该接口的实现对象 (2)返回值类型: A:类名:抽象类名:返回的是该类的对象 ...
- DML和DQL语句
DML操作: a.插入单行数据: INSERT INTO 表名(列名,列名,...) VALUE(列值,列值,...); 表的字段名是可选的,如果省略,则一次插入所有字段 多个列表和多个值之 ...
- 9.Hierarchy Editor
Hierarchy Editor(层次编辑器) 用于定义3D图层的结构,向Ventuz渲染引擎发出“命令”,并指定命令的发生顺序.通常,每个层次节点都会导致对GPU的一个或多个调用,例如设置材质或渲染 ...
- [ Nowcoder Contest 165 #D ] 合法括号序列
\(\\\) \(Description\) 键盘上有三个键,敲击效果分别是: 在输出序列尾部添加一个左括号 在输出序列尾部添加一个右括号 删除输出序列尾部的第一个元素,若输出序列为空,则什么都不发生 ...
- Android 微信网址分享添加网络图片
public static void share(String CustomEventData,String title,String titlle_detail,String imgUrl)thro ...