`
BlackWing
  • 浏览: 200088 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hadoop生成HFile直接入库HBase心得

阅读更多
转载请标明出处:http://blackwing.iteye.com/blog/1991380


hbase自带了ImportTsv类,可以直接把tsv格式(官方教材显示,是\t分割各个字段的文本格式)生成HFile,并且使用另外一个类org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles直接把HFile移动到hbase对应的hdfs目录。

PS:网上看到一个XD说,直接生成HFile并入库HBase效率不如先生成HFile,再通过LoadIncrementalHFiles移动文件到hbase目录高,这点没有验证,我的做法也是先生成,再move。

官方教材在此:
http://hbase.apache.org/book/ops_mgt.html#importtsv

但ImportTsv功能对我来说不适合,例如文件格式为:
topsid   uid   roler_num   typ        time
10      111111   255         0       1386553377000

ImportTsv导入的命令为:
bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,kq:topsid,kq:uid,kq:roler_num,kq:type -Dimporttsv.bulk.output=hdfs://storefile-outputdir <hdfs-data-inputdir>


它生成的表格式为:
row : 10 
cf  :  kq
qualifier: topsid
value: 10
.....

而我要求的格式是:
row : 10-111111-255
cf  :  kq
qualifier: 0
value: 1


所以还是自己写MR处理数据方便。
Mapper:
/*
 * adminOnOff.log 文件格式:
 * topsid   uid   roler_num   typ   time
 * */
public class HFileImportMapper2 extends
		Mapper<LongWritable, Text, ImmutableBytesWritable, KeyValue> {
	protected SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
	protected final String CF_KQ="kq";//考勤
	protected final int ONE=1;
	@Override
	protected void map(LongWritable key, Text value,Context context)
			throws IOException, InterruptedException {
		String line = value.toString();
		System.out.println("line : "+line);
		String[] datas = line.split("\\s+");
		// row格式为:yyyyMMdd-sid-uid-role_num-timestamp-typ
		String row = sdf.format(new Date(Long.parseLong(datas[4])))
				+ "-" + datas[0] + "-" + datas[1] + "-" + datas[2]
				+ "-" + datas[4] + "-" + datas[3];
		ImmutableBytesWritable rowkey = new ImmutableBytesWritable(
				Bytes.toBytes(row));
		KeyValue kv = new KeyValue(Bytes.toBytes(row),this.CF_KQ.getBytes(), datas[3].getBytes(),Bytes.toBytes(this.ONE));
		context.write(rowkey, kv);
		}
}


job:
public class GenHFile2 {
	public static void main(String[] args) {
		Configuration conf = new Configuration();
		conf.addResource("myConf.xml");
		String input = conf.get("input");
		String output = conf.get("output");
		String tableName = conf.get("source_table");
		System.out.println("table : "+tableName);
		HTable table;
		try {
			//运行前,删除已存在的中间输出目录
			try {
				FileSystem fs = FileSystem.get(URI.create(output), conf);
				fs.delete(new Path(output),true);
				fs.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
			table = new HTable(conf,tableName.getBytes());
			Job job = new Job(conf);
			job.setJobName("Generate HFile");
			
			job.setJarByClass(HFileImportMapper2.class);
			job.setInputFormatClass(TextInputFormat.class);
			job.setMapperClass(HFileImportMapper2.class);
			FileInputFormat.setInputPaths(job, input);
			
//job.setReducerClass(KeyValueSortReducer.class);
//job.setMapOutputKeyClass(ImmutableBytesWritable.class);
//job.setMapOutputValueClass(KeyValue.class);
			job.getConfiguration().set("mapred.mapoutput.key.class", "org.apache.hadoop.hbase.io.ImmutableBytesWritable");
			job.getConfiguration().set("mapred.mapoutput.value.class", "org.apache.hadoop.hbase.KeyValue");
			
//job.setOutputFormatClass(HFileOutputFormat.class);
FileOutputFormat.setOutputPath(job, new Path(output));
	//job.setPartitionerClass(SimpleTotalOrderPartitioner.class);
HFileOutputFormat.configureIncrementalLoad(job,table);
			try {
				job.waitForCompletion(true);
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


生成的HFile文件在hdfs的/output目录下,已经根据cf名称建好文件目录:
hdfs://namenode/output/kq/601c5029fb264dc8869a635043c24560

其中:
HFileOutputFormat.configureIncrementalLoad(job,table);

根据其源码知道,会自动为job设置好以下参数:
  public static void configureIncrementalLoad(Job job, HTable table)
  throws IOException {
    Configuration conf = job.getConfiguration();

    job.setOutputKeyClass(ImmutableBytesWritable.class);
    job.setOutputValueClass(KeyValue.class);
    job.setOutputFormatClass(HFileOutputFormat.class);

    // Based on the configured map output class, set the correct reducer to properly
    // sort the incoming values.
    // TODO it would be nice to pick one or the other of these formats.
    if (KeyValue.class.equals(job.getMapOutputValueClass())) {
      job.setReducerClass(KeyValueSortReducer.class);
    } else if (Put.class.equals(job.getMapOutputValueClass())) {
      job.setReducerClass(PutSortReducer.class);
    } else if (Text.class.equals(job.getMapOutputValueClass())) {
      job.setReducerClass(TextSortReducer.class);
    } else {
      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());
    }

    conf.setStrings("io.serializations", conf.get("io.serializations"),
        MutationSerialization.class.getName(), ResultSerialization.class.getName(),
        KeyValueSerialization.class.getName());

    // Use table's region boundaries for TOP split points.
    LOG.info("Looking up current regions for table " + Bytes.toString(table.getTableName()));
    List<ImmutableBytesWritable> startKeys = getRegionStartKeys(table);
    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +
        "to match current region count");
    job.setNumReduceTasks(startKeys.size());

    configurePartitioner(job, startKeys);
    // Set compression algorithms based on column families
    configureCompression(table, conf);
    configureBloomType(table, conf);
    configureBlockSize(table, conf);

    TableMapReduceUtil.addDependencyJars(job);
    TableMapReduceUtil.initCredentials(job);
    LOG.info("Incremental table " + Bytes.toString(table.getTableName()) + " output configured.");
  }


HFileOutputFormat只支持写单个column family,如果有多个cf,则需要写多个job来实现了。

分享到:
评论

相关推荐

    MapReduce生成HFile入库到HBase 可能需要的jar包

    MapReduce生成HFile入库到HBase 可能需要的jar包,一共有3个 可以直接放在每台机器的${HADOOP_HOME}/lib下 hadoopHadoop 1.1.2 + hbase 0.94.6.1

    hadoop mr file2hfile2hbase

    【标题】:“Hadoop MR(MapReduce)将文件转换为HFile并导入到HBase” 在大数据处理领域,Hadoop MapReduce是一种广泛使用的分布式计算框架,而HBase是基于Hadoop的数据存储系统,用于处理大规模的非结构化数据。...

    Hbase几种入库方式

    HFile 是 Hbase 的存储文件格式,预先生成 HFile 后,可以将其直接加载到 Hbase 中。这是一种高效的入库方式,尤其是在大规模数据集的情况下。预先生成 HFile 入库的优点是快捷、可靠,缺点是需要提前生成 HFile,...

    hadoop-2.7.2-hbase-jar.tar.gz

    《Hadoop 2.7.2与HBase的集成——深入理解hadoop-2.7.2-hbase-jar.tar.gz》 Hadoop是Apache软件基金会的一个开源项目,它为大规模数据处理提供了一个分布式计算框架。Hadoop的核心包括HDFS(Hadoop Distributed ...

    hadoop2.73-eclipse开发hbase所需要的所有jar包

    在Java开发环境中,Eclipse是一款广泛使用的集成开发环境(IDE),而Hadoop和HBase是大数据处理领域的重要组件。Hadoop是一个开源的分布式计算框架,主要用于处理和存储大规模数据;HBase则是建立在Hadoop之上的...

    在hadoop-3.1.2上安装hbase-2.2.1.pdf

    本文将HBase-2.2.1安装在Hadoop-3.1.2上,关于Hadoop-3.1.2的安装,请参见《基于zookeeper-3.5.5安装hadoop-3.1.2》一文。安装环境为64位CentOS-Linux 7.2版本。 本文将在HBase官方提供的quickstart.html文件的指导...

    hadoop+hbase+zookeeper集群配置流程及文件

    在大数据处理领域,Hadoop、HBase和Zookeeper是三个至关重要的组件,它们共同构建了一个高效、可扩展的数据处理和存储环境。以下是关于这些技术及其集群配置的详细知识。 首先,Hadoop是一个开源的分布式计算框架,...

    hadoop,hbase,hive版本整合兼容性最全,最详细说明【适用于任何版本】

    由于ZooKeeper是独立的分布式协调服务,并不直接依赖于Hadoop或Hive,因此HBase与ZooKeeper的兼容性主要取决于ZooKeeper的版本是否满足HBase运行的要求。用户需要查看HBase官方的部署指南,以确定推荐的ZooKeeper...

    hadoop_hadoop-2.7.2-hbase-jar.rar linux下包

    标题 "hadoop_hadoop-2.7.2-hbase-jar.rar" 提供的信息表明,这是一个与Hadoop相关的压缩文件,具体来说是Hadoop 2.7.2版本的HBase JAR文件。Hadoop是一个开源框架,主要用于分布式存储和处理大数据。而HBase是建立...

    hbase和hadoop数据块损坏处理

    HBase 和 Hadoop 数据块损坏处理 HBase 和 Hadoop 数据块损坏是非常常见的问题,可能会导致数据丢失、集群崩溃等严重后果。因此,了解如何处理 HBase 和 Hadoop 数据块损坏是非常重要的。本文将介绍 HBase 和 ...

    Docker(Hadoop-3.3.1+HBase-2.4.16+Zookeeper-3.7.1+Hive-3.1.3)配置文件

    Docker(Hadoop_3.3.1+HBase_2.4.16+Zookeeper_3.7.1+Hive_3.1.3 )配置文件 搭建集群环境

    Hadoop+HBase+Java API

    标题 "Hadoop+HBase+Java API" 涉及到三个主要的开源技术:Hadoop、HBase以及Java API,这些都是大数据处理和存储领域的关键组件。以下是对这些技术及其结合使用的详细介绍: **Hadoop** 是一个分布式计算框架,由...

    hadoop hbase 全jar包

    Hadoop和HBase是大数据处理领域中的重要组件,它们在分布式存储和实时数据访问方面扮演着关键角色。Hadoop是一个开源框架,主要用于处理和存储大量数据,而HBase是建立在Hadoop之上的非关系型数据库,提供高可靠性、...

    Hadoop集群+Zookeeper+HBase环境搭建

    在搭建Hadoop集群的过程...从规划机器、安装配置Java环境,到安装和配置Hadoop、Zookeeper、HBase,每一步都需要遵循严格的指导原则和最佳实践。搭建完成之后,还需要进行相应的测试和调优以确保系统性能达到最佳状态。

    hadoop,hive,hbase学习资料

    【标题】:“hadoop,hive,hbase学习资料”是一份综合性的学习资源,涵盖了大数据处理领域中的三个核心组件——Hadoop、Hive和Hbase。这些工具在大数据处理和分析中发挥着至关重要的作用。 【描述】:描述指出这份...

    Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase) 一、Hadoop HA高可用集群概述 在大数据处理中,高可用集群是非常重要的,Hadoop HA高可用集群可以提供高可靠性和高可用性,确保数据处理不中断。该集群由...

    Hadoop2.2+Zookeeper3.4.5+HBase0.96集群环境搭建

    Hadoop2.2+Zookeeper3.4.5+HBase0.96集群环境搭建 Hadoop2.2+Zookeeper3.4.5+HBase0.96集群环境搭建是大数据处理和存储的重要组件,本文档将指导用户从零开始搭建一个完整的Hadoop2.2+Zookeeper3.4.5+HBase0.96集群...

    Hadoop3.1.1集成hbase2.1.1

    Hadoop和HBase都是开源的分布式大数据处理框架,Hadoop主要用于大数据的存储和处理,而HBase是一个构建在Hadoop之上的分布式、可扩展、非关系型的NoSQL数据库。Hadoop和HBase的集成允许HBase使用Hadoop的文件系统...

    Hadoop,Hive,Hbase等框架详解

    该文档保护了目前比较流行的大数据平台的原理过程梳理。Hadoop,Hive,Hbase,Spark,MapReduce,Storm

    hadoop+zookeeper+hbase集群搭建配置说明

    在大数据处理领域,Hadoop、Zookeeper和HBase是三个非常关键的组件,它们共同构建了一个高效、可扩展的数据仓库集群。以下是对这三个组件及其在集群搭建中的配置说明的详细阐述。 1. Hadoop:Hadoop是Apache软件...

Global site tag (gtag.js) - Google Analytics