Doris(一) -- 简介和安装

Doris 简介

Doris 概述

Apache Doris 由百度大数据部研发 (之前叫百度 Palo,2018 年贡献到 Apache 社区后,更名为 Doris), 在百度内部,有超过 200 个产品线在使用,部署机器超过 1000 台,单一业务最大可达到上百 TB。

Apache Doris 是一个现代化的 MPP(Massively Parallel Processing,即大规模并行处理)分析型(OLAP)数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。

Apache Doris 的分布式架构非常简洁,易于运维,并且可以支持 10PB 以上的超大数据集。

Apache Doris 可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。

OLAP和OLTP

联机事务处理OLTP(On-Line Transaction Processing)
公司业务系统使用数据库的场景,针对业务系统数据库有大量随机的增删改查
要求: 高并发 速度快 支持事务

联机分析处理OLAP(On-Line Analytical Processing)
公司的数据分析使用数据库的场景,对已经生成好的数据进行统计分析

要求:

  • 一次操作都是针对的整个数据集
  • 只有查这个动作,不会去增删改
  • 查询的响应速度相对慢点也能接受
  • 并发量要求不是太高

比较

OLTP OLAP
数据源 仅包含当前运行日常业务数据 整合来自多个来源的数据,包括OLTP和外部来源
目的 面向应用,面向业务,支撑事务 面向主题,面向分析,支持分析决策
焦点 当下 主要面向过去,面向历史(实时数仓除外)
任务 增删改查 要是用于读,select查询,写操作很少
响应时间 毫秒 秒,分钟,小时 取决于数据量和查询的复杂程度
数据量 小数据,MB,GB 大数据,TP,PB

使用场景

  • 报表分析
    • 实时看板 (Dashboards)
    • 面向企业内部分析师和管理者的报表
    • 面向用户或者客户的高并发报表分析(Customer Facing Analytics)。比如面向网站主的站点分析、面向广告主的广告报表,并发通常要求成千上万的 QPS ,查询延时要求毫秒级响应。著名的电商公司京东在广告报表中使用 Apache Doris ,每天写入 100 亿行数据,查询并发 QPS 上万,99 分位的查询延时 150ms。
  • 即席查询(Ad-hoc Query):面向分析师的自助分析,查询模式不固定,要求较高的吞吐。小米公司基于 Doris 构建了增长分析平台(Growing Analytics,GA),利用用户行为数据对业务进行增长分析,平均查询延时 10s,95 分位的查询延时 30s 以内,每天的 SQL 查询量为数万条。
  • 统一数仓构建 :一个平台满足统一的数据仓库建设需求,简化繁琐的大数据软件栈。海底捞基于 Doris 构建的统一数仓,替换了原来由 Spark、Hive、Hbase、Phoenix 组成的旧架构,架构大大简化。
  • 数据湖联邦查询:通过外表的方式联邦分析位于 Hive、Hudi 中的数据,在避免数据拷贝的前提下,查询性能大幅提升

优势

image

架构
Doris 的架构很简洁,只设 FE(Frontend)前端进程、BE(Backend)后端进程两种角色、两个后台的服务进程,不依赖于外部组件,方便部署和运维,FE、BE 都可在线性扩展。

  1. FE(Frontend):存储、维护集群元数据;负责接收、解析查询请求,规划查询计划,调度查询执行,返回查询结果。主要有三个角色:
    • Leader 和 Follower:主要是用来达到元数据的高可用,保证单节点宕机的情况下,元数据能够实时地在线恢复,而不影响整个服务。
    • Observer:用来扩展查询节点,同时起到元数据备份的作用。如果在发现集群压力非常大的情况下,需要去扩展整个查询的能力,那么可以加 observer 的节点。observer 不参与任何的写入,只参与读取。
  2. BE(Backend):负责物理数据的存储和计算;依据 FE 生成的物理计划,分布式地执行查询。数据的可靠性由 BE 保证,BE 会对整个数据存储多副本或者是三副本。副本数可根据需求动态调整。
  3. MySQL Client:Doris 借助 MySQL 协议,用户使用任意 MySQL 的 ODBC/JDBC 以及 MySQL 的客户端,都可以直接访问 Doris。
  4. Broker:一个独立的无状态进程。封装了文件系统接口,提供 Doris 读取远端存储系统中文件的能力,包括 HDFS,S3,BOS 等。

image

默认端口

实例名称 端口名称 默认端口 通讯方向 说明
BE be_port 9060 FE-->BE BE 上 thrift server 的端口,用于接收来自 FE 的请求
BE webserver_port 8040 BE<-->FE BE 上的 http server 端口
BE heartbeat_service_port 9050 FE-->BE BE 上心跳服务端口,用于接收来自 FE 的心跳
BE brpc_prot* 8060 FE<-->BE,BE<-->BE BE 上的 brpc 端口,用于 BE 之间通信
FE http_port 8030 FE<-->FE ,用户<--> FE FE 上的 http_server 端口
FE rpc_port 9020 BE-->FE ,FE<-->FE FE 上 thirft server 端口
FE query_port 9030 用户<--> FE FE 上的 mysql server 端口
FE edit_log_port 9010 FE<-->FE FE 上 bdbje 之间通信用的端口
Broker broker_ipc_port 8000 FE-->BROKER,BE-->BROKER Broker 上的 thrift server,用于接收请求

安装

安装前准备

  1. Linux 操作系统版本需求
    CentOS 7.1及以上版本
    Ubuntu 16.04及以上版本

  2. 软件需求
    java 1.8及以上版本
    GCC 4.8.2及以上版本

  3. 操作系统环境要求

vi /etc/security/limits.conf 
# 在文件最后添加下面几行信息(注意* 也要复制进去)

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

# ulimit -n 65535 临时生效
# 重启永久生效。

# 如果不修改这个句柄数大于等于60000,启动doris be节点时会报如下错误
File descriptor number is less than 60000. Please use (ulimit -n) to set a value equal or greater than 60000
W1120 18:14:20.934705  3437 storage_engine.cpp:188] check fd number failed, error: Internal error: file descriptors limit is too small
W1120 18:14:20.934713  3437 storage_engine.cpp:102] open engine failed, error: Internal error: file descriptors limit is too small
F1120 18:14:20.935087  3437 doris_main.cpp:404] fail to open StorageEngine, res=file descriptors limit is too small

  1. 时钟同步

Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。

# ntpdate是一个向互联网上的时间服务器进行时间同步的软件
yum install ntpdate -y

# 然后开始三台机器自己同步时间

ntpdate ntp.sjtu.edu.cn

# 美国标准技术院时间服务器:time.nist.gov(192.43.244.18)
# 上海交通大学网络中心NTP服务器地址:ntp.sjtu.edu.cn(202.120.2.101)
# 中国国家授时中心服务器地址:cn.pool.ntp.org(210.72.145.44)

# 将当前时间写入bios,这样才能永久生效不变,不然reboot后还会恢复到原来的时间
clock -w
  1. 关闭交换分区(swap)

交换分区是linux用来当做虚拟内存用的磁盘分区;
linux可以把一块磁盘分区当做内存来使用(虚拟内存、交换分区);
Linux使用交换分区会给Doris带来很严重的性能问题,建议在安装之前禁用交换分区;

# 临时关闭交换分区
swapoff -a
# 永久删除Swap挂载
vim /etc/fstab
注释 swap 行
  1. mysql

安装FE

1.官网下载源码包,官网地址:http://doris.apache.org
2.下载后上传到linux并解压
3.修改配置文件

# 去自己的路劲中找到fe.conf文件
vi /opt/apps/doris/fe/conf/fe.conf
#配置文件中指定元数据路径: 注意这个文件夹要自己创建
meta_dir = /opt/data/dorisdata/doris-meta
#修改绑定 ip(每台机器修改成自己的 ip)
priority_networks = 192.168.22.0/24

安装BE

1.官网下载源码包,官网地址:http://doris.apache.org
2.下载后上传到linux并解压
3.修改配置文件

#  去自己的路劲中找到be.conf文件
vi /opt/apps/doris/be/conf/be.conf

#配置文件中指定数据存放路径: 需在启动前创建目录
storage_root_path = /opt/data/doris/be/storage.HDD;/opt/data/doris/be/storage.SSD

#修改绑定 ip(每台机器修改成自己的 ip) 
priority_networks = 192.168.17.0/24 

分发集群

for i in 2 3
do
scp /et/profile linux0$i:/etc/profile
scp -r /opt/apps/doris/ linux0$i:/opt/apps/
done

Mysql CLient连接FE

# 进入到fe的bin目录下执行
./start_fe.sh --daemon

mysql -h linux01 -P 9030 -uroot
# 设置密码
SET PASSWORD FOR 'root' = PASSWORD('123');


# 查看fe的运行状态
SHOW PROC '/frontends'\G;

# 添加BE节点
ALTER SYSTEM ADD BACKEND "linux01:9050"; 
ALTER SYSTEM ADD BACKEND " linux02:9050"; 
ALTER SYSTEM ADD BACKEND " linux03:9050";

# 查看BE状态
SHOW PROC '/backends';

# 添加环境变量
vi /etc/profile

#doris_fe
export DORIS_FE_HOME=/opt/app/doris1.1.4/fe
export PATH=$PATH:$DORIS_FE_HOME/bin

#doris_be
export DORIS_BE_HOME=/opt/app/doris1.1.4/be
export PATH=$PATH:$DORIS_BE_HOME/bin

source /etc/profile

# 启动 BE(每个节点)
start_be.sh --daemon

# 启动后再次查看BE的节点
SHOW PROC '/backends';
# Alive 为 true 表示该 BE 节点存活

部署FS_Broker

Broker 以插件的形式,独立于 Doris 部署。如果需要从第三方存储系统导入数据,需要部署相应的 Broker,默认提供了读取 HDFS、百度云 BOS 及 Amazon S3 的 fs_broker。fs_broker 是无状态的,建议每一个 FE 和 BE 节点都部署一个 Broker。

# 启动 Broker
/opt/apps/doris/fe/apache_hdfs_broker/bin/start_broker.sh --daemon
# 使用 mysql-client 连接启动的 FE,执行以下命令:
mysql -h linux01 -P 9030 -uroot -p 123
ALTER SYSTEM ADD BROKER broker_name "linux01:8000","linux02:8000","linux03:8000";

# broker_name 这只是一个名字,可以自己取
# 查看 Broker 状态 
# 使用 mysql-client 连接任一已启动的 FE,执行以下命令查看 Broker 状态:
SHOW PROC "/brokers";

扩容和缩容

FE 扩容和缩容

可以通过将 FE 扩容至 3 个以上节点来实现 FE 的高可用。
使用 MySQL 登录客户端后,可以使用 sql 命令 SHOW PROC '/frontends'\G; 查看 FE 状态,目前就一台 FE

FE 分为 Leader,Follower 和 Observer 三种角色。 默认一个集群,只能有一个 Leader,可以有多个 Follower 和 Observer。其中 Leader 和 Follower 组成一个 Paxos 选择组,如果Leader 宕机,则剩下的 Follower 会自动选出新的 Leader,保证写入高可用。Observer 同步 Leader 的数据,但是不参加选举。
如果只部署一个 FE,则 FE 默认就是 Leader。在此基础上,可以添加若干 Follower 和 Observer。

-- 添加FE的新节点
ALTER SYSTEM ADD FOLLOWER "linux02:9010";
ALTER SYSTEM ADD OBSERVER "linux03:9010";

在linux01和linux02分别启动FE

# 第一次添加,一定要加这两个参数  --helper  linux01:9010
/opt/apps/doris/fe/bin/start_fe.sh --helper  linux01:9010 --daemon

此时,再在linux01的mysql客户端中使用 SHOW PROC '/frontends'\G; 命令查看FE的状态

删除FE节点命令

-- 删除 Follower FE 时,确保最终剩余的 Follower(包括 Leader)节点最好为奇数。
ALTER SYSTEM DROP FOLLOWER[OBSERVER] "fe_host:edit_log_port";

ALTER SYSTEM DROP FOLLOWER "linux03:9010";

BE 扩容和缩容

增加 BE 节点

-- 在 MySQL 客户端,通过 ALTER SYSTEM ADD BACKEND 命令增加 BE 节点。
ALTER SYSTEM ADD BACKEND "linux01:9050";

-- DROP 方式删除 BE 节点(不推荐)
ALTER SYSTEM DROP BACKEND "be_host:be_heartbeat_service_port";
ALTER SYSTEM DROP BACKEND "linux03:9050";

-- 注意:DROP BACKEND 会直接删除该 BE,并且其上的数据将不能再恢复!!!所以我们强烈不推荐使用 DROP BACKEND 这种方式删除 BE 节点。当你使用这个语句时,会有对应的防误操作提示。

-- DECOMMISSION 方式删除 BE 节点(推荐)
ALTER SYSTEM DECOMMISSION BACKEND  "be_host:be_heartbeat_service_port"; 
ALTER SYSTEM DECOMMISSION BACKEND "linux03:9050";
-- 1.该命令用于安全删除 BE 节点。命令下发后,Doris 会尝试将该 BE 上的数据向其 他 BE 节点迁移,当所有数据都迁移完成后,Doris 会自动删除该节点。 
-- 2.该命令是一个异步操作。执行后,可以通过 SHOW PROC '/backends'; 看到该 BE节点的 isDecommission 状态为 true。表示该节点正在进行下线。
-- 3.该命令不一定执行成功。比如剩余 BE 存储空间不足以容纳下线 BE 上的数据,或者剩余机器数量不满足最小副本数时,该命令都无法完成,并且 BE 会一直处于isDecommission 为 true 的状态。 
-- 4.DECOMMISSION 的进度,可以通过 SHOW PROC '/backends'; 中的 TabletNum 查看,如果正在进行,TabletNum 将不断减少。 
-- 5.该操作可以通过如下命令取消:CANCEL DECOMMISSION BACKEND "be_host:be_heartbeat_service_port"; 取消0后,该 BE 上的数据将维持当前剩余的数据量。后续 Doris 重新进行负载均衡。

Broker 扩容缩容

-- Broker 实例的数量没有硬性要求。通常每台物理机部署一个即可。Broker 的添加和删除可以通过以下命令完成:

ALTER SYSTEM ADD BROKER broker_name "broker_host:broker_ipc_port";
ALTER SYSTEM DROP BROKER broker_name "broker_host:broker_ipc_port";
ALTER SYSTEM DROP ALL BROKER broker_name;
-- Broker 是无状态的进程,可以随意启停。当然,停止后,正在其上运行的作业会失败,重试即可。
本文转载于网络 如有侵权请联系删除

相关文章

  • 网络、io命令手册重编(2021版)

    网络rz#通过ssh上传小文件 sz#通过ssh下载小文件 ifconfigeth0down#禁用网卡 ifconfigeth0up#启用网卡 ifupeth0:0#启用网卡 mii-toolem1#查看网线是否连接 traceroutewww.baidu.com#测试跳数 vi/etc/resolv.conf#设置DNSnameserverIP定义DNS服务器的IP地址 nslookupwww.moon.com#解析域名IP dig-xwww.baidu.com#解析域名IP dig+trace-tAdomainname#跟踪dns dig+shorttxthacker.wp.dg.cx#通过DNS来读取Wikipedia的hacker词条 host-ttxthacker.wp.dg.cx#通过DNS来读取Wikipedia的hacker词条 lynx#文本上网 wget-Ppath-Onameurl#下载包名:wgetrc-q安静-c续传 dhclienteth1#自动获取IP mtr-rwww.baidu.com#测试网络链路节点响应时间#traceping结合 ipcalc-m

  • PHP 使用 redis 进行商品秒杀设计思路

    前期准备背景 相信很多在小公司打拼的小伙伴 对于秒杀系统真的是可遇不可求 我们只能通过模拟演练 一方面熟悉高并发场景、提升编码技能 另一方面,为进入大厂做好准备 此处,我主要还是阐述下设计思路 有不同见解,欢迎指摘… 模拟环境 PHP7.2、CentOS7.9、Redis6.0.8、ab压测工具 ☛设计思路首先,要明确的一点是,不能直接按照传统商品订单思路处理,毕竟大流量下不能丢失用户美好的交互性 然后,准备秒杀服务器,不影响主业务运行 用户在秒杀等待页面,使用ajax异步更新倒计时 点击"抢购"触发时 使用Redis开启事务 提取用户唯一标识ID,首先集中到redis的一个商品数量的集合("kill_user_que") 然后,将符合要求的用户ID,存入秒杀队列("kill_user") 注意商品数量的递减变化 最终的结果是得到一个,不会超售商品数量的秒杀队列(kill_user) 设置一个或多个线程,也可以是定时任务 去秒杀队列(kill_user)中提取用户ID,依次执行下单逻辑 具体的业务处理,要根据实际场景,再做代码

  • phpcms V9如何调用栏目图片的方法

    直接上调用的标签{$CATEGORYS[$catid][image]}复制上个实例在复制最后将顶级栏目下子栏目循环显示代码贴出来方便大家学习:{if$top_parentid} {pc:contentaction="category"catid="$top_parentid"num="15"siteid="$siteid"order="listorderASC"} {loop$data$r} {$r[catname]}| {/loop} {/pc} {/if}复制如果需要调用视频专辑和搜索的话,需要视频专辑| {if$modelid}搜索{/if} 插入到中复制

  • NFT不同于比特币 那么投资 NFT 究竟有何意义?

    最近NFT持续火热,但随之而来的问题是NFT到底有什么投资价值?从铸造和发行的角度来说,NFT是一种数字代币,可以代表某个基础资产的所有权,所以它是一种所有权的象征。举个例子来说,达·芬奇(LeonardodaVinci)的巨作《蒙娜丽莎》可以有许多完全相同的复制品,这些复制品几乎没有太大价值。但是在数字领域里,如果想要认证原始版的《蒙娜丽莎》,NFT应该是一种比较好的方式。因为在现实世界里,我们要认证原作的真实性非常麻烦,假设要验证《蒙娜丽莎》,就必须对画布上的每一道油漆中给出真实性的证据,甚至要进行X光线照射进行验证等等。那么相比之下,NFT作为一种数字化的所有权代币,购买了NFT,就代表你拥有这副作品,是一种机制上的信任。同时,你拥有NFT,但并不影响对其他人的访问权,也就是说大家都可以观看这个画作,但实际上NFT的所有权与访问权是分开的。在传统的现实社会中,你可以买一张卢浮宫的门票,去欣赏《蒙娜丽莎》的原作;在数字社会中,你可以拥有一副艺术品,免费或者收费让大家欣赏,同时还可以转让交易或者拍卖交易。而目前最大的问题在于,NFT基于区块链技术发行,这会使得许多传统的法律和商业结构

  • tomcat设置访问路径与实际路径

    tomcat访问地址修改指向实际路径,修改server.xml。在host标签下添加contest标签<Hostname="localhost"appBase="webapps" unpackWARs="true"autoDeploy="true"> <!--SingleSignOnvalve,shareauthenticationbetweenwebapplications Documentationat:/docs/config/valve.html--> <!-- <ValveclassName="org.apache.catalina.authenticator.SingleSignOn"/> --> <!--Accesslogprocessesallexample. Documentationat:/docs/config/valve.html Note:Thepatternusedisequivalenttousing

  • 电子签的背后江湖:腾讯、蚂蚁、字节跳动的较量

    配图来自Canva在蚂蚁科技投资e签宝、腾讯支持法大大之后,电子签市场迎来新资本巨头。近期,字节跳动上线了一个名为「电子牵」的在线签合同平台,进军电子签领域的意图已十分明显。据官方介绍,在线签合同平台「电子牵」,可以通过密码技术对电子文档进行电子形式的签名,为租赁合同、合作协议、采购合同、劳动合同等业务提供线上签署服务。   显然,互联网巨头们的战火已从零售、社交、视频等等领域烧至电子签名行业市场,而资本蜂拥而至,也间接说明了电子签市场有潜力。电子签市场提速可以说,互联网全面普及、数字经济、无纸化革命等环境因素,不断助推电子签约服务加速普及。一方面,电子签名是时代、技术孕育的产物,在人人“泡网”的年代里,电子签名应用越来愈广泛,也逐渐被肯定。对于相关企业而言,电子签名无纸化的高效运作,不仅起到了降本增效的作用,比纸质签名安全可控。另一方面,近年来电子签名利好政策不断,国家大力支持让电子签名市场加速覆盖各行各业。据悉,2019年以来,海关总署、交通运输部、人社部等多个政府部门发文,表示要加强推进电子签名技术应用,电子签在政务市场如鱼得水;2020年3月4日,人力资源和社会保障部办公厅发布

  • Guess Number Higher or Lower II

    GuessNumberHigherorLowerII这个题目还是蛮有意思的 给定整数n,假定我选中的数1到n中的C,我只提示你猜的数与C的大小关系,这样你就可以缩小范围,继续猜测,但是你猜错数字,就要支付等值的美元,我为了获得更多的美元,会通过高低引导你,比如 n=10 1,2,3,4,5,6,7,8,9,10 这时候如果你第一次选中9,我要是提示你猜小了,则你下一个就可以猜出10,因为只有一个数可以选择,那么我只能得到9美元,如果我告诉你猜高了,还有很多数字可选,这样我也可以获得更多美元。假如你第一次选择的是7,如果告诉你猜低了,往高了猜你会猜几呢,一开始觉得猜7+10均值8,那么我可以告诉你还是猜低了,这时候你再猜8+10均值9,我还是可以告诉你猜低了,因为还有10,你要支付7+8+9,如果一个开始猜完7,直接猜测8+10均值9,这样无论我说猜低猜高了,你都可以获得答案是8或者10,只需支付7+9,16美元 这个题目可以用动态规划求解,不断就将问题分解成规模小子问题,终结条件就是问题不可分了。而且开始选择都是从中间往后开始猜,这样才能少支付美元,程序性能会提升很多importnum

  • TypeScript中Never类型和类型断言

    Never类型 never类型表示:那些永不存在的值的类型。 例如:never类型是那些总是会【抛出异常】或根本就【不会有返回值的函数表达式】或【箭头函数表达式的返回值类型】 never类型是任何类型的子类型,也可以赋值给任何类型。 然而,没有类型是never的子类型或可以赋值给never类型(除了never本身之外)。 any也不可以赋值给never。 //never类型是那些总是会【抛出异常】 functionerror(message:string):never{ thrownewError(message); } 复制 never在项目中的运用 interfaceInfo{ //当我们不知道这个数组里面是什么类型的时候,我们就可以设置为never类型 like:never[]; age:number; name:string; } letobj:Info={ like:[], age:18, name:'磅礴' } 复制 类型断言 有时候你会遇到这样的情况,你会比TypeScript更了解某个值的详细信息。 通过类型断言告诉编译器,“相信我,我知道自己在干什么”。 类型断言

  • elementui 表格中带有按钮的loading解决方案

    需求:表格每一列有一个按钮字段,点击后需要loading 按照普通的在Array对象上加属性,监听不到变化,需要使用this.$set 比如这个样子设置 getCoreLoots().then(response=>{ this.transitFileList=response.data.data this.transitFileList=this.transitFileList.map(item=>{ //添加上传按钮loading item.uploadLoading=false returnitem }) console.log(this.transitFileList) this.transitListLoading=false }) 复制 这样子出来的结果是这样 属性设置到了ob外面,vue监听不到变化,也就是说我们进行改变后dom不会更新 主要的原因是:当你把一个普通的JavaScript对象传入Vue实例作为data选项,Vue将遍历此对象所有的property,并使用Object.defineProperty把这些property全部转为getter/set

  • 淘宝网的软件质量属性分析

    1.可用性: 场景:双十一购物狂欢,海量用户同时使用系统。   2.可修改性: 3.性能分析: 性能反应的是系统的响应能力。性能与时间有关。事件(中断、消息、用户请求或时间已到)发生时,系统必须对其做出响应。也就是说,性能衡量软件系统及时提供相应服务的能力,表现在三个方面,速度、吞吐量和持续高速性。 场景:用户确认购买之后商品下单,进行交易处理 4.安全性 安全性,系统防止攻击的能力和保护用户合法信息不被侵犯的能力。系统向合法用户提供服务,阻止非授权用户使用,阻止恶意的攻击。 场景:黑客攻击,企图窃取用户信息    5.可测试性: 软件测试人员对淘宝的各个模块进行测试: 6.易用性: 易用性就是用户使用系统提供的服务的难易程度。官方解释是:对用户来说完成某个期望的任务的容易程度和系统所提供的的用户支持的种类。 场景:新注册的用户完成一次购买商品。  

  • 《修改代码的艺术》感悟之一

       对于新手而言,任何遗留代码都很难去做出修改。只有通过一些特定的方法来改变原始代码,才能加深对代码的理解。

  • phpmyadmin自增字段

    自增字段必须为primarykey 2种方法: 1- ALTER TABLE `qr_role` CHANGE `ROLE_ID` `ROLE_ID` INT(11) NOT NULL AUTO_INCREMENT; 2-  phpmyadmin设置id自增(AUTO_INCREMENT)  在A_I前面打勾:如图

  • torch 转onnx报错:KeyError: &#39;upsample_bilinear2d&#39;

    因为我的torch是1.2的,所以不支持 orch.onnx.export(model,dummy_tensor,output,export_params=True,opset_version=11),pytorch>=1.3.0才支持opset_version=11 最快的方式是直接将mode配置的bilinear换成nearest

  • MySQL(1)-索引总结

    1-1.索引 索引即用于快速定位数据的特征值,可以使用数据表中的某一/几列来作为索引。 1-1.1分类 1-1.1.1按结构 1)B+TREE (1)定义 B+树是2-3树的扩展,其将3节点进一步放大为n节点以容纳更多的元素,其中中间节点只存储子节点的头部索引,叶子节点存放数据,且索引值由小到大从左至右排列,各个叶子节点构成一个单链表,这样更适用于顺序的批量查询。此外,由于要查询数据必须到叶子节点才可以得到,因而相较于B树更加稳定 (2)匹配规则 全值匹配 匹配最左前缀(索引最左一列) 匹配最左前缀的前缀(索引最左一列的左前缀) 一个范围查询 即从索引最左开始,只能按顺序出现一个范围查询条件且位于最后 (3)失效情况 不是从最左匹配 跳过索引中的某几列匹配 某一列范围查询,则后面的列不能使用索引 InnoDB和MyISAM均使用B+TREE索引 2)HASH索引 (1)定义 为数据计算HASH值并存储与HASH表中,并采用拉链法解决HASH冲突 (2)匹配规则 使用HASH值定位bin的位置,再遍历链表来查找对应的数据 (3)失效情况 不能使

  • LeetCode一刷:回溯算法-子集

    问题描述: 子集给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入:nums=[1,2,3]输出:[[3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []] 作者:力扣(LeetCode)链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xv67o6/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 分析: 画个草图: 解法: varbacktrack=function(list,tmpList,nums,start){ constlen=nums.length; if(start===len){ return; } for(leti=start;i<len;i++){ tmpList.push(nums[i]); list.push([...t

  • Python创建大量线程时遇上OpenBLAS blas_thread_init报错怎么办?

    计算机明明还有空闲资源,但Python创建大量线程时,遇上OpenBLASblas_thread_init报错怎么办? 具体看看着报错信息: OpenBLASblas_thread_init:RLIMIT_NPROC4096current,8251551max OpenBLASblas_thread_init:pthread_createfailedforthread122of128:Resourcetemporarilyunavailable 复制 里面说到,OpenBLAS无法创建线程。 用cat/proc/cpuinfo|grep"processor"|wc-l查看CPU的逻辑核数,总共有160个: 再用top看一下系统资源情况: 还有近1.8T的闲置内存,一小半的核数。但用Python的multiprocessing创建的线程数也小于空闲核数,为什么还会失败? 再来看看报错信息,里面提到的RLIMIT_NPROC变量控制了用户可以使用的CPU核数。OpenBLAS创建线程时超过了核它,从而导致失败。虽然操作时设置的线程数没有超,但OpenBLAS可能尝试同时启动多个线程来加

  • springmvc是单例模式以及原因

    1.springmvc是单例的,不需要每次请求都要创建对象,都时通过spring管理的,直接通过注入的方式获取对象; 变成多例的解决方案: 1、不要在controller中定义成员变量。 2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式 --这样效率不高,不建议这样做。

  • 不可测集的构造与理解

    1,不可测集的构造   2,为什么这个集合Z是不可测集 显然,这个集合的元素和全体无理数是一样多的,而且多出一个有理数,但是这些数之间的空间,或者说是距离是不确定的,【0,1】之间的所有无理数也是可全体无理数一样多的,,但是【0,1】之间的无理数是可测的,测度是1。当时,当无理数之间的距离不确定的时候,他们所占的空间也就不确定了,这相当于把0,1空间任意拉伸,而且点和点之间的距离是随机的,一个随机的空间,就是不可度量空间。 度量空间的点和点之间的距离应该是固定的,(可以不一样,但不能不确定)这就是度量空间的概念。可度量意味着距离确定,如果任意的空间,把点和点之间的距离修改成随机的,那么这个空间就不具备可度量的特性。  

  • openstack (1)----- NTP 时间同步服务

    一、标准时间 1、地球分为东西十二个区域,共计24个时区 2、格林威治作为全球标准时间即(GMT时间),东时区以格林威治时区进行加,而西时区则进行减 3、地球的轨道并非正圆,在加上自传速度逐年递减,因此时间就会有误差在计算时间时,最准确是使用“原子震荡周期”所计算的物理时钟,这种时钟被称为标准时间即--------CoordinatedUniversaltime(UTC) 4、美国的NISTF-1原子钟2000年才将产生1秒的时差 5、目前使用的是NetworkTimeProtocol协议,即网络时间协议 二、NTP如何工作的? 1、客户端将采用随机端口向NTP服务器(udp:123)发出时间同步请求 2、NTP服务器收到请求后会将发出调校时间 3、NTP客户端接收到NTP服务器的消息后,以进行调整,从而完成时间同步   三、同步服务器时间的方式 1、一次性同步时间:ntpdate +   时间服务器的域名或ip地址 例如:ntpdate 120.25.108.11 2、通过服务自动同步 四、NTP所涉及文件   五

  • ETH

    不要解锁您的帐户以检查余额。 仅当您要发送交易时才解锁您的钱包。通过Etherscan,Ethplorer或Etherchain检查余额。 e.g. https://etherscan.io/address/0x12a0E25E62C1dBD32E505446062B26AECB65F028 复制 END

  • 牛客网 序列化二叉树

    题目: 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。 解题: /* publicclassTreeNode{ intval=0; TreeNodeleft=null; TreeNoderight=null; publicTreeNode(intval){ this.val=val; } } */ /* 算法思想:根据前序遍历规则完成序列化与反序列化。所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。 依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。 另外,结点之间的数值用逗号隔开。 */ publicclassSolu

相关推荐

推荐阅读