HBase数据大批量导入方式总结和对比

ARM平台安装HBASE数据库 /*HBase是一个分布式的、面向列的开源数据库。在上一篇文章中我在ARM板集群上搭建了Hadoop环境,现在继续在此基础上安装HBASE数据库。基本软件环境和硬件配置也请参考上面那篇文章。*/1. 下载安装包去到HBASE官网https://hbase.apache.org/downloads.html下载一个合适的HBASE版本,注意下载bin版本而不是src版本。将安装包下载到Master上... 阅读详情

HBase数据导入

1. 背景

  1. 在实际生产中,海量数据一般都不是直接存储在HBase中,这时候就需要一个数据导入到HBase的步骤
  2. 上一篇博客讲述了可以通过java api的方式或者shell 客户端方式导入或者创建数据,但这对于实际生产中海量数据导入来说,速度和效率都太慢了,所以我们需要使用其他方式来解决海量输入导入到HBase的问题
  3. 利用HBase底层文件是HFile形式存储再HDFS中,所以如果能够直接生成HFile的话,这时候再让HBase从HFile中读取数据,就会快很多。

2. 批量数据导入方式

  1. shell 脚本命令,使用工具将HFile直接导入到HBase中
  2. 编写mapreduce程序,生成Hfile。然后再使用上shell方式,将HFile文件导入到HBase中
  3. 编写mapreduce程序,直接将文件中数据写入到Hbase中
  4. 将数据从HBase中一个地方(namespace、table)导入到HBase另外一个地方(namespace、table)

3.数据导入步骤

3.1 shell 脚本命令,使用工具将HFile直接导入到HBase中

3.1.1 将csv文件转为HFile
  1. 数据准备(数据形式需要是csv格式的数据)
    在这里插入图片描述
    在windows或者linux节点服务器上准备好,然后通过hdfs dfs -put指令上传到hdfs文件系统中。这里选择在linux系统上创建,可以省去在windows上创建后还要再从windows上传到linux节点服务器的步骤
    文件名这里是:bulkload.csv
1,lenovo,black,3000,intel
2,lenovo,black,43000,intel
3,xiaomi,black,3500,amd
4,lenovo,black,3000,amd
5,huawei,black,3000,amd
6,xiaomi,black,3000,arm
7,xiaomi,black,3000,arm
8,lenovo,black,6000,arm
9,huawei,black,5000,intel
10,huawei,black,3000,intel
11,huawei,black,7000,intel
12,huawei,black,3000,intel
13,hp,black,3000,amd
14,dell,black,3000,amd
15,huawei,black,3000,amd
16,apple,silver,544000,arm
17,mechanic,black,3000,arm
18,mechnic,black,3000,amd
19,hasee,black,12000,amd
20,hasee,black,23000,amd
21,hp,black,3000,intel
22,acer,black,3000,intel
23,acer,black,33000,intel
24,dell,black,30040,intel
25,dell,black,3000,intel
26,huawei,white,3000,amd
27,founder,blue,30060,intel
28,huawei,pink,3000,intel
29,huawei,black,30300,intel
30,huawei,black,3000,arm
31,huawei,black,33000,arm
32,lenovo,black,30200,arm
33,huawei,black,33000,intel
34,lenovo,black,3000,intel
35,huawei,black,30500,intel
36,lenovo,black,3000,intel
  1. 在hdfs上创建输入文件的文件夹
hdfs dfs -mkdir -p /csv/input
  1. 将linux节点服务器上的csv文件上传到hdfs的输入文件文件夹中
hdfs dfs -put bulkload.csv /csv/input

-- 上传之后,输入以下shell命令查看文件
hdfs dfs -ls /csv/input

文件上传后,查看上传结果
在这里插入图片描述
4. 在hdfs集群节点服务器上执行以下shell命令

  • 指定的shell命令
hbase  org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.separator=, \
-Dimporttsv.columns='HBASE_ROW_KEY,cf1:brand,cf1:color,cf1:price,cf2:cpu_brand'  \
-Dimporttsv.bulk.output=/csv/output \
doit:tb_computer_info \
/csv/input

# org.apache.hadoop.hbase.mapreduce.ImportTsv这个是进行导入数据的工具类的类型,类似于javca执行一个jar包时,需要指定一个main方法的类的全类名
# Dimporttsv.separator=, 这里是csv文件的分割符号,csv文件按照百度百科标准,一般都是以逗号进行分割,但实际可以使用其他分隔符号
#  Dimporttsv.columns='HBASE_ROW_KEY,cf1:brand,cf1:color,cf1:price,cf2:cpu_brand' 这里就是将csv文件中一行数据的每个字段对应在hbase的表中的字段进行指定,使用逗号隔开,例如第一个就是HBASE_ROW_KEY,第二个就是cf1:brand(就是列族cf1下的brand字段)
# doit:tb_computer_info这是hbase中的哪个表,如果需要指定namespace,前面加上namespace名再加上冒号。不指定就默认是default这个namespace中的表。注意这个表需在执行shell命令前建立好
# /csv/input这个是输入数据源路径
# -Dimporttsv.bulk.output=/csv/output  这个是输出数据源路径
# \ 反斜杠是因为shell命令一行太长,使用反斜杠进行分割 

  • Dimporttsv的参数说明

-Dimporttsv.skip.bad.lines=false - 若遇到无效行则失败
-Dimporttsv.separator=, - 使用特定分隔符,默认是tab也就是\t
-Dimporttsv.timestamp=currentTimeAsLong - 使用导入时的时间戳
-Dimporttsv.mapper.class=my.Mapper - 使用用户自定义Mapper类替换TsvImporterMapper
-Dmapreduce.job.name=jobName - 对导入使用特定mapreduce作业名
-Dcreate.table=no - 避免创建表,注:如设为为no,目标表必须存在于HBase中
-Dno.strict=true - 忽略HBase表列族检查。默认为false
-Dimporttsv.bulk.output=/user/yarn/output 作业的输出目录

  • 输入指令后,开始执行,按下enter键执行
    在这里插入图片描述
  • 执行过程日志,可以看出其实就是执行了一个mapreduce的程序
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 查看输出的文件
    注意这里按照列族数量,生成了2个文件夹,和hbase存储在hdfs中的文件规则是一致的。
    在这里插入图片描述
    注意点击进去cf1文件夹查看,可以看到有一个文件,这就是生成的hfile文件
    在这里插入图片描述
3.1.2 将HFile导入到HBase中
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /csv/output  doit:tb_computer_info
  • 输入指令后,可以看到如下日志,可以看出这时候就是HBase内部的程序,而不是mapreduce
    在这里插入图片描述
  • 查看hbase中对应表格中数据
    在这里插入图片描述

3.2 使用mapreduce方式导入hbase

3.2.1 环境准备
  1. pom文件
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
<dependencies>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-auth</artifactId>
    <version>3.2.1</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.2.5</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.2.1</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>3.2.1</version>
</dependency>

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-server</artifactId>
    <version>2.2.5</version>
</dependency>

<!-- 使用mr程序操作hbase 数据的导入 -->
<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-mapreduce</artifactId>
    <version>2.2.5</version>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

<!-- phoenix 凤凰 用来整合Hbase的工具 -->
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-core</artifactId>
    <version>5.0.0-HBase-2.0</version>
</dependency>

</dependencies>

<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

</plugins>
</build>
  1. 集群环境准备
  • hdfs集群 hdfs
  • zookeeper集群 zk
  • hbase集群 hbase
    注意,需要都启动,启动顺序,先启动hdfs,然后是zookeeper,然后是hbase
  1. windows10,安装好 idea 2020版本和jdk 1.8 JDK8
  2. maven环境 maven
  3. 数据准备, 这里手动制造一些json数据,一行一行存放。
{"movie":"2294","rate":"4","timeStamp":"978824291","uid":"1"}
{"movie":"3186","rate":"4","timeStamp":"978300019","uid":"1"}
{"movie":"1566","rate":"a","timeStamp":"978824330","uid":"1"}
{"movie":"588","rate":"4","timeStamp":"978824268","uid":"1"}
{"movie":"1907","rate":"4","timeStamp":"978824330","uid":"1"}
{"movie":"783","rate":"4","timeStamp":"978824291","uid":"1"}
{"movie":"1836","rate":"5","timeStamp":"978300172","uid":"1"}
{"movie":"1022","rate":"5","timeStamp":"978300055","uid":"1"}
{"movie":"2762","rate":"4","timeStamp":"978302091","uid":"1"}
{"movie":"150","rate":"5","timeStamp":"978301777","uid":"1"}
3.2.2 数据导入思路
  1. 从外部导入数据到HBase中,由于HBase本身不支持多维度的数据查询,所以需要进行HBase表数据字段和结构设计
  2. 外部数据可能有错误或者缺失信息,需要考虑如何处理(数据预处理或者在mapreduce中处理都可以)
  3. rowkey设计
  • 这里假定业务场景是根据movie id进行数据查询,所以rowkey的设计需要把movie id放进去,
  • 同时movie id长度不一,这时候采取补位处理,让所有movie id的长度一致。考虑到不损失其原本含义,采用前面补0,否则后面补0会损失id的原本含义。
  • 看数据,如果采用movie id作为rowkey,则数据会发生覆盖,这时候如果把rate、时间戳、uid作为后缀加进去。uid和rate会有重复,但时间戳没有,所以选择时间戳作为后缀来确保rowkey的唯一性。这样一条数据对应hbase中一条数据,不会发生数据覆盖问题。
  1. 数据分区考虑,注意这里的数据(手动造了100万条左右),数据量比较大,为了合理存放这些数据,也就是相对均匀划分到不同region server上,同时确保相关数据尽可能在一起。可以考虑在设计好的rowkey基础上,看是否做分区处理。如果需要,可以执行SPLITS设置。本文这里暂不演示
3.2.3 代码实现
  1. 因为数据是json格式,所以需要有一个java bean存放数据。这个java bean会参与mapreduce过程,所以需要遵守writable协议
  2. map过程就是把一行一行文本转换为一个一个的java bean,注意这里的rowkey需要
  3. reduce就是把map阶段产生的key、value进行输出,写入到hdfs的文件中或者直接写入hbase中
  • mapper
class HBaseDataImportMapper extends Mapper<LongWritable, Text, Text, MovieBean> {
    // 数据解析使用GSON
    Gson gson = new Gson();
    Text rowkeyText = new Text();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        try{
            // 读取一行一行的数据
            String line = value.toString();

            // 使用GSON进行解析
            MovieBean movieBean = gson.fromJson(line, MovieBean.class);

            // 拼接处理rowkey
            String movie = movieBean.getMovie();
            String timeStamp = movieBean.getTimeStamp();
            String rowkey = StringUtils.leftPad(movie, 5, '0') + "_" + timeStamp;

            // 这里复用Text对象
            rowkeyText.set(rowkey);

            // 输出
            context.write(rowkeyText, movieBean);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • reducer
class HBaseDataImportReducer extends TableReducer<Text, MovieBean, ImmutableBytesWritable> {
    @Override
    protected void reduce(Text key, Iterable<MovieBean> values, Context context) throws IOException, InterruptedException {

        try {
            String rowkey = key.toString();

            for (MovieBean value : values) {

                // 获取java bean中的属性
                String movie = value.getMovie();
                double rate = value.getRate();
                String timeStamp = value.getTimeStamp();
                String uid = value.getUid();

                // 构建一个HBase数据操作的Put对象
                // 传入rowkey,这是一行的rowkey
                Put put = new Put(Bytes.toBytes(rowkey));
                // 设置列族、字段等信息
                put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("movie"), Bytes.toBytes(movie));
                put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("rate"), Bytes.toBytes(rate));
                put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("timeStamp"), Bytes.toBytes(timeStamp));
                put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("uid"), Bytes.toBytes(uid));

                // 输出
                context.write(null, put);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • driver
public static void main(String[] args) {
        // 获取HBaseConfiguration对象,这个本身就是继承自hadoop的Configuration 类
        Configuration conf = HBaseConfiguration.create();
        // 设置hbase的zookeeper入口(hbase的元数据服务器节点位置等信息是保存在zookeeper上的)
        conf.set("hbase.zookeeper.quorum", "linux100:2181,linux101:2181,linux102:2181");

        try {
            // 创建一个job对象,代表一个完整的mapreduce程序
            Job job = Job.getInstance(conf);

            // 设置mapper类
            job.setMapperClass(HBaseDataImportMapper.class);

            // 设置map阶段输出的key value类
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(MovieBean.class);

            // 设置输入数据源
            FileInputFormat.setInputPaths(job, new Path("E:\\movie\\input"));

            // 这里设置reducer的类、需要导出的hbase表名,"doit:movie"中doit是namespace,movie是表名
            TableMapReduceUtil.initTableReducerJob("doit:movie", HBaseDataImportReducer.class, job);

            boolean b = job.waitForCompletion(true);

            if(b) {
                System.out.println("成功了");
            } else {
                System.out.println("失败了");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述

  • java bean
public class MovieBean implements Writable {
    // {"movie":"2294","rate":"4","timeStamp":"978824291","uid":"1"}
    private String movie;
    private double rate;
    private String timeStamp;
    private String uid;

    @Override
    public String toString() {
        return "MovieBean{" +
                "movie='" + movie + '\'' +
                ", rate=" + rate +
                ", timeStamp='" + timeStamp + '\'' +
                ", uid='" + uid + '\'' +
                '}';
    }

    public String getMovie() {
        return movie;
    }

    public void setMovie(String movie) {
        this.movie = movie;
    }

    public double getRate() {
        return rate;
    }

    public void setRate(double rate) {
        this.rate = rate;
    }

    public String getTimeStamp() {
        return timeStamp;
    }

    public void setTimeStamp(String timeStamp) {
        this.timeStamp = timeStamp;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    /**
     * private String movie;
     *     private double rate;
     *     private String timeStamp;
     *     private String uid;
     *
     *     注意这里的读写字段的顺序需要一致
     * */
    @Override
    public void write(DataOutput out) throws IOException {
        out.writeUTF(movie);
        out.writeDouble(rate);
        out.writeUTF(timeStamp);
        out.writeUTF(uid);
    }

    @Override
    public void readFields(DataInput in) throws IOException {
        movie = in.readUTF();
        rate = in.readDouble();
        timeStamp = in.readUTF();
        uid = in.readUTF();
    }
}

导入后,去hbase查看,进入hbase shell ,使用count指令查看。百万条数据
在这里插入图片描述

3.3从hbase中将数据导入另一个hbase表格中

3.1环境准备

  1. 准备好hbase中对应的表user,列族是f,字段是name和gender
  2. 准备好一张空表user2,列族是f

3.2 java代码

  1. driver类
public class HBaseTransferFromHBase {
    public static void main(String[] args) {
        // 获取整合的初始化对象
        Configuration conf = HBaseConfiguration.create();

        // 连接zookeeper集群的的位置,给多个集群节点地址,这样就算一个无法连接,还可以连接其他zookeeper集群的节点
        conf.set("hbase.zookeeper.quorum", "linux100:2181,linux101:2181,linux102:2181");

        // 获取job对象
        Job job = null;
        try {
            job = Job.getInstance(conf);

            // 创建扫描对象用来扫描源hbase中的所有的数据
            Scan scan = new Scan();

            // 接收的扫描的数据的行数
            scan.setCaching(200);
            scan.setCacheBlocks(false);
            job.setJarByClass(HBaseTransferFromHBase.class);

            // 初始化  源表,这里没有写namespace,默认就是defaul表格中
            TableMapReduceUtil.initTableMapperJob("user", scan, HBaseTransferFromHBaseMapper.class, Text.class, Text.class, job);

            // 插入数据的表要存在
            TableMapReduceUtil.initTableReducerJob("user2", HBaseTransferFromHBaseReducer.class, job);

            boolean b = job.waitForCompletion(true);
            if (b){
                System.out.println("ok");
            } else {
                System.out.println("not ok");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. mapper类
class HBaseTransferFromHBaseMapper extends TableMapper<Text, Text> {

    // 参数一是 rowkey 参数二是结果  参数三是输出的key  参数四是 输出的value
    @Override
    protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
        // 获取字符串的 rowkey
        String k = new Text(new String(key.copyBytes())).toString();

        // 获取指定的属性的值
        String name = Bytes.toString(value.getValue("f".getBytes(), "name".getBytes()));
        String gender = Bytes.toString(value.getValue("f".getBytes(), "gender".getBytes()));
        System.out.println(k + "  " + name);

        // 以行键为key 以多个属性组装的结果为value传递 到reduce中
        context.write(new Text(k), new Text(name + ":" + gender));
    }
}
  1. reducer类
class HBaseTransferFromHBaseReducer extends TableReducer<Text, Text, ImmutableBytesWritable> {
    @Override
    protected void reduce(Text key, Iterable<Text> iters,
                          Reducer<Text, Text, ImmutableBytesWritable, Mutation>.Context context)
            throws IOException, InterruptedException {
        //创建put对象
        Put put = new Put(key.getBytes());

        // 获取接收的map的value值
        Text next = iters.iterator().next();

        // 将value转换成字符串
        String v = next.toString();

        //处理字符串获取 各个属性的值
        String[] split = v.split(":");
        String name = split[0];
        String gender = split[1];

        // 将各个属性的值添加到对应的列中
        put.addColumn("f".getBytes(), "name".getBytes(), Bytes.toBytes(name));
        put.addColumn("f".getBytes(), "gender".getBytes(), Bytes.toBytes(gender));

        // 将put对象写出去
        context.write(null, put);
    }
}
  1. 运行结束后,如下图所示,hbase的shell客户端中执行scan 扫描如下,确实完整导入了。如果需要更多限制,可以限制指定范围内的row才导入,这里就不做演示。可以自行尝试
    在这里插入图片描述
Hive数据导入到HBase Hive数据导入到HBase 1. 背景 作为一个数据处理框架,hive本身并不计算和存储数据,计算引擎一般是mapreduce,tez,spark,数据存储则是在hdfs中,元数据一般在mysql中。 hive将数据计算处理之后,如果数据结果需要对外提供并且有秒或亚秒级别的访问速度,并且跟hadoop生态有较好的兼容性,则hbase是一个很好的选择。当然实际上只是数据存储,mysql,elasticsearch,clickhouse都可以胜任亚秒级别的数据访问性能。 当业务需要,将hive数据导入hba 阅读详情

相关推荐

Hive数据导入HBase

在Hive创建数据保存在HBase的表方式,这种方法的特点是简单,但是数据量超过千万以后 ,数据偏移现象比较明显,效率不高 在定义Hive的UDF,将数据写入HBase,如果提前将HBase表的regen分好,这种直接put的方法效率还行 直接用MapReduce生成Hfile,然后导入HBase,这种方法的特点是程序步奏很多,但是效率高,每分钟轻松能到3000万数据

q79969786的专栏 1万+

HBase在单Column和多Column情况下批量Put的性能对比分析

作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2013/11/28/hbase-batch-put-performance-analysis-of-single-column-and-multiple-columns.html 针对HBase在单column famil...

weixin_34378767的博客 314

HBase数据的导入和预分区

文章目录HBase数据的导入和预分区HBase数据导入1.准备数据2.使用ImportTsv将csv文件直接导入HBase中步骤1:在Hbase中创建一张表ns1:in_table步骤2:将data.csv导入到ns1:in01中步骤3:查看ns1:in01中的数据3.使用Completebulkload导入数据1.将原始的数据文件生成HFile存储在HDFS上2.将生成HFile中的数据导入HB...

qq_43502858的博客 1527

【分布式数据库】HBase读写性能调优(一)

HBase关键参数配置如果同时存在读和写的操作,这两种操作的性能会相互影响。如果写入导致的flush和Compaction操作频繁发生,会占用大量的磁盘IO操作,从而影响读取的性能。如果写入导致阻塞较多的Compaction操作,就会出现Region中存在多个HFile的情况,从而影响读取的性能。所以如果读取的性能不理想的时候,也要考虑写入的配置是否合理。

康师傅没有眼泪 6041

HBase 系列 (七)数据导入到HBase数据库的N种方式

文章目录Shell导入到HBase:Hive与HBase集成:Sqoop将Mysql移到HBase:JavaAPI控制HBase: Shell导入到HBase: ##通过hbase shell导入文档数据 hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \ -Dimporttsv.separator=',' \ -Dimporttsv.columns="HBASE_ROW_KEY,order:numb,order:date" \ customer fil

qq_35050438的博客 1285

HBase 5种写入数据方式

Version :hadoop1.2.1; hbaes0.94.16;HBase写入数据方式,可以简单分为下面几种:1. 直接使用HTable进行导入,代码如下:package hbase.curd; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Ra

fansy1990的专栏 9496

Hbase批量数据导入与导出

1、上传文件夹到hdfs上2、Hbase批量csv数据导入hour1。

m0_73509128的博客 1788

HBase0.96数据导入以及Kettle操作HBase问题

版本:cdh5.0.0+hadoop2.3.0+hbase0.96.1.1+Spoon5.0.1一、HBase数据导入HBase数据导入使用org.apache.hadoop.hbase.mapreduce.ImportTsv 的两种方式,一种是直接导入,一种是转换为HFile,然后再次导入。1. HDFS数据为(部分):[root@node33 data]# hadoop fs -ls /inp

fansy1990的专栏 9456

向hbase导入数据的三种方式

向hbase导入数据的三种方式 1.Put对象,是去RPC请求连接数据并一条一条插入或者多条插入. 2.缓存到一定大小之后单次请求一次性插入数据(内存) 3.现在hdfs中已经存在了大量的数据,bulkload方式 text,sequence,csv文件… —>Hflie文件 <<<<<<<<<—表.region 第一种方式PUT 用ja...

weixin_45896475的博客 4071

HBase的批量加载操作:优化大数据处理中的HBase数据导入

为了提高数据导入的效率,HBase提供了Bulk Load(批量加载)操作,它能够以更高的速度将数据加载到HBase表中。在上述代码中,我们首先创建了HBase的配置对象,并设置了要加载数据的目标表名。接下来,我们创建了一个批量加载的作业,并设置了输入和输出的格式。通过以上代码,你可以方便地使用HBase的批量加载操作将大量数据高效地导入到HBase表中。批量加载操作的原理是将数据预先处理成HBase所需的HFile格式,然后直接将HFile文件加载到HBase表中。需要注意的是,我们在代码中使用了。

CodeHeroicX的博客 534

Cadence——原理图相关教程

包含创建文件,原理图,元器件,规则检查,PDF与BOM清单输出,各类PCB网表

haonanyayaya的博客 1万+

用户画像-1: 大批量数据导入HBase

用户画像

bigdatakenan的博客 3262

使用Docker搭建MaxKB智能体平台

【代码】使用Docker搭建MaxKB智能体平台。

janthinasnail的博客 711

HBase海量数据入库方案、使用ImportTSV向HBase中导入海量数据、HBase的写入流程、HBase在HDFS中的存储结构、LoadIncrementalHFiles命令 10

前言 数据导入HBase时,若是小批量的数据,使用HBase提供的API就可以满足需求。 如果要灌入大量数据,使用API的方式导入,会占用大量的RegionServer的资源,影响该RegionServer上其他表的查询。 为了解决这种问题,HBase官方提供了两种基于MapReduce的大量数据导入的方法: ImportTSV BuckLoad 1. HBase导入数据的写入流程 客...

啊策策大数据社区 4243

本科双非的计算机考研择校注意点——经验贴

一战一志愿上岸某211的电子信息专硕。之前在某乎也发过帖子。但现在用优快云,所以把相关的心得再发出来仅供大家参考。 首先,我认为最重要的是你为什么要考研? 不管你是为了混一个文凭将来好进大厂,还是为了真正搞学术或者学知识,你要知道你自己的目标,只有坚定自己的目标,才有动力去走完这段复习的历程。真正的考研,是很苦的。如果你是为了逃避大四面临的就业才选择考研,并且还浑浑噩噩不当回事,那我劝你放弃,不如踏踏实实学点技术去找实习。那从我自己出发,我是认为自己本科双非院校且自己四年间没有学到什么专业方面的技能,

m0_56698268的博客 3165

国产FPGA逆袭!深度评测复旦微RFVU3P5G核心板在相控阵雷达中的表现

本文深度评测了复旦微RFVU3P5G核心板在相控阵雷达中的实战表现。该核心板凭借射频直采架构、高采样率ADC/DAC及丰富的DSP资源,在多通道同步精度、动态范围及系统稳定性等关键指标上表现出色,展现了国产FPGA在高端雷达应用中的硬核实力与供应链自主价值。

b0c1d2的博客 726

Hbase Bulk Loading与HBase API方式分析和对比

1.概述 往hbase中批量加载数据的方式有很多种,最直接方式是调用hbase的API用put方法插入数据;另外一种是用MapReduce的方式从hdfs上加载数据,调用TableOutputFormat类在reduce中直接生成put对象写入HBase(这种方式可以看作多线程的调用hbase API方式);但是这两种方式效率都不是很高。 Bulk Load 方式调用MapReduce的job...

千淘万漉 957

AI应用架构师视角:AI技术引发的全球经济格局重构,你看懂了吗?

本文将从AI应用架构师的独特视角,拆解AI技术栈(算力/算法/数据)如何通过"架构渗透"重塑产业价值链,分析中美欧等主要经济体的AI战略差异如何改写全球分工格局,并为企业与个人提供一套可落地的"AI经济适应性框架"。当OpenAI的GPT-4在代码生成、多模态理解上展现出超越人类的能力,当英伟达的H100芯片成为全球科技巨头争抢的"数字石油",当中国的AI大模型在电商、金融等场景实现规模化落地——我们正站在一场由AI技术引发的全球经济重构的临界点上。AI重构全球经济格局的过程,既是挑战,更是机遇。

小白菜的博客 1258

hive表数据导入到Hbase

hive数据导入到Hbase中有两种方式。 方式一 —— 内部表映射 适用于数据量不是特别大的场景。 首先说一下Hbase数据到hive内部表的映射,代码如下: create table stu_info{ key string comment '主键', name string comment '名字', age int comment'年龄' } STORED BY 'org.ap...

暁洣的博客 6619

YOLOv11改进 | 主干/Backbone篇 | 利用RT-DETR主干网络PPHGNetV2助力yolov11有效涨点(轻量化目标检测网络)

本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv11的主干,RT-DETR是今年由百度推出的第一款实时的ViT模型,其在实时检测的领域上号称是打败了YOLO系列,其利用两个主干一个是HGNet一个是ResNet,其中HGNet就是我们今天来讲解的网络结构模型,这个网络结构目前还没有推出论文,所以其理论知识在网络上也是非常的少,我也是根据网络结构图进行了分析(精度mAP提高0.05)。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备​目录一、本文介绍。

Snu77的博客 3721

SAP RAP学习系列合集介绍

《SAP RAP学习系列合集:从入门到部署的完整指南》摘要: 本文介绍了作者创建的SAP RAP学习系列合集,涵盖RAP开发从基础概念到实战部署的全流程。系列目前包含17篇文章,系统讲解了RAP核心开发技术:从数据建模、UI构建到行为定义(包括并发控制、草稿功能、授权验证等),最后详细演示了应用部署到Fiori Launchpad的两种方案(OP版和ES版)。

DeveloperMrMeng的博客 1492

使用 BulkLoad 向 HBase 中批量导入数据

一、背景介绍1.1 概述我们经常面临向 HBase 中导入大量数据的情景。往 HBase 中批量加载数据的方式有很多种,最直接方式是调用 HBase 的 API 用 put 方法插入数据...

qianshanding0708的博客 4446

运放实现阶梯波发生器-总结报告

实验目的: 学习、理解、掌握方波电路、限幅电路积分累加电路、反馈电路 课程条件: 电脑仿真软件Multisim 原理框图和实验思路: 方波电路通过微分电路可以形成正负脉冲,在通过限幅电路后变为单脉冲,最后在积分电路中形成阶梯波。微分电路存在的意义就是为了防止方波频率过大,从而导致在经过限幅电路的方波,在一个周期内将电容的电充满,这样就不会产生阶梯波。如果方波的频率比较小,可以近似认为是正负脉冲,这样就可以跳过微分电路。 ...............

0 1万+

Hive数据导入hbase使用BulkLoad方式(spark和mapperReduce两种实现)

一、前言 在一些场景中需要把hive中的数据导入到hbase中做永久存储。hive与hbase数据交互一般有两种方式:1.hive和hbase建立起关联 2.把hive中的数据处理成hfile文件,然后通过bulkload导入到hbase。相比第一种方式,第二种方式效率更高,原因简单来说是HBase的数据是以HFile的形式存储在HDFS的,hive数据转为hfile文件后,可以通过b...

m0_37592814的博客 2505

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

将数据从mysql导入hbase_数据导入HBase最常用的三种方式及实践分析

【编者按】要使用Hadoop,数据合并至关重要,HBase应用甚广。一般而言,需要针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase中。常见方式为:使用HBase的API中的Put方法;使用HBase 的bulk load 工具;使用定制的MapReduce Job方式。《HBase Administration Cookbook》一书对这三种方式有着详尽描述,由Impo...

weixin_36384501的博客 1929

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: HBase Java api入门代码案例(put、delete、scan、get)
下一篇: 数据结构与算法之布隆过滤器(bloom filter)
闻香识代码
博客等级 码龄12年 314粉丝 223原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值