当前位置: 首页 > news >正文

【Hadoop】HDFS API 操作大全

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁

🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁

🍁🪁🍁 🪁🍁🪁🍁感谢点赞和关注 ,每天进步一点点!加油!🍁🪁🍁 🪁🍁🪁🍁

目录

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁

一、FileSystem文件抽象类

1.1文件读取API

1.2文件操作API

1.3抽象FileSystem类的具体实现子类

1.4FileSystem IO输入系统相关类

1.5FileSystem IO输出系统相关类

二、HDFS的API操作

2.1测试集群版本信息

2.2文件上传下载和移动

2.3文件读写操作

2.4文件状态信息获取

2.5实战案例


一、FileSystem文件抽象类


为了提供对不同数据访问的一致接口,Hadoop借鉴了Linux虚拟文件系统的概念,为此Hadopo提供了一个抽象的文件系统模型FileSystem,HDFS 是其中的一个实现。

FileSystem是Hadoop中所有文件系统的抽象父类,它定义了文件系统所具有的基本特征和基本操作。

1.1文件读取API


HadoopFileSystem操作

Java操作

Linux操作

描述

URL.openStream

FileSystem.open

FileSystem.create

FileSystem.append

URL.openStream

open

打开一个文件

FSDataInputStream.read

InputStream.read

read

读取文件中的数据

FSDataInputStream.write

OutputStream.write

write

向文件中写入数据

FSDataInputStream.close

FSDataOutputStream.close

InputStream.close

OutputStream.close

close

关闭一个文件

FSDataInputStream.seek

RandomAccessFile.seek

lseek

改变文件读写位置

FileSystem.getContentSummary

du/wc

获取文件存储信息

1.2文件操作API


HadoopFileSystem操作

Java操作

Linux操作

描述

FileSystem.getFileStatus

FileSystem.get*

File.get*

stat

获取文件/目录的属性

FileSystem.set*

File.set*

chomd

修改文件属性

FileSystem.createNewFile

File.createNewFile

create

创建一个文件

FileSystem.delete

File.delete

remove

删除一个文件

FileSystem.rename

File.renameTo

rename

移动或先修改文件/目录名

FileSystem.mkdirs

File.mkdir

mkdir

创建目录

FileSystem.delete

File.delete

rmdir

从一个目录下删除一个子目录

FileSystem.listStatus

File.list

readdir

读取一个目录下的项目

FileSystem.setWorkingDirectory

getcwd/getwd

返回当前工作目录

FileSystem.setWorkingDirectory

chdir

更改当前的工作目录

1.3抽象FileSystem类的具体实现子类


1.4FileSystem IO输入系统相关类


1.5FileSystem IO输出系统相关类



二、HDFS的API操作


2.1测试集群版本信息

2.2文件上传下载和移动

/*** 本地文件上传到 HDFS** @param srcPath  本地路径 + 文件名* @param dstPath  Hadoop路径* @param fileName 文件名*/
def copyToHDFS(srcPath: String, dstPath: String, fileName: String): Boolean = {var path = new Path(dstPath)val fileSystem: FileSystem = path.getFileSystem(conf)val isFile = new File(srcPath).isFile// 判断路径是否存在val existDstPath: Boolean = fileSystem.exists(path)if (!existDstPath) {fileSystem.mkdirs(path)}// 本地文件存在if (isFile) {// HDFS 采用 路径+ 文件名path = new Path(dstPath + File.separator + fileName)// false: 是否删除 目标文件,false: 不覆盖fileSystem.copyFromLocalFile(false, false, new Path(srcPath), path)return true}false
}/*** Hadoop文件下载到本地** @param srcPath hadoop 源文件* @param dstPath 目标文件* @param fs      文件访问对象*/
def downLoadFromHDFS(srcPath: String, dstPath: String, fs: FileSystem): Unit = {val srcPathHDFS = new Path(srcPath)val dstPathLocal = new Path(dstPath)// false: 不删除源文件fs.copyToLocalFile(false, srcPathHDFS, dstPathLocal)
}/*** 检查Hadoop文件是否存在并删除** @param path  HDFS文件*/
def checkFileAndDelete(path: String, fs: FileSystem) = {val dstPath: Path = new Path(path)if (fs.exists(dstPath)) {// false: 是否递归删除,否fs.delete(dstPath, false)}
}/*** 获取指定目录下,正则匹配后的文件列表** @param dirPath   hdfs路径* @param regexRule 正则表达式 ,如:"^(?!.*[.]tmp$).*$" ,匹配非 .tmp结尾的文件*/def listStatusHDFS(dirPath: String, regexRule: String, fs: FileSystem): util.ArrayList[Path] = {val path = new Path(dirPath)val pattern: Pattern = Pattern.compile(regexRule)// 匹配的文件val fileList = new util.ArrayList[Path]()val fileStatusArray: Array[FileStatus] = fs.listStatus(path)for (fileStatus <- fileStatusArray) {// 文件 全路径val filePath: Path = fileStatus.getPath()val fileName: String = filePath.getName.toLowerCaseif (regexRule.equals("")) {// 如果匹配规则为空 则获取目录下的全部文件fileList.add(filePath)log.info("match file : " + fileName)} else {// 正则匹配文件if (pattern.matcher(fileName).matches()) {fileList.add(filePath)log.info("match file : " + fileName)}}}fileList
}/*** 文件移动或重命名到指定目录, 如:文件00000 重命名为00001** @param srcPath 源文件路径* @param dstPath 源文件路径* @param fs      文件操作对象*/
def renameToHDFS(srcPath: String, dstPath: String, fs: FileSystem): Boolean = {var renameFlag = falseval targetPath = new Path(dstPath)// 目标文件存在先删除if (fs.exists(targetPath)) {fs.delete(targetPath, false)}renameFlag = fs.rename(new Path(srcPath), targetPath)if (renameFlag) {log.info("renamed file " + srcPath + " to " + targetPath + " success!")} else {log.info("renamed file " + srcPath + " to " + targetPath + " failed!")}renameFlag
}

2.3文件读写操作


Hadoop抽象文件系统也是使用流机制进行文件的读写。Hadoop抽象文件系统中,用于读文件数据的流是FSDataInputStream,对应地,写文件通过抽象类FSDataOutputStream实现。


/*** 读取HDFS文件** @param inPutFilePath 源文件路径* @param fs            文件操作对象*/
def readFromHDFS(inPutFilePath: String, OutputFilePath: String, fs: FileSystem) = {var fSDataInputStream: FSDataInputStream = nullvar bufferedReader: BufferedReader = nullval srcPath = new Path(inPutFilePath)if (fs.exists(srcPath)) {val fileStatuses: Array[FileStatus] = fs.listStatus(srcPath)for (fileStatus <- fileStatuses) {val filePath: Path = fileStatus.getPath// 判断文件大小if (fs.getContentSummary(filePath).getLength > 0) {fSDataInputStream = fs.open(filePath)bufferedReader = new BufferedReader(new InputStreamReader(fSDataInputStream))var line = bufferedReader.readLine()while (line != null) {print(line + "\n") // 打印line = bufferedReader.readLine()}}}}fSDataInputStream.close()bufferedReader.close()
}/*** 读取HDFS文件, 处理完成 重新写入** @param inPutFilePath 源文件路径* @param OutputFilePath 输出文件到新路径* @param fs            文件操作对象*/
def writeToHDFS(inPutFilePath: String, OutputFilePath: String, fs: FileSystem) = {var fSDataInputStream: FSDataInputStream = nullvar fSDataOutputStream: FSDataOutputStream = nullvar bufferedReader: BufferedReader = nullvar bufferedWriter: BufferedWriter = nullval srcPath = new Path(inPutFilePath)var count = 0if (fs.exists(srcPath)) {val fileStatuses: Array[FileStatus] = fs.listStatus(srcPath)for (fileStatus <- fileStatuses) {val filePath: Path = fileStatus.getPath// 判断文件大小if (fs.getContentSummary(filePath).getLength > 0) {fSDataInputStream = fs.open(filePath)bufferedReader = new BufferedReader(new InputStreamReader(fSDataInputStream))val outputFilePath = new Path(OutputFilePath + count)fSDataOutputStream = fs.create(outputFilePath)bufferedWriter = new BufferedWriter(new OutputStreamWriter(fSDataOutputStream, "UTF-8"))var line = bufferedReader.readLine()while (line != null) {val bytes: Array[Byte] = line.getBytes("UTF-8")bufferedWriter.write(new String(bytes) + "\n")line = bufferedReader.readLine()}bufferedWriter.flush()count += 1}}}fSDataInputStream.close()bufferedReader.close()bufferedWriter.close()
}

测试结果如下:

2.4文件状态信息获取


FileSystem. getContentSummary()提供了类似Linux命令du、df提供的功能。du表示"disk usage",它会报告特定的文件和每个子目录所使用的磁盘空间大小;命令df则是"diskfree"的缩写,用于显示文件系统上已用的和可用的磁盘空间的大小。du、df是Linux中查看磁盘和文件系统状态的重要工具。

getContentSummary()方法的输入是一个文件或目录的路径,输出是该文件或目录的一些存储空间信息,这些信息定义在ContentSummary,包括文件大小、文件数、目录数、文件配额,已使用空间和已使用文件配额等。

 /*** HDFS路径下文件信息统计** @param dirPath hdfs路径**/def listHDFSStatus(dirPath: String, fs: FileSystem) = {val path = new Path(dirPath)// 匹配的文件val contentSummary: ContentSummary = fs.getContentSummary(path)println("/tmp/kangll 目录下子目录个数: ", contentSummary.getDirectoryCount)println("/tmp/kangll 目录下文件个数: ", contentSummary.getFileCount)println("/tmp/kangll 目录下文件大小: ", contentSummary.getLength)println("/tmp/kangll 目录下文件和子目录个数: ", contentSummary.getFileAndDirectoryCount)}

/tmp/kangll目录信息获取结果:

2.5实战案例


案例说明: HDFS 文件清理, 根据文件大小、个数、程序休眠时间控制 匀速 批量删除 HDFS 文件,当文件越大 ,需要配置 删除个数更少,休眠时间更长,防止 NameNode 负载过大,减轻DataNode磁盘读写压力,从而不影响线上业务情况下清理过期数据。

package com.kangll.common.utilsimport java.text.SimpleDateFormat
import java.util.concurrent.TimeUnit
import java.util.{Calendar, Date, Properties}
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{ContentSummary, FileStatus, FileSystem, Path}
import org.apache.log4j.Loggerimport scala.collection.mutable.ListBuffer/** ***************************************************************************************** @auther kangll                               * @date 2023/09/12 12:10                                  * @desc HDFS 文件清理, 根据文件大小、个数、程序休眠时间控制 匀速 批量删除*       HDFS 文件,当文件越大 ,需要配置 删除个数更少,休眠时间更长,防止*       NameNode 负载过大,减轻DataNode磁盘读写压力,从而不影响线上业务下删除***       1.遍历文件夹下的文件个数据, 当遍历的文件夹下的文件个数到达阈值时 将*        文件所述的 父路径直接删除** ****************************************************************************************/
object CleanHDFSFileUtil {// 删除文件总数统计var HDFS_FILE_SUM = 0// 批次删除文件个数显示var HDFS_FILE_BATCH_DEL_NUM = 0val start = System.currentTimeMillis()/**** @param fs             文件操作对象* @param pathName       文件根路径* @param fileList       批次清理的 buffer* @param saveDay        根据文件属性 获取文件创建时间  选择文件保留最近的天数* @param sleepTime      休眠时间,防止一次性删除太多文件  导致 datanode 文件负载太大* @param fileBatchCount 批次删除文件的个数, 相当于是 上报到 namenode 文件清理队列的大小,参数越大 队列越大,datanode 磁盘负载相对来说就高* @return*/def listPath(fs: FileSystem, pathName: String, fileList: ListBuffer[String], saveDay: Int, sleepTime: Long, fileBatchCount: Int): ListBuffer[String] = {val fm = new SimpleDateFormat("yyyy-MM-dd")// 获取当前时间val currentDay = fm.format(new Date())val dnow = fm.parse(currentDay)val call = Calendar.getInstance()call.setTime(dnow)call.add(Calendar.DATE, -saveDay)// 获取保留天前的时期val saveDayDate = call.getTime// 遍历文件val fileStatuses = fs.listStatus(new Path(pathName))for (status <- fileStatuses) {// 获取到文件名val filePath = status.getPathif (status.isFile) {// 获取到文件修改时间val time: Long = status.getModificationTimeval hdfsFileDate = fm.parse(fm.format(new Date(time)))if (saveDayDate.after(hdfsFileDate)) {fileList += filePath.toString// 获取文件个数val cs: ContentSummary = fs.getContentSummary(filePath)HDFS_FILE_SUM += cs.getFileCount.toIntHDFS_FILE_BATCH_DEL_NUM += cs.getFileCount.toIntif (HDFS_FILE_BATCH_DEL_NUM >= fileBatchCount) {val end = System.currentTimeMillis()println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")println("++++++++++++++++ 遍历文件数量达到 " + HDFS_FILE_BATCH_DEL_NUM + " 个,删除HDFS文件 ++++++++++++++++")println("++++++++++++++++++++++++++++ 休眠 " + sleepTime + " S ++++++++++++++++++++++++++++")println("++++++++++++++++++++++++ 删除文件总数:" + HDFS_FILE_SUM + " ++++++++++++++++++++++++++")println("++++++++++++++++++++++++ 程序运行时间:" + (end - start) / 1000 + " s ++++++++++++++++++++++++")println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")HDFS_FILE_BATCH_DEL_NUM = 0TimeUnit.MILLISECONDS.sleep(sleepTime)}// 文件删除根据绝对路径删除println("+++++ 删除文件: " + filePath + "+++++")// 递归删除fs.delete(filePath, true)}} else {// 递归文件夹listPath(fs, filePath.toString, fileList, saveDay, sleepTime, fileBatchCount)}}println("+++++++++++++++++++++++++   删除文件总数:" + HDFS_FILE_SUM + " +++++++++++++++++++++++++")fileList}/*** 删除空文件夹** @param fs              文件操作对象* @param pathName        路径* @param pathSplitLength 文件按照"/"拆分后的长度*/def delEmptyDirectory(fs: FileSystem, pathName: String, pathSplitLength: Int) = {// 遍历文件val fileStatuses = fs.listStatus(new Path(pathName))for (status <- fileStatuses) {if (status.isDirectory) {val path: Path = status.getPath// /kangll/winhadoop/temp/wmall_batch_inout/day/1660878372 = 7val delPathSplitLength = path.toString.substring(6, path.toString.length).split("/").length//  filePath  /kangll/winhadoop/temp/wmall_batch_inout/day  子时间戳文件夹两个//        val hdfsPathListCount = fileStatuses.lengthval hdfsPathListCount = fs.listStatus(path).lengthif (delPathSplitLength == pathSplitLength && hdfsPathListCount == 0) {println("+++++++++++++++++ 删除空文件夹 : " + path + " +++++++++++++++++++")fs.delete(path, true)}}}}def main(args: Array[String]): Unit = {val logger = Logger.getLogger("CleanHDFSFileUtil")val conf = new Configuration()conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem")conf.set("fs.file.impl", "org.apache.hadoop.fs.LocalFileSystem")val fs = FileSystem.get(conf)val fileList = new ListBuffer[String]val hdfsDir = if (args.size > 0) args(0).toString else System.exit(0).toStringval saveDay = if (args.size > 1) args(1).toInt else 2val sleepTime = if (args.size > 2) args(2).toLong else 10val fileBatchCount = if (args.size > 3) args(3).toInt else 5/*默认不启用文件夹删除,参数为 文件夹绝对路径Split后的数组长度如 路径  /winhadoop/temp/wmall_batch_inout/thirty"  配置为 7*/val pathSplitLength = if (args.size > 4) args(4).toInt else 20// 删除文件listPath(fs, hdfsDir, fileList, saveDay, sleepTime, fileBatchCount)// 删除空文件夹delEmptyDirectory(fs, hdfsDir, pathSplitLength)fs.close()}
}

调用脚本

#                                                                                                         
# 脚本功能: 过期文件清理                                                                                              
# 作    者: kangll                                                                                             
# 创建时间: 2023-09-14                                                                                           
# 修改内容: 控制删除文件的批次个数,程序休眠时间传入                                                              
# 当前版本: 1.0v                                                                                                 
# 调度周期: 一天一次                                                                                                 
# 脚本参数: 删除文件夹、文件保留天数、程序休眠时间、批次删除个数                                                  
#  1.文件根路径,子文件夹递归遍历                                                                                                   
#  2.文件保留天数                                                                                                 
#  3.程序休眠时间 防止 DataNode 删除文件负载过大,单位  秒                                                        
#  4.批次删除文件个数 ,如配置 100,当满足文件个数100时, 整批执行 delete,紧接着程序休眠                           
#  5.默认不启用文件夹删除,也就是不传参,参数为 文件夹绝对路径Split后的数组长度                                   
#        /winhadoop/temp/wmall_batch_inout/thirty/时间戳/ Split后 长度为7,默认删除时间戳文件夹                                                                         
####  对应的新删除程序
jarPath=/hadoop/project/del_spark2-1.0-SNAPSHOT.jar### 集群日志
java -classpath $jarPath com.kangll.common.utils.CleanHDFSFileUtil /spark2-history 3 10 100

参考 :

hadoop抽象文件系统filesystem框架介绍_org.apache.hadoop.fs.filesystem_souy_c的博客-CSDN博客

Hadoop FileSystem文件系统的概要学习 - 回眸,境界 - 博客园

hadoop抽象文件系统filesystem框架介绍_org.apache.hadoop.fs.filesystem_souy_c的博客-CSDN博客

相关文章:

【Hadoop】HDFS API 操作大全

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…...

Webpack打包图片

一、在js文件中引入图片 二、在package.config.js中配置加载器 module.exports {mode: "production", // 设置打包的模式&#xff1a;production生产模式 development开发模式module: {rules: [// 配置img加载器{test: /\.(jpg|png|gif)$/i,type:"asset/resou…...

DipC 构建基因组 3D 结构(学习笔记)

背景 本文主要记录了 DipC 数据的复现过程、学习笔记及注意事项。 目录 下载 SRA 数据使用 SRA Toolkit 转换 SRA 数据为 Fastq 格式使用 bwa 比对测序数据使用 Hickit 计算样本的基因组 3D 结构使用散点图展示 3D 结构计算 3D 结构重复模拟的稳定性其他 步骤 1. 下载 SRA…...

Qt中音频的使用

对于音频我们在使用的过程中一般是录制音频、播放音频。针对这两个需求介绍Qt中音频的使用。 Qt中音频的录制 步骤&#xff1a; 1、获取系统中的音频设备。 2、创建QAudioRecorder对象&#xff0c;指定使用的音频设备&#xff0c;通过QAudioRecorder的setAudioInput函数设置…...

[centos]centos7源码编译cmake报错Could NOT find OpenSSL

测试环境&#xff1a; centos7.9 cmake3.25.0 ./bootstrap以后报错如下&#xff1a; Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR) CMake Error …...

vue若依前端项目搭建

1.项目搭建 首先进入到你需要创建的项目目录下面&#xff0c;然后输入命令vue create .创建项目 接下来选择手动搭建&#xff0c;然后把下面图片中的内容选上 再然后继续配置一些参数信息 接下来运行npm run serve项目就启动起来了 2.配置登录界面文件 首先修改src/router…...

基于win32实现TB登陆滑动验证

这里写目录标题 滑动验证触发条件&#xff1a;失败条件&#xff1a;解决方法:清除cooKie 滑动验证方式一&#xff1a;win32 api获取窗口句柄&#xff0c;选择固定位置 成功率高方式二&#xff1a; 原自动化滑动&#xff0c;成功率中 案例 先谈理论&#xff0c;淘宝 taobao.com …...

vue学习-07todoList案例与浏览器本地存储

TodoList Todo List&#xff08;任务列表&#xff09;是一个简单的Web应用程序示例&#xff0c;用于管理任务、代办事项或清单。Vue.js 是一个非常适合构建这种类型应用程序的框架&#xff0c;因为它提供了数据绑定、组件化、响应式和轻松管理用户界面的能力。 以下是一个基本…...

探索智能应用的基石:多模态大模型赋能文档图像处理

目录 0 写在前面1 文档图像分析新重点2 token荒&#xff1a;电子文档助力大模型3 大模型赋能智能文档分析4 文档图像大模型应用可能性4.1 专有大模型4.2 多模态模型4.3 设计思路 总结 0 写在前面 中国智能产业高峰论坛(CIIS2023)旨在为政企研学各界学者专家提供同台交流的机会…...

自动化发布npm包小记

1.注册npm账号 打开npm官网&#xff0c;并注册自己的npm账号 2.申请AccessToken 1.登录npm官网&#xff0c;登录成功后&#xff0c;点开右上角头像&#xff0c;并点击Access Tokens选项 2.点开Generate New Token下拉框&#xff0c;点击Classic Token(和Granular Access To…...

详解机器视觉性能指标相关概念——混淆矩阵、IoU、ROC曲线、mAP等

目录 0. 前言 1. 图像分类性能指标 1.1 混淆矩阵(Confusion Matrix) 1.2 准确率(Precision) 1.3 召回率(Recall) 1.4 F1值(F1 score) 1.5 ROC曲线(接收者工作特征曲线&#xff0c;Receiver Operating Characteristic curve) 1.6 mAP(mean Average Precision) 2. 图像分…...

想要精通算法和SQL的成长之路 - 预测赢家

想要精通算法和SQL的成长之路 - 预测赢家 前言一. 预测赢家二. 石子游戏&#xff08;预测赢家的进阶版&#xff09;2.1 博弈论 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 预测赢家 原题链接 主要思路&#xff1a; 我们定义dp[i][j]&#xff1a;在区间 [i, j] 之间先…...

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V/0-10mA/0-20mA/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…...

Vue路由和Node.js环境搭建

文章目录 一、vue路由1.1 简介1.2 SPA1.3 实例 二、Node.js环境搭建2.1 Node.js简介2.2 npm2.3 环境搭建2.3.1 下载解压2.3.2 配置环境变量2.3.3 配置npm全局模块路径和cache默认安装位置2.3.4 修改npm镜像提高下载速度 2.4 运行项目 一、vue路由 1.1 简介 Vue 路由是 Vue.js…...

【Vue】使用vue-cli搭建SPA项目的路由,嵌套路由

一、SPA项目的构建 1、前期准备 我们的前期的准备是搭建好Node.js,测试&#xff1a; node -v npm -v2、利用Vue-cli来构建spa项目 2.1、什么是Vue-cli Vue CLI 是一个基于 Vue.js 的官方脚手架工具&#xff0c;用于自动生成vue.jswebpack的项目模板&#xff0c;它可以帮助开发者…...

Excel 通过条件格式自动添加边框

每录入一次数据就需要手动添加一次边框&#xff0c;非常麻烦&#xff0c;这不是我们想要的。 那么有没有办法&#xff0c;在我们录入数据后&#xff0c;自动帮我们加上边框呢&#xff1f; 选中要自动添加边框的列&#xff0c;然后按箭头流程操作 ↓ ↓ ↓ ↓...

mysql 备份和还原 mysqldump

因window系统为例 在mysql安装目录中的bin目录下 cmd 备份 备份一个数据库 mysqldump -uroot -h hostname -p 数据库名 > 备份的文件名.sql 备份部分表 mysqldump -uroot -h hostname -p 数据库名 [表 [表2…]] > 备份的文件名.sql ## 多个表 空格隔开&#xff0c;中间…...

ELK日志分析系统+ELFK(Filebeat)

本章结构&#xff1a; 1、ELK日志分析系统简介 2、Elasticsearch介绍&#xff08;简称ES&#xff09; 3、Logstash介绍 4、Kibana介绍 5、实验&#xff0c;ELK部署 一、ELK日志分析系统简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logst…...

ULID 在 Java 中的应用: 使用 `getMonotonicUlid` 生成唯一标识符

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

实用的嵌入式编码技巧:第三部分

每个触发器都有两个我们在风险方面违反的关键规格。“建立时间”是时钟到来之前输入数据必须稳定的最小纳秒数。“保持时间”告诉我们在时钟转换后保持数据存在多长时间。 这些规格因逻辑设备而异。有些可能需要数十纳秒的设置和/或保持时间&#xff1b;其他人则需要少一个数量…...

8个很棒的Vue开发技巧

1.路由参数解耦 通常在组件中使用路由参数&#xff0c;大多数人会做以下事情。 export default { methods: {getParamsId() {return this.$route.params.id} } } 在组件中使用 $route 会导致与其相应路由的高度耦合&#xff0c;通过将其限制为某些 URL 来限制组件的灵活性。…...

Python - 小玩意 - 文字转语音

import pyttsx3 from tkinter import *def recognize_and_save():try:say pyttsx3.init()rate say.getProperty(rate) # 获取当前语速属性的值say.setProperty(rate, rate - 20) # 设置语速属性为当前语速减20text text_var.get()# 语音识别say.say(text)say.runAndWait()…...

聚焦数据库和新兴硬件的技术合力 中科驭数受邀分享基于DPU的数据库异构加速方案

随着新型硬件成本逐渐降低&#xff0c;充分利用新兴硬件资源提升数据库性能是未来数据库发展的重要方向之一&#xff0c;SIGMOD、VLDB、CICE数据库顶会上出现越来越多新兴硬件的论文和专题。在需求侧&#xff0c;随着数据量暴增和实时性的要求越来越高&#xff0c;数据库围绕处…...

哨兵模式(sentinel)

为什么需要哨兵模式 redis的主从复制模式能够缓解“读压力”&#xff0c;但是存在两个明显问题。 主节点发生故障&#xff0c;进行主节点切换的过程比较复杂&#xff0c;需要人工参与&#xff0c;导致故障恢复时间无法保障主节点通过主从复制模式将读压力分散出去&#xff0c…...

b站老王 自动驾驶决策规划学习记录(十二)

自动驾驶之速度规划详解&#xff1a;SL与ST迭代 上一讲&#xff1a;b站老王 自动驾驶决策规划学习记录&#xff08;十一&#xff09; 接着上一讲学习记录b站老王对自动驾驶规划系列的讲解 参考视频&#xff1a; 自动驾驶决策规划算法第二章第七节(上) 速度规划详解:SL与ST迭代…...

服务器租用机房机房的类型应该如何选择

服务器租用机房机房的类型应该如何选择 1.单电信机房 单电信服务器机房业务模式比较固定&#xff0c;访问量也不是很大&#xff0c;适合新闻类网站或政务类网站。如果网站的PV流量持续增加&#xff0c;建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题。 2.双线…...

大数据运维一些常见批量操作命令

大数据运维中&#xff0c;批量操作是一项常见的任务。在使用flume进行数据采集的过程中&#xff0c;有时会出现故障导致采集停止&#xff0c;此时积累了大量的文件。如果想要将这些文件迁移到新的目录&#xff0c;直接使用"mv"命令可能会因为文件数目过多而报错。为了…...

测试人职场生存必须避开的5个陷阱

在互联网职场的工作发展道路上&#xff0c;软件测试人员其实在公司中也面临着各种各样的职场陷阱&#xff0c;有些可能是因为项目业务不熟练造成的&#xff0c;有些可能是自身技术能力不足导致的...等等。软件测试入门相对来说比较容易些&#xff0c;但是想要在测试行业长久发展…...

力扣538 补9.18

538.把二叉搜索树转换为累加树 可以做&#xff0c;主要还是分类讨论并找规律。 当前结点如果是左节点的话&#xff0c;root.valroot.valpre.valdfs(root.right); 如果是右结点的话&#xff0c; root.valpre.val-preval-dfs(root.left); 都和前一个结点有关系&#xff0c;如…...

[Linux入门]---Linux编译器gcc/g++使用

文章目录 1.背景知识2.gcc如何完成编译运行工作预处理&#xff08;进行宏替换&#xff09;编译&#xff08;生成汇编&#xff09;汇编&#xff08;生成机器可识别代码&#xff09;链接&#xff08;生成可执行文件&#xff09; 3.函数库动态库静态库动静态库的区别 4.gcc选项 1.…...

做网站上传照片的尺寸/2020新闻大事件摘抄

在linux下输入 crontab -e 命令时&#xff0c;发现 no crontab for root - using an empty one/bin/sh: /usr/bin/vi: No such file or directorycrontab: "/usr/bin/vi" exited with status 127 后来发现是没有下载vi编辑器&#xff0c;所以需要把默认编辑器改成vim…...

wordpress能支持微信排版/小红书推广平台

在弄明白什么是重定向恢复之前&#xff0c;需要知道数据库的文件构成&#xff0c;如果您对这一块比较熟悉&#xff0c;可以直接跳到第一条分割线&#xff1a;首先&#xff0c;一个DB2数据库的文件是由两分部构成的&#xff1a;表空间容器和数据库文件&#xff0c;容器就是真正存…...

wordpress+搬瓦工迁移/网络运营推广怎么做

hello&#xff0c;大家好&#xff0c;今天为大家更新一期使用遗传算法(GA)求解旅行商问题(TSP)的推文。本次推文所编写的代码使用如下进化操作&#xff1a;1、二元锦标赛选择操作&#xff1b;2、OX交叉操作&#xff1b;3、交换、逆转和插入相结合的变异操作。一 | 旅行商(TSP)问…...

html5手机网站制作教程/九江seo公司

通常来说我们在花括号中定义的名称其作用域就在花括号中&#xff0c;但是C98的枚举类型的声明却不遵从这个规则。 enum Color {black,white,red}; auto white false; //编译出错white已经声明了 事实上&#xff0c;上面这些枚举名称都暴露到外层的作用域中了&#xff0c;官…...

做加密网站全站加密的最低成本/seo学院培训班

Linux 用户管理2 添加修改和删除用户&#xff0c;必须是超级管理员root账号才可以进行的操作&#xff0c;所以当当前账号不是超级管理员root账号时&#xff0c;首先要先切换为root账号。 如图&#xff0c;ylq为普通用户&#xff0c;执行添加用户时&#xff0c;会出现如图的错误…...

中国空间站视频/社会新闻热点事件

SetCapture函数功能&#xff1a;该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标&#xff0c;所有鼠标输入都针对该窗口&#xff0c;无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上&#xff0c;只有当…...