IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 记一次 mapreduce 加载HFile文件到HBase中 -> 正文阅读

[大数据]记一次 mapreduce 加载HFile文件到HBase中

code:

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.Path
import org.apache.hadoop.hbase.{HBaseConfiguration, KeyValue, TableName}
import org.apache.hadoop.hbase.client.{Admin, HTable, Table}
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapred.TableOutputFormat
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2
import org.apache.hadoop.hbase.tool.LoadIncrementalHFiles
import org.apache.hadoop.mapreduce.Job
import org.apache.hadoop.util.ThreadUtil.getResourceAsStream

import java.util.Properties


class BulkLoadDataToHBase {

}

object BulkLoadDataToHBase {


	def main(args: Array[String]): Unit = {
		System.setProperty("user.name", "hdfs")
		val properties = new Properties
		properties.load(getResourceAsStream("conf.properties"))


		val hBaseConf: Configuration = HBaseConfiguration.create()
		// 不是必须的,只需要hbase的连接信息基本上就足够了
		hBaseConf.addResource("hbase-site.xml")
		hBaseConf.addResource("core-site.xml")
		hBaseConf.addResource("yarn-site.xml")
		//对map输出的内容进行压缩
		hBaseConf.set("mapred.compress.map.output", "true")
		hBaseConf.set("mapred.map.output.compression.codec", "org.apache.hadoop.io.compress.SnappyCodec")

		//对reduce输出的内容进行压缩
		hBaseConf.set("mapred.output.compress", "true")
		hBaseConf.set("mapred.output.compression", "org.apache.hadoop.io.compress.SnappyCodec")
		hBaseConf.set("hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily", "128")
		//		val outTableName = "test_drive_event"
		val outTableName: String = args(1)
		hBaseConf.set(TableOutputFormat.OUTPUT_TABLE, outTableName)
		import org.apache.hadoop.hbase.client.Connection
		import org.apache.hadoop.hbase.client.ConnectionFactory
		val conn: Connection = ConnectionFactory.createConnection(hBaseConf)
		val admin: Admin = conn.getAdmin
		val outTable: Table = conn.getTable(TableName.valueOf(outTableName))
		val job: Job = Job.getInstance(hBaseConf)
		job.setMapOutputKeyClass(classOf[ImmutableBytesWritable])
		job.setMapOutputValueClass(classOf[KeyValue])
		HFileOutputFormat2.configureIncrementalLoad(job, outTable, conn.getRegionLocator(TableName.valueOf(outTableName)))

		//Bulk load Hfiles to Hbase
		val bulkLoader = new LoadIncrementalHFiles(hBaseConf)
		bulkLoader.doBulkLoad(new Path(args(0)), admin, outTable, conn.getRegionLocator(TableName.valueOf(outTableName)))
	}
}

编译打包后放到服务器上用java -classpath XXX.jar XXX.BulkLoadDataToHBase /path outPutTabel

运行程序前需要先在HBase中建好表

create  'tmp_v1',  {NAME => 'T', DATA_BLOCK_ENCODING => 'FAST_DIFF', COMPRESSION => 'SNAPPY', METADATA => {'DISABLE_WAL' => 'true',  'IMMUTABLE_ROWS' => 'true'}}

此时运行会出现报错

CorruptHFileException: Problem reading HFile Trailer from file XXXXXXXX/XXXXXXX/
        at org.apache.hadoop.hbase.io.hfile.HFile.pickReaderVersion(HFile.java:495)
        at org.apache.hadoop.hbase.io.hfile.HFile.createReader(HFile.java:538)
        at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles.groupOrSplit(LoadIncrementalHFiles.java:661)
        at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$3.call(LoadIncrementalHFiles.java:574)
        at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$3.call(LoadIncrementalHFiles.java:571)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        ... 3 more
Caused by: java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
        at org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy(Native Method)
        at org.apache.hadoop.io.compress.SnappyCodec.checkNativeCodeLoaded(SnappyCodec.java:63)
        at org.apache.hadoop.io.compress.SnappyCodec.getDecompressorType(SnappyCodec.java:195)
        at org.apache.hadoop.io.compress.CodecPool.getDecompressor(CodecPool.java:181)
        at org.apache.hadoop.hbase.io.compress.Compression$Algorithm.getDecompressor(Compression.java:328)
        at org.apache.hadoop.hbase.io.compress.Compression.decompress(Compression.java:423)
        at org.apache.hadoop.hbase.io.encoding.HFileBlockDefaultDecodingContext.prepareDecoding(HFileBlockDefaultDecodingContext.java:90)
        at org.apache.hadoop.hbase.io.hfile.HFileBlock.unpack(HFileBlock.java:549)
        at org.apache.hadoop.hbase.io.hfile.HFileBlock$AbstractFSReader$1.nextBlock(HFileBlock.java:1380)
        at org.apache.hadoop.hbase.io.hfile.HFileBlock$AbstractFSReader$1.nextBlockWithBlockType(HFileBlock.java:1386)
        at org.apache.hadoop.hbase.io.hfile.HFileReaderV2.<init>(HFileReaderV2.java:150)
        at org.apache.hadoop.hbase.io.hfile.HFile.pickReaderVersion(HFile.java:483)
        ... 8 more

Caused by: java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z

错误原因是程序运行时无法找到libsnappy.so.*相关的文件,检查了一遍程序中打包的依赖,发现可以找到对应的类
在这里插入图片描述
在google上搜索了后发现,有人建议在运行jar时添加-Djava.library.path=/XXX/hadoop/native/选项后,解决了问题。

于是在服务器上用
find / -name native后找到/opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/lib/hadoop/lib/native这个路径,修改运行命令,添加 -Djava.library.path=/XXX/hadoop/native/选项后执行,发现数据成功被加载到HBase中

 sudo -u hdfs /usr/java/jdk1.8.0_181-cloudera/bin/java \
 -Djava.library.path=/opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/lib/hadoop/lib/native \
 -classpath /XXX.jar com.XXX.BulkLoadDataToHBase hdfs://172.168.100.171:8020/distcp_dir/test_d046b9c64abfbb9c67b16e97d0a28d20 tmp_v1

java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String;
期间还遇到了这个异常,异常原因是打包后的程序内存在重复的slf4j包,删除低版本的保留高版本的jar包后,可解决该问题。

在这里插入图片描述
我这里是多了这两个

六月 30, 2022 3:15:59 下午 org.apache.zookeeper.ClientCnxn$SendThread logStartConnect
信息: Opening socket connection to server bd.vn0038.jmrh.com/172.168.100.171:2181. Will not attempt to authenticate using SASL (unknown error)
六月 30, 2022 3:15:59 下午 org.apache.zookeeper.ClientCnxn$SendThread run
警告: Session 0x0 for server bd.vn0038.jmrh.com/172.168.100.171:2181, unexpected error, closing socket connection and attempting reconnect
java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String;
        at org.slf4j.impl.JDK14LoggerAdapter.info(JDK14LoggerAdapter.java:326)
        at org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:962)
        at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:352)
        at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1224)

参考资料:
using snappy and other compressions with Nifi hdfs components
https://community.cloudera.com/t5/Community-Articles/using-snappy-and-other-compressions-with-Nifi-hdfs/ta-p/248341

使用 Snappy 文件源运行映射时,Informatica DEI 中出现错误:“java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z”
https://knowledge.informatica.com/s/article/498636?language=en_US

HBase排查|HBase Bulkload失败问题排查改进
https://www.modb.pro/db/57374

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:59:49  更:2022-07-04 23:00:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 17:46:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码