java实现hbase数据导出

1. HBase-client方式实现

1.1 依赖

 <!--HBase依赖坐标--><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.2.6</version></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>1.2.6</version><exclusions><!--排除依赖:不加入这句会报错--><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency>

1.2 配置及代码

1.2.1 get方式
public class HBaseService {private static final Logger logger = LoggerFactory.getLogger(HBaseService.class);/*** 配置文件读取的配置信息*/static Configuration configuration = HBaseConfiguration.create();/*** 链接信息*/private static Connection conn = null;static {try {conn = ConnectionFactory.createConnection(configuration);} catch (IOException e) {e.printStackTrace();}}/*** 进行数据的查询以及写入到文件中(通过get方式查询获得数据并写入文件)* @param rowKey rowKey信息* @param tableName 表名* @param dirName 文件目录* @param fileExist 文件是否存在的标志*/public static void addInfoToFile(String rowKey, String tableName, String dirName, boolean fileExist){Table table = null;ResultScanner result = null;try {Connection connection = ConnectionFactory.createConnection(configuration);table = connection.getTable(TableName.valueOf(tableName));List<Get> gets = new ArrayList<>();Get get = new Get(Bytes.toBytes(rowKey));gets.add(get);// result的集合Result[] resultArr = table.get(gets);Map<String, Map<String,String>> dataMap = new HashMap<>();for (Result r : resultArr) {String rowKey1 = Bytes.toString(r.getRow());Map<String, String> columnDataMap;if (dataMap.containsKey(rowKey1)){columnDataMap = dataMap.get(rowKey1);}else {columnDataMap = new HashMap<>();}for (Cell kv : r.rawCells()) {String qualifire = Bytes.toString(CellUtil.cloneQualifier(kv));String value = Base64Encoder.encode(CellUtil.cloneValue(kv));columnDataMap.put(qualifire, value);dataMap.put(rowKey1, columnDataMap);}}if (MapUtil.isNotEmpty(dataMap)){for (String r : dataMap.keySet()) {Map<String, String> columnMap = dataMap.get(r);StrBuilder lineStr = new StrBuilder();lineStr.append(r + "||");for (String s : columnMap.keySet()) {lineStr.append(s + ":" + columnMap.get(s) + "\t");}String fileName = dirName + File.separator + "data.txt";File f = new File(fileName);if (!f.exists()){try {f.createNewFile();}catch (IOException e){logger.error("创建文件失败,异常信息:{}", e.getMessage());}}BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));writer.write(lineStr.toString()  + "\n");logger.info("写入rowkey:{}的波形数据到:{}", r, fileName);writer.close();}}}catch (Exception e){logger.error("写入rowkey:{}的波形数据到:{}失败,错误的信息:{}", rowKey, dirName, e.getMessage());}}
}
1.3.1 Scan方式
   /*** 通过scan的方式进行数据获取* @param rowKey rowkey* @param startKey 开始的rowKey* @param stopKey 结束的rowKey* @param regexStr rowKey的正则匹配表达式*/public static void findRowKey(String rowKey, String startKey, String stopKey, String regexStr){Table table = null;ResultScanner result = null;try {TableName[] tbs = conn.getAdmin().listTableNames();FilterList filters = new FilterList();table = conn.getTable(TableName.valueOf("Vibration_WaveData"));Scan scan = new Scan();// 通过正则匹配的方式+rowkey进行数据过滤RegexStringComparator regexComparator = new RegexStringComparator(regexStr);RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, regexComparator);// 设置start和stop Rowkey 可以提供检索效率scan.setStartRow(startKey.getBytes());scan.setStopRow(stopKey.getBytes());scan.setFilter(rowFilter);// 每次从服务器端获取的行数scan.setCaching(100000);ResultScanner result1 = table.getScanner(scan);for (Result r : result1) {for (KeyValue kv : r.raw()) {System.out.println(String.format("row:%s, family:%s, qualifier:%s, qualifiervalue:%s, timestamp:%s.",Bytes.toString(kv.getRow()),Bytes.toString(kv.getFamily()),Bytes.toString(kv.getQualifier()),Bytes.toString(kv.getValue()),kv.getTimestamp()));}}result1.close();conn.close();}catch (Exception e){System.out.println(e.getMessage());}}

2. mapReduce实现

2.1 依赖

 <!--hadoop依赖坐标--><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.6</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-jobclient</artifactId><version>2.7.6</version></dependency><dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>1.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.6</version></dependency>

2.2 配置文件

hbase-site.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration><property><!-- 指定 hbase 是分布式的 --><name>hbase.cluster.distributed</name><value>true</value></property><property><!-- 指定 zk 的地址,多个用“,”分割 --><name>hbase.zookeeper.quorum</name><value>192.168.1.100:2181,192.168.1.102:2181</value></property><!-- 开启 uber 模式,默认关闭 --><property><name>mapreduce.job.ubertask.enable</name><value>true</value></property><!-- uber 模式中最大的 mapTask 数量,可向下修改 --><property><name>mapreduce.job.ubertask.maxmaps</name><value>9</value></property><!-- uber 模式中最大的 reduce 数量,可向下修改 --><property><name>mapreduce.job.ubertask.maxreduces</name><value>1</value></property><!-- uber 模式中最大的输入数据量,默认使用 dfs.blocksize 的值,可向下修改 --><property><name>mapreduce.job.ubertask.maxbytes</name><value></value></property>
</configuration>

2.3 导出的代码

public class ReadHbaseDataByMRToHDFS {
static Configuration configuration = HBaseConfiguration.create();/*** 进行hbase数据导出的操作* @param tableName 表名* @param dirName   文件夹名称* @param startRow  开始的row key* @param stopRow   结束的row key* @param regexStr  进行匹配的字符*/public void exportHbaseData(String tableName, String dirName, String startRow, String stopRow, String regexStr) {logger.info("开始进行HBase数据导出,tableName:{}, dirName:{}, startRow:{}, stopRow:{}, regexStr:{}", tableName, dirName, startRow, stopRow, regexStr);System.setProperty("HADOOP_USER_NAME", "root");// 一次rpc请求的超时时间,如果某次RPC请求超过该值,客户端就会主动管理Socketconfiguration.set("hbase.rpc.timeout", "600000");// ,该参数是表示HBase客户端发起一次scan操作的rpc调用至得到响应之间总的超时时间configuration.set("hbase.client.scanner.timeout.period", "600000");configuration.set("mapreduce.job.ubertask.maxmaps", "10");configuration.set("mapreduce.job.ubertask.maxreduces", "1");configuration.set("mapreduce.task.io.sort.mb", "1024");configuration.set("mapred.map.tasks", "10");try {Job job = Job.getInstance(configuration);job.setJarByClass(ReadHbaseDataByMRToHDFS.class);//设置reduce个数job.setNumReduceTasks(0);//设置mapScan scan = new Scan();
// 设置start和stop rowkey以及regex提高检索效率RegexStringComparator regexComparator = new RegexStringComparator(regexStr);scan.setStartRow(startRow.getBytes()).setStopRow(stopRow.getBytes());RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, regexComparator);scan.setFilter(rowFilter);// 每次从服务器端获取的行数scan.setCaching(900000);//参数false,关于添加依赖jarTableMapReduceUtil.initTableMapperJob(tableName,scan,ReadHBaseDataByMRToHDFSMapper.class,Text.class,NullWritable.class,job,false);//输出目录FileOutputFormat.setOutputPath(job, new Path(dirName));//提交boolean isDone = job.waitForCompletion(true);if (isDone){Thread.sleep(3000);logger.info("进行HBase数据导出成功,tableName:{}, dirName:{}, startRow:{}, stopRow:{}, regexStr:{},状态:{}", tableName, dirName, startRow, stopRow, regexStr, isDone);}} catch (Exception e) {logger.error("进行HBase数据导出时出现异常,tableName:{}, dirName:{}, startRow:{}, stopRow:{}, regexStr:{},异常信息:{}",tableName, dirName, startRow, stopRow, regexStr, e.getMessage());}}/*** 参数* ImmutableBytesWritable* Result :HBase中的数据每次取出来是一个Result:就是一个rowkey做一个result* <p>* keyOut:* valueOut:*/static class ReadHBaseDataByMRToHDFSMapper extends TableMapper<Text, NullWritable> {Text outKey = new Text();@Overrideprotected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {List<Cell> cells = value.listCells();Map<String, Map<String, String>> cellMap = new HashMap<>();//一个cell一条数据 包含一个columnfor (Cell cell : cells) {String rowkey = Bytes.toString(CellUtil.cloneRow(cell));Map<String, String> columnMap = new HashMap<>();if (cellMap.containsKey(rowkey)){columnMap = cellMap.get(rowkey);}// String family = Bytes.toString(CellUtil.cloneFamily(cell));String column = Bytes.toString(CellUtil.cloneQualifier(cell));String columnValue = Base64Encoder.encode(CellUtil.cloneValue(cell));columnMap.put(column, columnValue);cellMap.put(rowkey, columnMap);// long timeStamp = cell.getTimestamp();// outKey.set(rowkey + "\t\t" + column + "\t\t" + columnValue + "\n");}if (CollUtil.isNotEmpty(cellMap)){String lineStr = "";for (String s : cellMap.keySet()) {Map<String, String> columnMap = cellMap.get(s);lineStr = s + "||";for (String c : columnMap.keySet()) {lineStr += c + ":" + columnMap.get(c) + "\t";}}outKey.set(lineStr);context.write(outKey, NullWritable.get());outKey.clear();}}}
}

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

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

相关文章

CVE-2021-44228 Apache log4j 远程命令执行漏洞

一、漏洞原理 log4j(log for java)是由Java编写的可靠、灵活的日志框架&#xff0c;是Apache旗下的一个开源项目&#xff0c;使用Log4j&#xff0c;我们更加方便的记录了日志信息&#xff0c;它不但能控制日志输出的目的地&#xff0c;也能控制日志输出的内容格式&#xff1b;…

CSDN学院 < 华为战略方法论进阶课 > 正式上线!

目录 你将收获 适用人群 课程内容 内容目录 CSDN学院 作者简介 你将收获 提升职场技能提升战略规划的能力实现多元化发展综合能力进阶 适用人群 主要适合公司中高层、创业者、产品经理、咨询顾问&#xff0c;以及致力于改变现状的学员。 课程内容 本期课程主要介绍华为…

不同网段的IP怎么互通

最近在整理工作的时候发现一个不同网段无法互通的问题&#xff0c;就是我们大家熟知的一级路由和二级路由无法互通的问题。由于需要记录整个过程的完整性&#xff0c;这里也需要详细记录下整个过程&#xff0c;明白的人不用看&#xff0c;可以直接跳过&#xff0c;到解决方法去…

GSCoolink GSV6182 带嵌入式MCU的MIPI D-PHY转HDMI 2.0

Gscoolink GSV6182是一款高性能、低功耗的MIPI D-PHY到HDMI 2.0转换器。通过集成基于RISC-V的增强型微控制器&#xff0c;GSV6182创造了一种具有成本效益的解决方案&#xff0c;提供了上市时间优势。MIPI D-PHY接收器支持CSI-2版本1.3和DSI版本1.3&#xff0c;每条通道最高可达…

网络建设 之 React数据管理

React作为一个用于构建用户界面的JavaScript库&#xff0c;很多人认为React仅仅只是一个UI 库&#xff0c;而不是一个前端框架&#xff0c;因为它在数据管理上是缺失的。在做一个小项目的时候&#xff0c;维护的数据量不多&#xff0c;管理/维护数据用useState/useRef就足够了&…

Windows 和 Linux 这2个系统在进行编程实现的时候的一些区别:

很惭愧&#xff0c;学了很多年才意识到&#xff0c;噢&#xff0c;原来这两个系统实现一些功能的时候会使用到不同的库&#xff0c;使用不同的函数。 那么&#xff0c;也会延伸出一些问题&#xff1a; 比如&#xff0c;如何实现版本的迁移。一个在Linux上运行的代码如何可以比…

C#WPF嵌入字体实例

本文介绍C#WPF嵌入字体实例。 首先创建项目 添加Resources文件夹,添加字体文件,字体文件属性:生成操作为Resources,复制到输出目录:不复制 字体的使用可以采用以下两种方法: 方式一 直接引用 FontFamily="./Resources/#幼圆" 方式二 定义资源 <Applica…

【面试经典150 | 栈】简化路径

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;字符串数组模拟栈 其他语言python3 写在最后 Tag 【栈】【字符串】 题目来源 71. 简化路径 题目解读 将 Unix 风格的绝对路径转化成更加简洁的规范路径。字符串中会出现 字母、数字、/、_、. 和 .. 这几种字符&#…

阿里云企业邮箱基于Spring Boot快速实现发送邮件功能

邮件在项目中经常会被用到&#xff0c;比如用邮件发送通知。比如&#xff0c;通过邮件注册、认证、找回密码、系统报警通知、报表信息等。本篇文章带大家通过SpringBoot快速实现一个发送邮件的功能。 邮件协议 下面先简单了解一下常见的邮件协议。常用的电子邮件协议有SMTP、…

基于springboot,vue学生宿舍管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vuevue-element-admin 服务端技术&#xff1a;springboot,mybatis…

express session JWT JSON Web Token

了解 Session 认证的局限性 Session 认证机制需要配合 cookie 才能实现。由于 Cookie 默认不支持跨域访问&#xff0c;所以&#xff0c;当涉及到前端跨域请求后端接口的时候&#xff0c;需要做很多额外的配置&#xff0c;才能实现跨域 Session 认证。 注意&#xff1a; 当前端…

层次式架构的设计理论与实践

层次式架构的设计理论与实践 层次式架构概述 层次式架构的定义和特性 定义 特性 层次式架构的一般组成(表现层、中间层、数据访问层和数据层) 表现层框架设计 设计模式 MVC MVP MVVM XML技术 UIP设计思想 表现层动态生成设计思想(基于XML界面管理技术) 中间层架构设计 业务…

macOS 12 Monterey v12.7.1正式版:开启全新的操作系统体验

macOS 12 Monterey已经向所有兼容的Mac设备推出&#xff0c;为您带来了一系列强大的新功能和改进。这个全新的操作系统版本&#xff0c;不仅带来了更流畅的用户体验&#xff0c;还增强了与iOS设备的无缝集成&#xff0c;让您的设备使用更加高效&#xff0c;更加便捷。 macOS 1…

NVM 安装及使用

1.安装 我使用的是解压版&#xff0c;免安装 github下载压缩包 下载后放在一个【没有中文】的文件夹下&#xff0c;解压 然后需要配环境变量&#xff0c; 首先添加两个变量&#xff0c;分别是刚刚nvm解压的路径&#xff0c;和当前node安装的路径。 然后编辑path变量&#x…

牛客网刷题-(5)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

贝锐花生壳内网穿透推出全新功能,远程业务连接更安全

贝锐旗下内网穿透兼动态域名解析品牌花生壳目前推出了全新的“访问控制”功能&#xff0c;可精确设置访问权限&#xff0c;充分保障信息安全&#xff0c;满足更多用户安全远程访问内网服务的需求。 通过这一功能&#xff0c;可实现指定时间、IP、地区等条件下才能远程访问映射的…

算法通过村第十六关-滑动窗口|黄金笔记|结合堆的应用

文章目录 前言堆与滑动窗口结合的问题总结 前言 提示&#xff1a;不论记忆多么痛苦&#xff0c;它属于过去&#xff0c;已经逝去了&#xff0c;我们为什么还执着于它并让它代表我们&#xff1f;我们就这样&#xff0c;所以&#xff0c;我们受苦。 --丹津葩默 这个还是一个比较重…

进程/线程/PCB

进程&#xff1a;正在运行中的程序&#xff08;进程是驻留在内存中的&#xff09; 是系统执行资源分配和调度的独立单位每一个进程都有属于自己的存储空间和系统资源注意&#xff1a;进程A 和 进程B 的内存独立不共享 使用jdk自带的工具&#xff0c;jconsole查看当前Java进程中…

CentOS 编译安装 nginx

CentOS 编译安装 nginx 修改 yum 源地址为 阿里云 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum makecache升级内核和软件 yum -y update安装常用软件和依赖 yum -y install gcc gcc-c make cmake zlib zlib-devel openss…

IntelliJ IDEA 常用快捷键-个人查阅

Ctrl快捷键 介绍 Ctrl F 在当前文件进行文本查找 &#xff08;必备&#xff09; Ctrl R 在当前文件进行文本替换 &#xff08;必备&#xff09; Ctrl Z 撤销 &#xff08;必备&#xff09; Ctrl Y 删除光标所在行 或 删除选中的行 &#xff08;必备&#x…