参考: https://www.cnblogs.com/swordfall/p/10527423.html
flink 流处理写入数据到hbase. 采用的是批量写入(500条数据写入一次)。
HBaseWriter.java
package com.flink;
import com.flink.model.DeviceData;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
* 写入HBase
* 继承RichSinkFunction重写父类方法
*
* 写入hbase时500条flush一次, 批量插入, 使用的是writeBufferSize
*/
class HBaseWriter extends RichSinkFunction<DeviceData>{
private static final Logger logger = LoggerFactory.getLogger(HBaseWriter.class);
private static org.apache.hadoop.conf.Configuration configuration;
private static Connection connection = null;
private static BufferedMutator mutator;
private static int count = 0;
@Override
public void open(Configuration parameters) throws Exception {
configuration = HBaseConfiguration.create();
configuration.set("hbase.master", "192.168.3.101:60020");
configuration.set("hbase.zookeeper.quorum", "192.168.3.101");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
try {
connection = ConnectionFactory.createConnection(configuration);
} catch (IOException e) {
e.printStackTrace();
}
BufferedMutatorParams params = new BufferedMutatorParams(TableName.valueOf("t1"));
params.writeBufferSize(2 * 1024 * 1024);
mutator = connection.getBufferedMutator(params);
}
@Override
public void close() throws IOException {
if (mutator != null) {
mutator.close();
}
if (connection != null) {
connection.close();
}
}
@Override
public void invoke(DeviceData values, Context context) throws Exception {
//Date 1970-01-06 11:45:55 to 445555000
long unixTimestamp= 0;
try {
String gatherTime = values.GatherTime;
//毫秒和秒分开处理
if (gatherTime.length() > 20) {
long ms = Long.parseLong(gatherTime.substring(20, 23));
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(gatherTime);
unixTimestamp = date.getTime() + ms;
} else {
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(gatherTime);
unixTimestamp = date.getTime();
}
} catch (ParseException e) {
e.printStackTrace();
}
String RowKey = values.MachID + String.valueOf(unixTimestamp);
String Key = values.OperationValue;
String Value = values.OperationData;
System.out.println("Column Family=f1, RowKey=" + RowKey + ", Key=" + Key + " ,Value=" + Value);
Put put = new Put(RowKey.getBytes());
put.addColumn("f1".getBytes(), Key.getBytes(), Value.getBytes());
mutator.mutate(put);
//每满500条刷新一下数据
if (count >= 500){
mutator.flush();
count = 0;
}
count = count + 1;
}
}
Main.java
//写入hbase
dataStream.addSink(new HBaseWriter());
DeviceData.java
package com.flink.model;
/**
* 设备数据的数据结构
*/
class DeviceData {
String compID;
String machID;
String Type;
String gateMac;
String operationValue;
String operationData;
String gatherTime;
}
文章浏览阅读244次。感觉普通贪心是每一个维度都是平等的,没有优先级。而可后悔贪心是存在某个维度是不可变的,不能直接用排序或者堆进行维护,常常需要经过某种处理,通过挖掘出题目中关于不可变维度的特殊性质,使其可以用排序或者堆等数据结构进行贪心。可后悔贪心常用堆(priority_queue)进行维护。_e. buy low sell high
文章浏览阅读6.5k次,点赞14次,收藏93次。AMCL是ros导航中的一个定位功能包。其实现了机器人在2D平面中基于概率方法的定位系统。该方法使用粒子滤波器来针对已知地图跟踪机器人的位姿。MCL与AMCL的区别它们最重要的区别应该是重采用过程。AMCL在采样过程中仍然会随机的增加小数量的粒子。这一步骤正式为了解决MCL不能处理的重定位问题。当粒子逐渐聚集,其它地方的粒子将慢慢消失。对于MCL来说,如果此时将机器人搬动到另一个地方。此时原来..._amcl源码
文章浏览阅读3.7k次,点赞6次,收藏30次。# 导入需要的模块from glob import globfrom PIL import Imageimport os# 图片路径# 使用 glob模块 获得文件夹内所有jpg图像img_path = glob("./*.jpg")#存储(输出)路径path_save = "./result"for i,file in enumerate(img_path): name = os.path.join(path_save, "%d.jpg"%i) im = ..._image.open(image_file).resize((720, 1280))
文章浏览阅读1.9k次。1. 什么是目标说明除了 选项,所有出现在 Nmap 命令行上的命令字符串 都被视为对目标主机的说明。 最简单的目标说明是指定一个目标 IP 地址或主机名。2. 指定目标 IP 地址2.1. 普通格式 IP 地址指定普通的 IP 地址很简单,比如在 nmap 命令中跟随这样 192.168.0.1 格式的 IP 地址即可,这样每次只能指定一个 IP 地址。但是这样指定一个 IP 地址也有它的不足或是不够灵活的地方,比如需要同时扫描多个 IP地址,而且这几个 IP 地址的主机号是连续的也就是这几_nmap 扫描文件中的目标
文章浏览阅读151次。在面试一些新程序员的时候,当问他为什么选择.net方向时,经常听到一些这样的回答:记得曾经我的老师对我们说,当你在开发语言和工具方面不知道怎么选择的时候,那么你只要跟着微软走就行了.所以最终他选择了.net.我想大家都曾有过类似的经历.当经历过数年之后,一些人在.net的某方面成为了专家,有些人精通数据库方面,有些人精通web界面设计,有些人精通系统架构.还有一些人是什么都会,但不管哪..._.net程序员到新公司怎么快速熟悉一个业余
文章浏览阅读144次。本部分主要介绍日常开发中,经常使用的程序性能调试命令及思路,主要分为CPU、内存、磁盘IO三部分本章主要介绍CPU部分_linux性能调优工具
文章浏览阅读1.1k次。在下面的示例中,我们将演示如何拖放按钮小部件。from PyQt5.Qt import QPushButton, QWidget, QApplicationfrom PyQt5.QtCore import Qt, QMimeDatafrom PyQt5.QtGui import QDragimport sys#按钮类class Button(QPushButton): d..._pyqt qdrag
文章浏览阅读846次。Matlab进阶绘图第20期—带类别标签的三维柱状图_matlab画三标签柱状图
文章浏览阅读1.1k次。本文主要讲述了THREE.js中的不透明物体和透明物体的渲染顺序,主要涉及THREE.js的以下内容:Materialblending及blending相关的一系列属性Object3Ddepth原文:https://segmentfault.com/a/1190000041221932。_threejs 多个几何体展示顺序
文章浏览阅读428次,点赞9次,收藏8次。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。_mssql server 响应变慢了
文章浏览阅读2.4w次,点赞62次,收藏559次。1.应用场景更加高效地学习并达到运用Linux 2.学习/操作 linux运维学习需要分为四个阶段:初级入门、中级进阶、高级提升、资深方向细化。 第一阶段:初级入门 初级阶段需要把linux学习路线搞清楚,任何学习都是循序渐进的,所以学linux也是需要有一定的路线。 初级入门: Linux基础知识、基本命令(起源、组成、常用命令如cp、ls、fi..._linux学习路径
文章浏览阅读893次,点赞19次,收藏19次。1.背景介绍量子计算与通信技术是当今科技界最热门的研究领域之一。随着计算机科学、物理学、信息论等多个领域的发展,量子计算与通信技术已经从理论研究阶段迈出了实际应用的第一步。在这篇文章中,我们将深入探讨量子计算与通信技术的核心概念、算法原理、具体操作步骤以及数学模型公式。同时,我们还将分析其在未来发展趋势与挑战方面的展望。1.1 量子计算与通信技术的发展背景量子计算与通信技术的研究起源于..._量子计算辅助无线移动网络