热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【大数据开发】HBase高级应用之数据迁移方案及实战(四)

第五小节数据迁移 一.数据迁移方案  数据迁移,更多的场

第五小节 数据迁移


  一.数据迁移方案


    数据迁移,更多的场景是外部的数据源如何将数据写入到HBase


    1.数据库RDBMS

      1)sqoop 

      2)kettle ETL工具

      3)其他方式

        **写程序

        **导出文件加载


    2.数据文件(log)

      1)flume:实时数据收集,将数据的数据插入到HBase

source -> channel -> sink

      

     2)MapReduce

 input file -> mapreduce  -> hbase table


      3)completebulkload

input file -> mapreduce  -> hfile -> completebulkload -> hbase table



   二.数据迁移实施


     1.通过importtsv命令,将文件直接导入到HBase

export HADOOP_HOME=/opt/modules/hadoop-2.6.0-cdh5.5.0
export HBASE_HOME=/opt/modules/hbase-1.2.0
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` \
${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.2.0.jar \
importtsv -Dimporttsv.columns=HBASE_ROW_KEY,info:username,info:age,info:address \  //列簇信息
stutsv \ //HBase目标表
hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/datas/stu.tsv //hdfs源文件


*必须是HDFS路径,本地路径不可以


     2. 通过-Dimporttsv.bulk.output命令,我们可以将外部的数据文件直接生成一个HFile文件,然后通过completebulkload直接加载到HBase数据表中。

log文件 -> HFfile文件 ->HBase table表中

    

    1)第一步:

export HADOOP_HOME=/opt/modules/hadoop-2.6.0-cdh5.5.0
export HBASE_HOME=/opt/modules/hbase-1.2.0
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` \
${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.2.0.jar \
importtsv -Dimporttsv.columns=HBASE_ROW_KEY,info:username,info:age,info:address \
-Dimporttsv.bulk.output=hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/hfoutput \  //临时HFfile文件目录
stutsv \
hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/datas/stu.tsv  


    2)第二步:

export HADOOP_HOME=/opt/modules/hadoop-2.6.0-cdh5.5.0
export HBASE_HOME=/opt/modules/hbase-1.2.0
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.2.0.jar \
completebulkload \    //将临时文件加载到HBase表中
hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/hfoutput \
stutsv


    3.不同文件中数据分割符的处理

export HADOOP_HOME=/opt/modules/hadoop-2.6.0-cdh5.5.0
export HBASE_HOME=/opt/modules/hbase-1.2.0
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` \
${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.2.0.jar \
importtsv -Dimporttsv.columns=HBASE_ROW_KEY,info:username,info:age,info:address \
-Dimporttsv.bulk.output=hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/hfoutputcsv \
-Dimporttsv.separator=, \  //源端以逗号分隔
stutsv \
hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/datas/stu.csv




export HADOOP_HOME=/opt/modules/hadoop-2.6.0-cdh5.5.0
export HBASE_HOME=/opt/modules/hbase-1.2.0
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.2.0.jar \
completebulkload \
hdfs://bigdata-pro-m01.kfk.com:9000//user/kfk/hfoutputcsv \
stutsv


    4.自定义MR程序生成 HFile文件(企业常用的方案)

    

    1)第一步:

          log文件  ->  HFfile文件 

import com.kfk.hbase.HBaseConstant;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;


import java.io.IOException;


public class MRHFHBase extends Configured implements Tool {




//
//    //复杂版本,不用循环(不适用于多字段)
// public static class HFMapper extends Mapper {
//
// // rowkey username age address
// // 00001, henry, 20, city-10
//
// ImmutableBytesWritable rowkey = new ImmutableBytesWritable();
// @Override
// protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//
// String[] values = value.toString().split(",");
// rowkey.set(Bytes.toBytes(values[0]));
//
// Put put = new Put(rowkey.get());
// put.addColumn(Bytes.toBytes(HBaseConstant.HBASE_STU_CF_INFO),Bytes.toBytes("username"),Bytes.toBytes(values[1]));
// put.addColumn(Bytes.toBytes(HBaseConstant.HBASE_STU_CF_INFO),Bytes.toBytes("age"),Bytes.toBytes(values[2]));
// put.addColumn(Bytes.toBytes(HBaseConstant.HBASE_STU_CF_INFO),Bytes.toBytes("address"),Bytes.toBytes(values[3]));
//
// context.write(rowkey,put);
// }
// }




//简单版本,采用循环(适用于字段多)
public static class HFMapper extends Mapper{
// rowkey username age address
// 00001, henry, 20, city-10


ImmutableBytesWritable rowkey = new ImmutableBytesWritable();
String[] COLUMN = new String[]{"username","age","address"};


@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] values = value.toString().split(",");
rowkey.set(Bytes.toBytes(values[0]));
Put put = new Put(rowkey.get());


for(int index = 1 ; index
put.addColumn(Bytes.toBytes(HBaseConstant.HBASE_STU_CF_INFO),Bytes.toBytes(COLUMN[index]),Bytes.toBytes(values[index]));
}
context.write(rowkey,put);
}
}






//driver组装
public int run(String args[]) throws Exception{


//get configuration
Configuration cOnfiguration= this.getConf();


//create job
Job job = Job.getInstance(configuration,this.getClass().getSimpleName());
job.setJarByClass(this.getClass());


//input
Path inputpath = new Path(args[0]);
FileInputFormat.addInputPath(job,inputpath);


//map
job.setMapperClass(HFMapper.class);
job.setMapOutputKeyClass(ImmutableBytesWritable.class);
job.setMapOutputValueClass(Put.class);


//获取链接信息
TableName tableName = TableName.valueOf(HBaseConstant.HBASE_STU);
Connection cOnnection= ConnectionFactory.createConnection();
Table table = connection.getTable(tableName);
RegionLocator regiOnLocator= connection.getRegionLocator(tableName);
HFileOutputFormat2.configureIncrementalLoad(job,table,regionLocator);


//标示
boolean isSuc = job.waitForCompletion(true);
return (isSuc) ? 0 : 1 ;


}




public static void main(String[] args) {


//demo
// args = new String[]{
// "hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/datas/stu.csv", //hdfs上源文件路径
// "hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/datas/hfcsv-output" //hdfs上HF临时文件路径
// };


Configuration cOnfiguration= HBaseConfiguration.create();


try{
Path outputFilePath = new Path(args[1]);
FileSystem fileSystem = FileSystem.get(configuration);
if(fileSystem.exists(outputFilePath)){
fileSystem.delete(outputFilePath,true);
}
int status = ToolRunner.run(configuration,new MRHFHBase(),args);
System.exit(status);
}catch (Exception e){
e.printStackTrace();
}


}
}


    2)第二步:上传Jar包并执行

export HADOOP_HOME=/opt/modules/hadoop-2.6.0-cdh5.5.0
export HBASE_HOME=/opt/modules/hbase-1.2.0
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` \
${HADOOP_HOME}/bin/hadoop jar /opt/jars/student.jar hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/datas/stu.csv hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/datas/hfcsv-output1


    3)第三步:加载HBase数据

HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.2.0.jar completebulkload \
hdfs://bigdata-pro-m01.kfk.com:9000/user/kfk/datas/hfcsv-output1 \
stutsv




推荐阅读
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 在使用 MySQL 6.0.x 及以上版本的 JDBC 驱动时,若未正确配置 `serverTimezone` 参数,可能会导致连接异常。本文探讨了这一问题的原因及解决方法。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • Python 数据分析领域不仅拥有高质量的开发环境,还提供了众多功能强大的第三方库。本文将介绍六个关键步骤,帮助读者掌握 Python 数据分析的核心技能,并深入探讨六款虽不广为人知但却极具潜力的数据处理库,如 Pandas 的替代品和新兴的可视化工具,助力数据科学家和分析师提升工作效率。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 大数据领域的职业路径与角色解析
    本文将深入探讨大数据领域的各种职业和工作角色,帮助读者全面了解大数据行业的需求、市场趋势,以及从入门到高级专业人士的职业发展路径。文章还将详细介绍不同公司对大数据人才的需求,并解析各岗位的具体职责、所需技能和经验。 ... [详细]
author-avatar
木木的亦尘_283
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有