使用TiDB企业版Lightning导入ORC文件到TiDB

news2024/11/20 19:31:22

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/818f84f0

TiDB Lightning 是用于从静态文件导入 TB 级数据到 TiDB 集群的工具,常用于 TiDB 集群的初始化数据导入。在开源社区版本中,TiDB Lightning 支持以下文件类型的导入:

  • Dumpling 生成的文件
  • CSV 文件
  • Amazon Aurora 生成的 Apache Parquet 文件

在企业版本TiDB v7.5.1中,TiDB Lightning增加了对Hive ORC文件格式的支持,本文简要描述如何使用 Lightning 导入 ORC 文件。

准备ORC文件

首先需要准备好 ORC 文件,这可以通过从 Hive 中使用 hdfs get 命令导出,示例如下。

这里 /path/to/hdfs/orc/file.orc 是 HDFS 上的 ORC 文件路径, /local/path/to/save/file.orc 是你希望将文件保存到的本地文件系统路径。确保本地路径存在,并且你有足够的权限去写入指定的本地路径。如果本地路径不存在,命令会失败。如果你没有指定本地文件名,那么文件会保持原有的名字和扩展名。

hdfs dfs -get /path/to/hdfs/orc/file.orc /local/path/to/save/file.orc

确认ORC文件能正常解析

保证 ORC 文件是可用的,要验证 ORC 文件可用,可以使用 orc-tools 工具尝试解析。orc-tools 是一个 jar 包,可以通过 java 命令行方式来使用,主要包括两种方式:解析数据、解释元数据。

  • 解析数据
 java -jar orc-tools-1.6.3-uber.jar data orc文件名

样例输出:

[root@host-xx packages]# java -jar orc-tools-1.6.3-uber.jar data 000000_0
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Processing data file 000000_0 [length: 24442]
{"sysday":"20160102","workday":"20151231","isworkday":"0","lastday":"20160101","nextday":"20160103","lastworkday":"20151231","nextworkday":"20160104","updatetime":"2018-08-02 17:26:05.42"}
{"sysday":"20160207","workday":"20160205","isworkday":"0","lastday":"20160206","nextday":"20160208","lastworkday":"20160205","nextworkday":"20160215","updatetime":"2018-08-02 17:26:05.42"}
{"sysday":"20160214","workday":"20160205","isworkday":"0","lastday":"20160213","nextday":"20160215","lastworkday":"20160205","nextworkday":"20160215","updatetime":"2018-08-02 17:26:05.42"}
{"sysday":"20160221","workday":"20160219","isworkday":"0","lastday":"20160220","nextday":"20160222","lastworkday":"20160219","nextworkday":"20160222","updatetime":"2018-08-02 17:26:05.42"}
...
  • 解释元数据
 java -jar orc-tools-1.6.3-uber.jar meta orc文件名

样例输出:

[root@host-xx packages]# java -jar orc-tools-1.6.3-uber.jar meta 000000_0
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Processing data file 000000_0 [length: 24442]
Structure for 000000_0
File Version: 0.12 with HIVE_4243
Rows: 1224
Compression: ZLIB
Compression size: 262144
Calendar: Julian/Gregorian
Type: struct<sysday:char(8),workday:char(8),isworkday:char(1),lastday:char(8),nextday:char(8),lastworkday:char(8),nextworkday:char(8),updatetime:timestamp>

Stripe Statistics:
  Stripe 1:
    Column 0: count: 1224 hasNull: false
    Column 1: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
    Column 2: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
    Column 3: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 2448
    Column 4: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
    Column 5: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
    Column 6: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
    Column 7: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
    Column 8: count: 1224 hasNull: false min: 2018-08-02 17:26:00.799 max: 2023-10-30 09:38:56.51

File Statistics:
  Column 0: count: 1224 hasNull: false
  Column 1: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
  Column 2: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
  Column 3: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 2448
  Column 4: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
  Column 5: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
  Column 6: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
  Column 7: count: 1224 hasNull: false minChildren: 9223372036854775807 maxChildren: 0 totalChildren: 19584
  Column 8: count: 1224 hasNull: false min: 2018-08-02 17:26:00.799 max: 2023-10-30 09:38:56.51

Stripes:
  Stripe: offset: 3 data: 23605 rows: 1224 tail: 126 index: 348
    Stream: column 0 section ROW_INDEX start: 3 length 12
    Stream: column 1 section ROW_INDEX start: 15 length 45
    Stream: column 2 section ROW_INDEX start: 60 length 45
    Stream: column 3 section ROW_INDEX start: 105 length 30
    Stream: column 4 section ROW_INDEX start: 135 length 45
    Stream: column 5 section ROW_INDEX start: 180 length 45
    Stream: column 6 section ROW_INDEX start: 225 length 45
    Stream: column 7 section ROW_INDEX start: 270 length 45
    Stream: column 8 section ROW_INDEX start: 315 length 36
    Stream: column 1 section DATA start: 351 length 3454
    Stream: column 1 section LENGTH start: 3805 length 21
    Stream: column 2 section DATA start: 3826 length 3398
    Stream: column 2 section LENGTH start: 7224 length 21
    Stream: column 3 section DATA start: 7245 length 241
    Stream: column 3 section LENGTH start: 7486 length 6
    Stream: column 3 section DICTIONARY_DATA start: 7492 length 5
    Stream: column 4 section DATA start: 7497 length 3391
    Stream: column 4 section LENGTH start: 10888 length 21
    Stream: column 5 section DATA start: 10909 length 3394
    Stream: column 5 section LENGTH start: 14303 length 21
    Stream: column 6 section DATA start: 14324 length 3369
    Stream: column 6 section LENGTH start: 17693 length 21
    Stream: column 7 section DATA start: 17714 length 3362
    Stream: column 7 section LENGTH start: 21076 length 21
    Stream: column 8 section DATA start: 21097 length 1144
    Stream: column 8 section SECONDARY start: 22241 length 1715
    Encoding column 0: DIRECT
    Encoding column 1: DIRECT_V2
    Encoding column 2: DIRECT_V2
    Encoding column 3: DICTIONARY_V2[2]
    Encoding column 4: DIRECT_V2
    Encoding column 5: DIRECT_V2
    Encoding column 6: DIRECT_V2
    Encoding column 7: DIRECT_V2
    Encoding column 8: DIRECT_V2

File length: 24442 bytes
Padding length: 0 bytes
Padding ratio: 0%
________________________________________________________________________________________________________________________

当上述两条命令输出均正常无误时,可判断 ORC 文件正常被解析。笔者也碰到 ORC 文件无法被解析的情况,具体原因是因为从 Hive 导出数据时使用 hdfs getmerge 命令导出,此时生成的 ORC 文件无法被 Lightning 正常导入到 TiDB。

ORC文件重命名

使用 TiDB Lightning导入 ORC 文件与导入其他类型文件一样,需要保证 ORC 文件满足命令规则。关于文件命令规则,具体可以参考文档 TiDB Lightning 数据源

如上述表格所示,假设我们所要导入的 ORC 表名为 pdm.t06_date_info,那么我们需要将 ORC 文件重命名为 pdm.t06_date_info.orc。如果是有多个 ORC 文件,则需要命名为 pdm.t06_date_info.000.orc、pdm.t06_date_info.001.orc 等等。

编辑 Lightning.toml 配置文件

当文件名称符合导入命名规则后,将文件放置于固定的目录下,之后需要做的是准备 lightning.toml 导入配置文件。对比 CSV 格式文件的导入,ORC 文件的导入配置相对更简单,因为 ORC 文件的 delimiter、sperator 等配置通常都是固定的,不需要额外配置。以下是一个 ORC 文件的 lightning.toml 配置示例:

[lightning]
# 日志
level = "info"
file = "tidb-lightning.log"

[tikv-importer]
# 选择使用的导入模式
backend = "local"
# 设置排序的键值对的临时存放地址,目标路径需要是一个空目录
sorted-kv-dir = "/data1/ssd/sorted-kv-dir"

[mydumper]
# 源数据目录。
data-source-dir = "/data1/orc/"

[tidb]
# 目标集群的信息
host = "xx.xx.x.xx"
port = 4000
user = "xxx"
password = "xxx"
# 表架构信息在从 TiDB 的“状态端口”获取。
status-port = 10080
# 集群 pd 的地址
pd-addr = "xx.xx.x.xx:12399"

执行数据导入

执行导入的命令,与其他格式的文件导入没有不同。只不过,如果 TiDB 的版本与 Lightning 的版本不同,则可能会提示版本不匹配的错误,针对此问题,我们可以在命令中增加 -check-requirements=false 以跳过版本检查。

[root@host-xx packages]# /data1/packages/tidb-ee-toolkit-v7.5.1-0-linux-arm64/tidb-lightning -config lightning_orc.toml -check-requirements=false
Verbose debug logs will be written to tidb-lightning.log

tidb lightning exit successfully

从数据库中检查,数据已经正常导入。

后续

对于相同的数据量,ORC 文件由于是压缩的,大约是 TXT 文件的 1/3。因此在数据导入性能上,同样数据的导入性能可能也会有所差异,后续将使用同样大数据量的 ORC 和 TXT 文件进行 Lightning 导入测试,以便了解两者的导入性能差别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

疾风大模型气象,基于大模型预测未来天气的探索

引言 天气预测一直是科学领域的重要课题&#xff0c;影响着农业、航空、交通等多个行业。传统的天气预报依赖于数值天气预报&#xff08;Numerical Weather Prediction, NWP&#xff09;模型&#xff0c;这些模型基于物理定律和历史数据来模拟大气运动。然而&#xff0c;随着数…

LUCEDA IPKISS Tutorial 74:布尔运算去掉部分图层

案例分享&#xff1a;通过布尔运算&#xff0c;将版图部分图层挖空 所有代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3 import numpy as npclass grating_coupler(i3.PCell):_name_prefix "grating_coupler"r i3.Positive…

Spring Task 2024/9/30

Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定时间自动执行某个代码逻辑。 作用&#xff1a;定时自动执行某段java代码。 cron表达式 在线Cron表达式生成器 (qqe2.com)&#x1f448;在线生成网站 入门案例 SkyApplication 启动类 package com.sky;im…

对于 Vue CLI 项目如何引入Echarts以及动态获取数据

&#x1f680;个人主页&#xff1a;一颗小谷粒 &#x1f680;所属专栏&#xff1a;Web前端开发 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、数据画卷—Echarts介绍 1.1 什么是Echarts&#xff1f; 1.2 Echarts官网地址 2、Vue CLI 项目…

【LeetCode】每日一题 2024_10_1 最低票价(记忆化搜索/DP)

前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动&#xff01; 题目&#xff1a;最低票价 代码与解题思路 今天这道题是经典动态规划&#xff0c;我们定义 dfs(i) 表示从第 1 天到 第 i 天的最小花费&#xff0c;然后使用祖传的&#xff1a;从记忆…

ArduSub程序学习(11)--EKF实现逻辑⑤

状态更新和卡尔曼增益的计算我选择一个进行举例 1.SelectMagFusion SelectMagFusion 函数主要负责选择和处理磁力计&#xff08;磁传感器&#xff09;数据的融合过程。这在导航系统中尤为重要&#xff0c;因为磁力计用于提供航向&#xff08;偏航角&#xff09;的信息&#xf…

Hopcroft算法划分解释

//基于等价类的思想 split(S){foreach(character c)if(c can split s)split s into T1, ..., Tk }hopcroft()split all nodes into N, Awhile(set is still changes)split(s) 根据状态是否为终结状态划分为终结状态A&#xff0c;和非终结状态N 对这两个大集合&#xff0c;分别…

Acwing 组合计数

一个递推式&#xff1a; 从 a 个元素中选择 b 个&#xff0c;有多少种取法 C a b a ( a − 1 ) ⋯ ( a − b 1 ) 1 2 3 ⋯ b a ! b ! ( a − b ) ! C a − 1 b C a − 1 b − 1 从a个元素中选择b个&#xff0c;有多少种取法C_{a}^{b} \frac{a\times(a-1)\times\…

基础算法之双指针--Java实现(上)--LeetCode题解:移动零-复写零-快乐数-盛最多的水

这里是Thembefue 今天讲解算法中较为经典的一个算法 本讲解主要通过题目来讲解以理解算法 讲解分为三部分&#xff1a;题目解析 > 算法讲解 > 编写代码 移动零 题目链接&#xff1a; 移动零 题目解析 这题的题目意思还是比较好读懂的 就是将数组出现零的地方移到数组最后…

【SpringCloud】 统⼀服务⼊⼝-Gateway

统⼀服务⼊⼝-Gateway 1. ⽹关介绍1.1 问题1.2 什么是API⽹关1.3 常⻅⽹关实现ZuulSpring Cloud Gateway 2. 上手 1. ⽹关介绍 1.1 问题 前⾯的课程中, 我们通过Eureka, Nacos解决了服务注册, 服务发现的问题, 使⽤Spring Cloud LoadBalance解决了负载均衡的问题, 使⽤OpenFe…

使用 Seaborn 热图的 5 种方法(Python 教程)

如何计算 SHAP 特征贡献的概述 原文地址: https://mp.weixin.qq.com/s/nBb9oKlSzRW8w7widHJr6w 热图可以让你的数据变得生动。用途广泛且引人注目。在很多情况下,它们可以突出显示数据中的重要关系。具体来说,我们将讨论如何使用它们来可视化: 模型准确度的混淆矩阵时间序列…

如何从硬盘恢复丢失/删除的视频

您是否想知道是否可以恢复已删除的视频&#xff1f; 幸运的是&#xff0c;您可以使用奇客数据恢复从硬盘驱动器、SD 卡和 USB 闪存驱动器恢复已删除的视频文件。 你有没有遇到过这样的情况&#xff1a;当你随机删除文件以释放空间时&#xff0c;你不小心按下了一些重要视频的…

SysML案例-停车场

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

求职Leetcode题目(12)

1.只出现一次的数字 异或运算满足交换律 a⊕bb⊕a &#xff0c;即以上运算结果与 nums 的元素顺序无关。代码如下&#xff1a; class Solution {public int singleNumber(int[] nums) {int ans 0;for(int num:nums){ans^num;}return ans;} } 2.只出现一次的数字II 这是今天滴…

跳跃列表(Skip List)详解

什么是跳跃列表&#xff1f; 跳跃列表是一种概率性的数据结构&#xff0c;旨在提高链表的搜索、插入和删除效率。它通过在普通链表的基础上增加多个层次&#xff0c;以实现更快的访问速度。跳跃列表的设计灵感来源于跳跃图&#xff08;Skip Graph&#xff09;和多层索引的概念…

使用Materialize制作unity的贴图,Materialize的简单教程,Materialize学习日志

Materialize 官网下载地址&#xff1a;http://boundingboxsoftware.com/materialize/ github源码地址&#xff1a;https://github.com/BoundingBoxSoftware/Materialize 下载地址&#xff1a;http://boundingboxsoftware.com/materialize/getkey.php 下载后解压运行exe即可 …

带徒实训项目实战讲义分享:ApiFirst文档对比功能页面开发

亲爱的学员朋友&#xff0c;前面咱一起实现了入参列表对比的部分功能&#xff0c;本节在此基础上继续开发和重构代码&#xff0c;go&#xff01; 文章目录 已实现的功能实现API入参列表的增删对比合并参数列表杜绝内部变量暴露提取modifiedType枚举 已实现的功能 基于0.0.6和…

算术操作符/和*、while、for循环

上一次我们讲到float等浮点型的数据范围和数据类型长度&#xff0c;以及sizeof可以查看变量、表达式、数据类型的字节数即所占内存。 除法/和乘法* 我们继续用计算器这个例子来学习其他语法。先来看最初我们写成的代码&#xff1a; #include<stdio.h> int Add(int a, …

基于YOLOv4和DeepSORT的车牌识别与跟踪系统

1. 项目简介 本项目旨在开发一个基于深度学习的自动车牌识别&#xff08;Automatic License Plate Recognition, ALPR&#xff09;系统&#xff0c;以实现对车辆牌照的实时检测、识别和追踪。自动车牌识别技术广泛应用于智慧交通、停车管理、电子收费和执法监控等领域&#xf…

Golang | Leetcode Golang题解之第440题字典序的第K小数字

题目&#xff1a; 题解&#xff1a; func getSteps(cur, n int) (steps int) {first, last : cur, curfor first < n {steps min(last, n) - first 1first * 10last last*10 9}return }func findKthNumber(n, k int) int {cur : 1k--for k > 0 {steps : getSteps(cu…