前言
本文主要介绍HBase基本概念以及架构原理包含数据模型、基础进程组件。再从HBase的写流程和读流程去了解HBase的架构原理。
1 HBase 定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。
2 HBase Data Modal 数据模型
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。
Hbase 数据模型术语:
Table
一个Hbase Table 包含多个Row。
Row
HBase表中的每行数据都由一个RowKey 和多个Column (列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要。
Column
HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,例如info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。
Column Family
出于性能考虑,列族实际上将一组列及其值并置在一起。每个列族都有一组存储属性,例如是否应将其值缓存在内存中,如何压缩其数据或对其行键进行编码等。表中的每一行都具有相同的列族,尽管给定的行可能不会在给定的列族中存储任何内容
Column Qualifier
将列限定符添加到列族,以提供给定数据段的索引。给定一个列族content
,一个列限定符可能为content:html
,另一个可能为content:pdf
。尽管列族在创建表时是固定的,但列限定符是可变的,并且行之间的差异可能很大。
Cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell中的数据是没有类型的,全部是字节数组形式存贮。
TimeStamp
用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入HBase的时间。
2.1 Conceptual View
Table webtable
Row Key
Time Stamp
ColumnFamily contents
ColumnFamily anchor
ColumnFamily people
"com.cnn.www"
t9
anchor:cnnsi.com = "CNN"
"com.cnn.www"
t8
anchor:my.look.ca = "CNN.com"
"com.cnn.www"
t6
contents:html = "…"
"com.cnn.www"
t5
contents:html = "…"
"com.cnn.www"
t3
contents:html = "…"
"com.example.www"
t5
contents:html = "…"
people:author = "John Doe"
有一个名为表webtable
,其中包含两行(com.cnn.www
和com.example.www
)和三个列族命名contents
,anchor
和people
。在此示例中,对于第一行(com.cnn.www
), anchor
包含两列(anchor:cssnsi.com
,anchor:my.look.ca
)和contents
一个列(contents:html
)。rowkey com.cnn.www
具有5个版本和rowkeycom.example.www
具有一个版本。该contents:html
列预选赛包含给定网站的整个HTML。列族anchor
包含链接到该行表示的站点的外部站点,以及在其链接的锚点中使用的文本。列族people
代表与网站相关的人。
该表中看起来为空的单元格在HBase中不占用空间,或实际上不存在。这就是使HBase“稀疏”的原因。表格视图不是查看HBase中数据的唯一可能方法,甚至不是最准确的方法。以下与multi-dimensional map相同的信息。这仅是出于说明目的的模型,可能并非严格准确。
{
"com.cnn.www": {
contents: {
t6: contents:html: "..."
t5: contents:html: "..."
t3: contents:html: "..."
}
anchor: {
t9: anchor:cnnsi.com = "CNN"
t8: anchor:my.look.ca = "CNN.com"
}
people: {}
}
"com.example.www": {
contents: {
t5: contents:html: "..."
}
anchor: {}
people: {
t5: people:author: "John Doe"
}
}
}
2.2 Physical View
尽管从概念上讲,表可以看作是行的稀疏集合,但它们实际上是按列族存储的。可以随时将新的列限定符(column_family:column_qualifier)添加到现有的列族。
ColumnFamily anchor
Row Key
Time Stamp
Column Family anchor
"com.cnn.www"
t9
anchor:cnnsi.com = "CNN"
"com.cnn.www"
t8
anchor:my.look.ca = "CNN.com"
ColumnFamily contents
Row Key
Time Stamp
ColumnFamily contents:
"com.cnn.www"
t6
contents:html = "…"
"com.cnn.www"
t5
contents:html = "…"
"com.cnn.www"
t3
contents:html = "…"
Conceptual View中显示的空单元格不做存储。因此,contents:html
在时间戳记上请求该列的值t8
将不返回任何值。同样,anchor:my.look.ca
在时间戳上请求值t9
将不返回任何值。但是,如果不输入timestamp参数,则将返回特定列的最新值。给定多个版本,因为时间戳以降序存储,所以最新的也是找到的第一个版本。因此,com.cnn.www
如果未指定时间戳,则对行中所有列的值的请求将是:contents:html
from timestampt6
的值,anchor:cnnsi.com
from timestampt9
的值,anchor:my.look.ca
from timestamp的值t8
。
2.3 Namespace
命名空间,类似于关系型数据库的DatabBase概念,每个命名空间下有多个表。
HBase有两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间。
Quota Management (HBASE-8410) - 限制名称空间可以消耗的资源(即区域,表)数量。
Namespace Security Administration (HBASE-9206) - 为租户提供另一级别的安全管理。
Region server groups (HBASE-6721) - 可以将名称空间/表固定到RegionServers的子集上,从而保证了粗略的隔离级别。
2.3.1命名空间操作
可以创建,删除或更改名称空间。命名空间成员资格是在表创建期间通过指定以下格式的标准表名来确定的:
:
例子
#Create a namespace
create_namespace 'my_ns'
#create my_table in my_ns namespace
create 'my_ns:my_table', 'fam'
#drop namespace
drop_namespace 'my_ns'
#alter namespace
alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
3 HBase Architecture 架构原理
3.1 Region Server
Region Server为 Region的管理者,其实现类为HRegionServer
主要作用如下:
对于数据的操作:get, put, delete;
对于Region的操作:splitRegion、compactRegion。
3.2 Master
Master是所有Region Server的管理者,其实现类为HMaster
主要作用如下:
对于表的操作:create, delete, alter
对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移。
3.3 Zookeeper
HBase通过Zookeeper来做Master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。
3.4 HDFS
HDFS为HBase提供最终的底层数据存储服务,同时为HBase提供高可用的支持。
3.5 StoreFile
保存实际数据的物理文件,StoreFile以HFile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的。
3.6 MemStore
写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile。
3.7 WAL
由于数据要经MemStore排序后才能刷写到HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入MemStore中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
4 HBase 写流程
Client访问zookeeper,请求获取hbase:meta表元数据。
ZK返回Client hbase:meta表位于哪个Region Server。
我们可以通过 RowKey 来定位到对应的 RegionServer。当Client对某个 RowKey 进行更新操作时,假如都到 Zookeeper 里面找到 HBase 的 meta 信息表存储的 RegionServer。然后到这个 RegionServer 里面查找对应表的某个 RowKey 是由哪个 RegionServer 管理的。最后到这个 RegionServer 里面更新数据。会大大影响我们写数据的效率,而且这也会大大增加 Zookeeper 的负载。所以 HBase 客户端会缓存这些元数据,只有在元数据失效或无元数据的时候才会按照上面的流程定位到对应的 RegionServer。
与目标Region Server进行通讯,发出PUT请求。
在默认情况下,WAL 功能是启用的,RegionServer接收到请求后,将数据顺序写入(追加)到WAL。 一个 RegionServer 会包含多个 Region 的,HBase 并不为每个 Region 使用一个 WAL,而是整个 RegionServer 里面的 Regions 共用一个 WAL 日志。同时,只有一个 WAL 文件处于 active 状态。当 WAL 文件越来越大,这个文件最终是会被关闭的,然后再创建一个新的 active WAL 文件用于存储后面的更新。这个操作称为 rolling WAL 文件。将 WAL 文件写入到磁盘的过程中是需要消耗一些资源的。如果数据丢失对应用程序来说不重要,那么我们是可以关掉 WAL 功能的。
向客户端发送ack。
每次更新操作并不是直接写到 HFile 文件里面的,HBase 使用一种称为 memStore 的内存结构来存储来自客户端的更新操作,因为是存储在内存,所以直接在 MemStore 里面进行随机写是非常高效的。将数据写入对应的MemStore,数据会在MemStore进行排序 。需要注意的是,每个 HBase 表的每个列族对应一个 MemStore,同一个 Region 里面可能会包含多个 MemStore。
5 HBase 读流程
客户端读取数据有两种方式, Get 与 Scan 。
Get 是一种随机点查的方式,根据 rowkey 返回一行数据,也可以在构造 Get 对象的时候传入一个 rowkey 列表,这样一次 RPC 请求可以返回多条数据。Get 对象可以设置列与 filter,只获取特定 rowkey 下的指定列的数据。
Scan 是范围查询,通过指定 Scan 对象的 startRow 与 endRow 来确定一次扫描的数据范围,获取该区间的所有数据。
读流程:
Client访问zookeeper,请求获取hbase:meta 表位于哪个Region Server。
访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。
与目标Region Server进行通讯;
分别在Block Cache(读缓存),MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
将从文件中查询到的数据块(Block,HFile数据存储单元,默认大小为64KB)缓存到Block Cache。
将合并后的最终结果返回给客户端。
参考
https://hbase.apache.org/2.3/book.html#perf.writing
你可能感兴趣的:(HBase系列 - 概念和架构原理)
使用 Python 实现 WebSocket 服务器与客户端通信
又蓝
python websocket
简介WebSocket是一种基于TCP协议的通信协议,能够在客户端与服务器之间进行全双工(双向)通信。相比传统的HTTP协议,WebSocket可以实现实时数据的传输,尤其适合需要实时交互的应用场景,如在线游戏、实时聊天、金融交易等。我通过Python实现一个简单的WebSocket服务器,并使其与客户端进行通信。我们将创建两个Python文件:websocket.py和main.py,webso
单体架构、集群架构和分布式架构概述
JoyousHorse
软件工程 架构 分布式 软考 软件工程 系统架构设计师
单体架构、集群架构和分布式架构概述在现代系统架构和开发过程中,单体架构、集群架构和分布式架构是三个常见且关键的概念。本文将详细介绍这些技术的相关概念,并探讨它们之间的联系与区别。一、单体架构单体架构,即单体技术,是一种软件设计模式,所有的功能和模块都集中在一个单一的应用程序中。比较常见的是学生时代开发的各类应用程序,应用包部署在一台服务器上,无需考虑系统性能、请求并发、服务连续性等问题。特点:单一
R语言的并发编程
技术的探险家
包罗万象 golang 开发语言 后端
R语言的并发编程引言在现代计算中,如何有效地利用计算资源进行数据处理和分析已成为一个重要的研究方向。尤其在大数据时代,数据量的急剧增加让单线程处理方式显得力不从心。为了解决这一问题,各种编程语言都开展了并发编程的研究和应用。R语言作为一种广泛应用于统计分析和数据科学的语言,也为并发编程提供了强大的支持。本文将介绍R语言的并发编程,包括其基本概念、常用包、应用示例以及实用技巧。一、并发编程基础并发编
事件驱动架构下的Java应用——构建响应迅速、解耦合的高效系统
墨夶
Java学习资料2 java 架构 开发语言
在当今快速变化的技术环境中,软件系统的灵活性和响应速度成为了决定其成功与否的关键因素之一。传统的同步处理方式往往难以满足现代应用程序对于高性能和低延迟的要求。而事件驱动架构(Event-DrivenArchitecture,EDA)作为一种新兴的设计模式,通过引入异步机制来实现组件间的松散耦合,从而极大地提高了系统的可扩展性和维护性。本文将深入探讨如何基于Java语言构建一个高效的事件驱动架构,并
用C++实现一个基于模板的观察者设计模式
CoderIsArt
UML 设计模式 C++11 设计模式
观察者模式定义观察者模式(ObserverPattern)是一种行为型设计模式,用于定义对象间的一对多依赖关系,使得当一个对象状态发生变化时,其所有依赖它的对象都会收到通知并自动更新。核心概念角色定义Subject(被观察者):持有观察者列表,维护观察者的注册和移除。状态改变时通知所有观察者。Observer(观察者):定义接收通知的接口。注册到被观察者中,等待状态变化通知。适用场景一个对象状态改
【如何利用Python抢演唱会门票】python利用selenium实现大麦网抢票
Python小炮车
python selenium 数据库
一、selenium原理介绍Selenium是一个用于Web[应用程序](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%25BA%2594%25E7%2594%25A8%25E7%25A8%258B%25E5%25BA%258F%2F5985445%3FfromModule%3Dlemma_i
Java 数组排序
赔罪
Java 系统学习 java 排序算法 算法 java-ee 数组排序
目录1.Java冒泡排序(BubbleSort)1.冒泡排序2.冒泡排序的算法原理3.冒泡排序的复杂度和性能4.形成代码2.Java快速排序(QuickSort)3.Java归并排序(MergeSort)4.Java选择排序(SelectionSort)5.Java直接插入排序6.Java希尔排序(ShellSort)1.Java冒泡排序(BubbleSort)1.冒泡排序冒泡排序(BubbleS
OpenSPG docker 安装教程
@comefly
NLP docker openspg 知识图谱 llm
文章目录前言自述一、OpenSPG1.介绍二、安装步骤1.安装服务端2.客户端部署前言自述我最近是想结合chatglm3-6b和知识图谱做一个垂直领域的技术规范的问答系统,过程中也遇到了很多困难,在模型微调上,在数据集收集整理上,在知识图谱的信息抽取上等等,咬咬牙,多学习就可以解决,本文主要写一下利用openspg做技术规范的信息抽取的部署安装过程。一、OpenSPG1.介绍OpenSPG是蚂蚁集
使用Node.js+Express框架,创建一个独立的服务器端项目
海绵宝宝人间体
node.js express
使用Node.js+Express框架,创建一个独立的服务器端项目1、安装Node.js环境node.js中文网官网:Node.js中文网安装完成后,在命令行中输入node-v和npm-v来检查Node.js和npm(NodePackageManager)是否安装成功。2、初始化项目创建一个新的文件夹作为你的项目文件夹。在命令行中进入该文件夹,并运行npminit-y来初始化项目并生成packag
麒麟操作系统服务架构保姆级教程(十一)https配置
小屁不止是运维
系统架构 架构 https 网络协议 linux 运维 LNMP 服务器
如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情在运维工作中,加密和安全的作用是十分重要的,如果仅仅用http协议来对外展示我们的网站,过一段时间就会发现网站首页被人奇奇怪怪的篡改了,本来好好的博客论坛,被人篡改的五毒俱全,这个时候我们的网站就需要加密访问了,这个加密不是说要密码才可以查看网站,而是通过https协议进行加密访问,客户端进行访问的时候会进行加密和解密,防止我们的web
麒麟操作系统基础知识保姆级教程(八)压缩解压缩和文件权限
小屁不止是运维
基础知识 服务器 网络 linux 运维 学习 ubuntu
如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情一、打包压缩和解压缩麒麟操作系统常用的打包和压缩的命令有两种:tar和zip1、tar打包压缩打包:tar最初主要用于将多个文件和目录打包成一个文件,方便文件的存储和传输。它不会对文件内容进行压缩,只是简单地将它们整合在一起。压缩:tar可以与其他压缩工具(如gzip、bzip2等)结合使用,实现打包和压缩的功能。这样可以有效地减小文件
麒麟操作系统搭建本地yum源(_x86架构麒麟v10sp3)
小屁不止是运维
系统安装 架构 linux 运维
文章开始先附上自己最喜欢的一段话如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情有些公司的工作环境是内网环境,无法链接互联网,那么这个时候就需要一套本地的yum源来下载一些服务一、准备好自己的操作系统对应的镜像根据自己服务器的操作系统类型准备好对应版本的镜像,我的操作系统是_x86架构的麒麟v10sp3的操作系统。可以去官网下载你的镜像下载地址为:https://www.kylino
网络编程——UDP套接字
Sirudoi
网络 网络 udp 服务器
一、前缀知识端口号:用来标识在一台机器上的唯一进程。IP地址:用来标识在网络上的唯一主机。因此通过IP+端口号的方式,就可以在互联网上唯一标识一个进程,套接字就是通过这种方式,唯一地标识在互联网之间通信的一对进程,网络套接字的本质其实就是进程间的通信。套接字是在传输层的接口,可以让我们选择通信的协议是UDP,还是TCP。1.1端口号&进程PID这里区分一下端口号和进程的PID,看到这里你也许会问:
基于SIFT特征提取和模板匹配的车标识别算法MATLAB仿真(含MATLAB代码)
爱学习的通信人
图像处理 毕业设计 信号处理 算法 matlab 开发语言
摘要本文介绍了一种基于尺度不变特征变换(SIFT)特征提取和模板匹配的车标识别方法,并通过MATLAB进行仿真。该方法利用SIFT特征的尺度和旋转不变性,提高车标识别的准确性和鲁棒性,适用于各种尺寸和方向的车标图像。仿真结果展示了该方法在实际应用中的有效性。关键词:车标识别,SIFT特征提取,模板匹配,MATLAB仿真1.引言车标识别在车辆检测、智能交通系统和安全监控中具有重要应用。准确识别车辆品
如何新建一个React Native的项目
LJ小番茄
随便写点 react native react.js javascript
要新建一个ReactNative项目,你可以使用ReactNative官方推荐的工具ReactNativeCLI或者Expo。两者的区别在于:ReactNativeCLI提供更多对原生代码的访问权限,适合构建复杂的应用;而Expo是一个开发工具链,简化了许多设置,非常适合快速启动项目,尤其是小型应用或原生功能需求不高的项目。下面我将分别介绍如何使用ReactNativeCLI和ExpoCLI来创建
设计模式详解(命令模式)
小马不敲代码
设计模式 设计模式 命令模式
命令模式(CommandPattern)是一种行为型设计模式,它将请求封装为一个对象,从而使得请求的发送者和接收者解耦。一、命令模式的核心思想命令模式的核心思想是将“请求”封装成为一个对象,从而使得我们可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行相应的操作。命令模式允许请求的
MVC设计模式简介
大海知天空
MVC设计模式(Model-View-Controller)是软件工程中常见的一种软件架构模式,该模式把软件系统(项目)分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。使用MVC模式有很多优势,例如:简化后期对项目的修改、扩展等维护操作;使项目的某一部分变得可以重复利用;使项目的结构更加直观。具体来讲,MVC模式可以将项目划分为模型(M)、视图(V)和控制器
java3d酷眩贪吃蛇下载,100行JS实现HTML5的3D贪吃蛇游戏
weixin_39983554
java3d酷眩贪吃蛇下载
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围。自己写不出来,站在巨人肩膀总是有机会吧,折腾了一番站在Hightopo的肩膀上搞了个3D贪吃蛇游戏,算了算JS代码还只有90来行
MySQL.data.dll v4.0:深入.NET与MySQL交互的关键组件
小黄人95
本文还有配套的精品资源,点击获取简介:MySQL.data.dll是.NETFramework应用程序与MySQL服务器通信的重要组件,包含MySqlClient类库,提供数据库连接、命令执行和数据适配等功能。它对.NET开发人员使用C#、***等语言操作MySQL数据库至关重要。本实践指南将深入介绍如何正确配置和使用MySQL.data.dll,包括连接字符串配置、异常处理、数据库操作、连接管理
Android开发中图片处理
wayne214
android
图片优化:选择合适的图片格式:使用适当的图片格式(如PNG、JPEG或WebP)以获得最佳的图片质量和文件大小。通常,JPEG用于具有丰富颜色和细节的图片,PNG用于需要透明度的图片,而WebP则结合了JPEG和PNG的优点,且具有更小的文件大小。压缩图片:在不损失图像质量的前提下尽可能减小图像文件大小。可以使用AndroidStudio的ImageAssetStudio工具或在线工具(如Tiny
ReactNative0.75版本发布,一文快速了解
wayne214
ReactNative react native
ReactNative0.75版本的更新包含了多个方面的内容,以下是一些详细信息:亮点Yoga3.1和布局改进:支持%值在布局中的应用,如gap、translation等属性,但仅适用于新架构。新架构稳定化:修复了一些Bug,提高了稳定性,并在ReactNativeDirectory中添加了新架构支持信息,还发布了关于支持新架构中UIManager的文章。使用框架:推荐通过框架(如Expo)构建R
ollama教程——使用LangChain调用Ollama接口实现ReAct
walkskyer
ollama入门教程 langchain react.js 前端
ollama入门系列教程简介与目录相关文章:Ollama教程——入门:开启本地大型语言模型开发之旅Ollama教程——模型:如何将模型高效导入到Ollama框架Ollama教程——兼容OpenAIAPI:高效利用兼容OpenAI的API进行AI项目开发Ollama教程——使用LangChain:Ollama与LangChain的强强联合Ollama教程——生成内容API:利用Ollama的原生AP
ChatGPT大模型极简应用开发-目录
uncle_ll
# GPT chatgpt 人工智能 LLM 大模型 GPT
引言要理解ChatGPT,了解其背后的Transformer架构和GPT技术一路的演进则变得非常必要。ChatGPT背后的LLM技术使普通人能够通过自然语言完成过去只能由程序员通过编程语言实现的任务,这是一场巨大的变革。然而,人类通常容易高估技术的短期影响而低估长期影响。进一步学习关于LLM技术原理的论文、视频、图书等。在阅读这本书或者后续学习过程中,你有任何疑问都可以随时请教ChatGPT等工具
C++11特性简述
因特麦克斯
c++ 开发语言
Lambda表达式捕获列表+参数列表(没有参数可以省略)+返回值+函数体类成员函数中定义lambda表达式可以捕获this指针,但是没有捕获函数参数的时候捕获this也不能访问函数参数自动推导返回值:必须是唯一形式的返回值类型才能推导出来,也就是不能出现二义性,比如返回列表时,由于数组和链表都可以以列表的形式返回,所以无法自动推导出返回值类型,这时就需要自己手动声明一下返回值类型"->返回值类型"
《leetcode-runner》【图解】【源码】如何手搓一个debug调试器——架构
飞哥不鸽
leetcode-runner debug 调试器编写 架构图 分析
前文:《leetcode-runner》如何手搓一个debug调试器——引言文章目录设计引入为什么这么设计存在难点1.环境准备2.调试程序仓库地址:leetcode-runner本文主要聚焦leetcode-runner对于debug功能的整体设计,并讲述设计原因以及存在的难点设计引入让我们来思考一下,一个最简单的调试器需要哪些内容首先,它能够接受用户的输入其次,它能够读懂用户想让调试器干嘛,并做
PCL 点云随机渲染颜色
MelaCandy
PCL点云算法与实战案例 3d 算法 计算机视觉 人工智能 c++
目录一、概述1.1原理1.2实现步骤1.3应用场景二、代码实现2.1关键函数2.2完整代码三、实现效果PCL点云算法汇总及实战案例汇总的目录地址链接:PCL点云算法与项目实战案例汇总(长期更新)一、概述本文将介绍如何使用PCL库为点云中的每个点随机渲染颜色,并在PCL的可视化窗口中显示。这种方法适用于需要对点云中的不同点进行颜色区分的场景,可以帮助更直观地观察和分析点云数据。1.1原理在点云处理中
设计模式之命令模式:从原理到实战,深入解析及源码应用
coffee_baby
设计模式原理和实战 设计模式 命令模式 java
命令模式什么是命令模式?命令模式(CommandPattern)是一种行为设计模式,它将一个请求封装为一个对象,从而允许使用不同的请求、队列或者日志来参数化对象,并支持可撤销的操作。命令模式的核心思想是将命令的发起者和执行者解耦,从而使得命令的发起者不必关心命令是如何被执行的。命令模式的关键组成部分:命令(Command):定义命令的接口,声明执行方法。具体命令(ConcreteCommand):
pcl系列-添加自定义点云类型
不会算法的阿召
c++ 自动驾驶 计算机视觉 3d
pcl库中附带了各种预定义的点类型,这些数据类型足以支持在pcl中所实现的所有算法和方法,但是在某些情况下,在使用pcl点类型时希望定义新的点类型,比如在LIO-SAM中定义的PointXYZIRPYT(包括点云基本的坐标(x,y,z)和强度I,以及三个旋转角RPY和时间T)。因此,pcl提供了创建自定义点云类型的方法。1.pcl常用点云类型pcl中定义了大量的常用点类型,在定义自己的点类型之前,
SpringBoot整合Logback日志框架
洛上言
后端 spring boot 后端 java
文章目录一、引入二、默认日志格式三、控制台输出四、文件输出五、日志级别六、日志组七、自定义日志格式八、自定义log配置九、logback-spring.xml自定义注意事项一、引入SpringBoot使用CommonsLogging进行所有内部日志的记录,但默认配置也提供了对常用日志的支持,如JavaUtilLogging,Log4J2,和Logback.每种logger都可以通过配置使用控制台或
《电子制作从零开始》 第1章:电子制作入门
请向我看齐
电子电路 电子电路
第1章:电子制作入门1.1走进电子制作的世界电子制作的魅力与应用领域创造力的体现:电子制作就像是一场科技与创意的结合。通过自己的双手,将各种电子元件巧妙地组合在一起,创造出具有各种功能的电子设备,从简单的闪烁灯到复杂的智能机器人,这个过程能够充分发挥个人的创造力。技术探索的乐趣:在制作过程中,可以深入了解电子技术的原理。例如,通过制作一个小型的音频放大器,能直观地理解信号放大的过程,以及电容、电阻
PHP,安卓,UI,java,linux视频教程合集
cocos2d-x小菜
java UI PHP android linux
╔-----------------------------------╗┆
各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。
bozch
.net .net mvc
在.net mvc5中,在执行某一操作的时候,出现了如下错误:
各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。
经查询当前的操作与错误内容无关,经过对错误信息的排查发现,事故出现在数据库迁移上。
回想过去: 在迁移之前已经对数据库进行了添加字段操作,再次进行迁移插入XXX字段的时候,就会提示如上错误。
&
Java 对象大小的计算
e200702084
java
Java对象的大小
如何计算一个对象的大小呢?
 
Mybatis Spring
171815164
mybatis
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService userService = (CustomerService) ac.getBean("customerService");
Customer cust
JVM 不稳定参数
g21121
jvm
-XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。当然这是在非合理设置的前提下,如果此类参数设置合理讲大大提高JVM 的性能及稳定性。 可以说“不稳定参数”
用户自动登录网站
永夜-极光
用户
1.目标:实现用户登录后,再次登录就自动登录,无需用户名和密码
2.思路:将用户的信息保存为cookie
每次用户访问网站,通过filter拦截所有请求,在filter中读取所有的cookie,如果找到了保存登录信息的cookie,那么在cookie中读取登录信息,然后直接
centos7 安装后失去win7的引导记录
程序员是怎么炼成的
操作系统
1.使用root身份(必须)打开 /boot/grub2/grub.cfg 2.找到 ### BEGIN /etc/grub.d/30_os-prober ### 在后面添加 menuentry "Windows 7 (loader) (on /dev/sda1)" { 
Oracle 10g 官方中文安装帮助文档以及Oracle官方中文教程文档下载
aijuans
oracle
Oracle 10g 官方中文安装帮助文档下载:http://download.csdn.net/tag/Oracle%E4%B8%AD%E6%96%87API%EF%BC%8COracle%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%EF%BC%8Coracle%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3 Oracle 10g 官方中文教程
JavaEE开源快速开发平台G4Studio_V3.2发布了
無為子
AOP oracle mysql javaee G4Studio
我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V3.2版本已经正式发布。大家可以通过如下地址下载。
访问G4Studio网站
http://www.g4it.org
G4Studio_V3.2版本变更日志
功能新增
(1).新增了系统右下角滑出提示窗口功能。
(2).新增了文件资源的Zip压缩和解压缩
Oracle常用的单行函数应用技巧总结
百合不是茶
日期函数 转换函数(核心) 数字函数 通用函数(核心) 字符函数
单行函数; 字符函数,数字函数,日期函数,转换函数(核心),通用函数(核心)
一:字符函数:
.UPPER(字符串) 将字符串转为大写
.LOWER (字符串) 将字符串转为小写
.INITCAP(字符串) 将首字母大写
.LENGTH (字符串) 字符串的长度
.REPLACE(字符串,'A','_') 将字符串字符A转换成_
Mockito异常测试实例
bijian1013
java 单元测试 mockito
Mockito异常测试实例:
package com.bijian.study;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.
GA与量子恒道统计
Bill_chen
JavaScript 浏览器 百度 Google 防火墙
前一阵子,统计**网址时,Google Analytics(GA) 和量子恒道统计(也称量子统计),数据有较大的偏差,仔细找相关资料研究了下,总结如下:
为何GA和量子网站统计(量子统计前身为雅虎统计)结果不同?
首先:没有一种网站统计工具能保证百分之百的准确出现该问题可能有以下几个原因:(1)不同的统计分析系统的算法机制不同;(2)统计代码放置的位置和前后
【Linux命令三】Top命令
bit1129
linux命令
Linux的Top命令类似于Windows的任务管理器,可以查看当前系统的运行情况,包括CPU、内存的使用情况等。如下是一个Top命令的执行结果:
top - 21:22:04 up 1 day, 23:49, 1 user, load average: 1.10, 1.66, 1.99
Tasks: 202 total, 4 running, 198 sl
spring四种依赖注入方式
白糖_
spring
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我
angular.injector
boyitech
AngularJS AngularJS API
angular.injector
描述: 创建一个injector对象, 调用injector对象的方法可以获得angular的service, 或者用来做依赖注入. 使用方法: angular.injector(modules, [strictDi]) 参数详解: Param Type Details mod
java-同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待
bylijinnan
Integer
public class PC {
/**
* 题目:生产者-消费者。
* 同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待。
*/
private static final Integer[] val=new Integer[10];
private static
使用Struts2.2.1配置
Chen.H
apache spring Web xml struts
Struts2.2.1 需要如下 jar包: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar spring.jar
struts2-core-2.2.1.jar struts2-sp
[职业与教育]青春之歌
comsci
教育
每个人都有自己的青春之歌............但是我要说的却不是青春...
大家如果在自己的职业生涯没有给自己以后创业留一点点机会,仅仅凭学历和人脉关系,是难以在竞争激烈的市场中生存下去的....
&nbs
oracle连接(join)中使用using关键字
daizj
JOIN oracle sql using
在oracle连接(join)中使用using关键字
34. View the Exhibit and examine the structure of the ORDERS and ORDER_ITEMS tables.
Evaluate the following SQL statement:
SELECT oi.order_id, product_id, order_date
FRO
NIO示例
daysinsun
nio
NIO服务端代码:
public class NIOServer {
private Selector selector;
public void startServer(int port) throws IOException {
ServerSocketChannel serverChannel = ServerSocketChannel.open(
C语言学习homework1
dcj3sjt126com
c homework
0、 课堂练习做完
1、使用sizeof计算出你所知道的所有的类型占用的空间。
int x;
sizeof(x);
sizeof(int);
# include <stdio.h>
int main(void)
{
int x1;
char x2;
double x3;
float x4;
printf(&quo
select in order by , mysql排序
dcj3sjt126com
mysql
If i select like this:
SELECT id FROM users WHERE id IN(3,4,8,1);
This by default will select users in this order
1,3,4,8,
I would like to select them in the same order that i put IN() values so:
页面校验-新建项目
fanxiaolong
页面校验
$(document).ready(
function() {
var flag = true;
$('#changeform').submit(function() {
var projectScValNull = true;
var s ="";
var parent_id = $("#parent_id").v
Ehcache(02)——ehcache.xml简介
234390216
ehcache ehcache.xml 简介
ehcache.xml简介
ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的。根据之前我们在《Ehcache简介》一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的。在不指定配置信
junit 4.11中三个新功能
jackyrong
java
junit 4.11中两个新增的功能,首先是注解中可以参数化,比如
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runn
国外程序员爱用苹果Mac电脑的10大理由
php教程分享
windows PHP unix Microsoft perl
Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里。普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒。那么为什么专业人士也对 Mac 情有独钟呢?从个人使用经验来看我想有下面几个原因:
1、Mac OS X 是基于 Unix 的
这一点太重要了,尤其是对开发人员,至少对于我来说很重要,这意味着Unix 下一堆好用的工具都可以随手捡到。如果你是个 wi
位运算、异或的实际应用
wenjinglian
位运算
一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。
二. 常用位操作小技巧,有判断奇偶、交换两数、变换符号、求绝对值。
三. 位操作与空间压缩,针对筛素数进行空间压缩。
&n
weblogic部署项目出现的一些问题(持续补充中……)
Everyday都不同
weblogic部署失败
好吧,weblogic的问题确实……
问题一:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [zip:E:/weblogic/user_projects/domains/base_domain/serve
tomcat7性能调优(01)
toknowme
tomcat7
Tomcat优化: 1、最大连接数最大线程等设置
<Connector port="8082" protocol="HTTP/1.1"
useBodyEncodingForURI="t
PO VO DAO DTO BO TO概念与区别
xp9802
java DAO 设计模式 bean 领域模型
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。
它们的关系应该是相互独立的,一个VO可以只是PO的部分,也可以是多个PO构成,同样也可以等同于一个PO(指的是他们的属性)。这样,PO独立出来,数据持