HBase 客户端类型 (二)

HBase | HBase从介绍到Java客户端开发 文章目录HBase入门认识HBase介绍HBaseHBase架构RegionServer集群结构HBase逻辑存储结构HBase物理存储结构HBase安装前期准备HBase安装步骤Hbase启动HBase验证备份masterHBase命令HBase 命令介绍HBase Shell命令介绍status命令命名空间namespace相关命令介绍create_namespace命令drop_namesp... 阅读详情

继  HBase 客户端类型 (一)

3. Framework Clients
---
在更直接的网关客户端之后,现在要讨论第二类客户端,将它们统称为框架(framework)。这类客户端提供了更高级的抽象,一般使用 domain specific
language (DSL) 的形式。包括,例如 SQL, 关系数据库系统与外部客户端的混合用语(lingua franca),以及 MapReduce, 原始的处理框架,用于编写和执行
长时间运行的批处理作业。


3.1 MapReduce
-----------------------------------------------------------------------------------------------------------------------------------------
Hadoop MapReduce framework 构建用于处理 PB 级的数据,以稳定的,确定性的,容易编程的方式处理数据。有很多种方式将 HBase 作为 MapReduce 作业
的源和目标(as a source and target for MapReduce jobs)。


■ Native Java
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 基于 Java 的 MapReduce API 在单独的章节中论述。

 

3.2 Hive
-----------------------------------------------------------------------------------------------------------------------------------------
Apache Hive 项目是在 Hadoop 之上提供的数据仓库基础设施。最初由 Facebook 开发,但现在作为开源 Hadoop 生态系统的一部分。Hive 可以用于运行对
HBase 表的结构化查询。

 

■ 介绍 (Introduction)
-----------------------------------------------------------------------------------------------------------------------------------------
Hive 提供了类 SQL 的查询语言(SQL-like query language), 称为 HiveQL, 允许查询存储在 Hadoop 中的半结构化数据。查询最终转换成一个处理作业,
传统上为 MapReduce 作业,在本地执行或者在分布式的集群上执行。数据在作业执行的时候解析,并且 Hive 还利用了一个存储处理器抽象层(storage
handler abstraction layer), 这样数据不仅仅可以存在于 HDFS, 也可以为其它数据源。存储处理器透明地使任意存储信息对基于 HiveQL 的用户查询可用。

从 0.6.0 版,Hive 提供了 HBase 的处理器。用户可以定义将 Hive 表存储为 HBase 表或快照,在两者之间映射列。

安装完 Hive 之后,需要编辑配置文件以使 Hive 能够访问 HBase 的 JAR 文件,以及相关配置。修改 $HIVE_CONF_DIR/hive-env.sh 文件来包含如下行,使
用适用于自己的安装路径:

    # Set HADOOP_HOME to point to a specific hadoop install directory
    HADOOP_HOME=/opt/hadoop
    HBASE_HOME=/opt/hbase
    # Hive Configuration Directory can be controlled by:
    # export HIVE_CONF_DIR=
    export HIVE_CONF_DIR=/etc/opt/hive/conf
    export HIVE_LOG_DIR=/var/opt/hive/log
    # Folder containing extra libraries required for hive compilation/execution
    # can be controlled by:
    export HIVE_AUX_JARS_PATH=/usr/share/java/mysql-connectorjava.jar: $HBASE_HOME/lib/hbase-client-1.1.0.jar

Hive 安装的一个重要部分是配置元数据数据库,由 hive-site.xml 配置文件设置:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <configuration>
        <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://master-2.internal.larsgeorge.com/metastore_db</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>dbuser</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionPassword</name>
            <value>dbuser</value>
        </property>
        <property>
            <name>datanucleus.autoCreateSchema</name>
            <value>false</value>
        </property>
        <property>
            <name>hive.mapred.reduce.tasks.speculative.execution</name>
            <value>false</value>
        </property>
    </configuration>

还需要一些工作 Hive 才可以工作,包括仓库的创建,HDFS 中临时工作目录创建等等。外部客户端访问Hive 只需要Hive Metastore 服务器和 Hive 服务器  


■ 映射托管的表 (Mapping Managed Tables)
-----------------------------------------------------------------------------------------------------------------------------------------
一旦 Hive 安装完并可以使用了,就可以使用 HBase 处理器(handler). 首先,启动 Hive 命令行接口,创建一个原生 Hive table, 然后插入数据:

    $ hive
    ...
    hive> CREATE TABLE pokes (foo INT, bar STRING);
    OK
    Time taken: 1.835 seconds
    hive> LOAD DATA LOCAL INPATH '/opt/hive/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
    Loading data to table default.pokes
    Table default.pokes stats: [numFiles=1, numRows=0, totalSize=5812, rawDataSize=0]
    OK
    Time taken: 2.695 seconds

例子中使用了 pokes 示例表,其中有两个列 foo 和 bar. 载入的数据作为 Hive 安装包的一部分提供,每行包含一个 key 和 value 字段,由 Ctrl-A ASCII
控制代码(十六进制数字 0x01)分隔,这是 Hive 的默认分隔符:

    $ head /opt/hive/examples/files/kv1.txt | cat -v
    238^Aval_238
    86^Aval_86
    311^Aval_311
    27^Aval_27
    165^Aval_165
    409^Aval_409
    255^Aval_255
    278^Aval_278
    98^Aval_98
    484^Aval_484

下一步创建一个 HBase-backed 的表:

    hive> CREATE TABLE hbase_table_1(key int, value string) \
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' \
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") \
    TBLPROPERTIES ("hbase.table.name" = "hbase_table_1");
    OK
    Time taken: 2.369 seconds

上面的 DDL 语句创建并映射了一个 HBase 表,通过 TBLPROPERTIES 和 SERDEPROPERTIES 参数定义,使用提供的 HBase 处理器,Hive表为 hbase_table_1
hbase.columns.mapping 属性有一个特性,通过 ":key" 到 HBase row key 映射列。

在表属性中的 hbase.table.name 是可选的,并且只有在 Hive 和 HBase 中使用不同的表的名称时才需要。例子中使用了相同的名称,因而可以忽略。例如
将 Hive 的 hbase_table_1 映射到一个 HBase 名为 warehouse:table1 的表,即将表放到 warehouse 的名称空间下。

从前面填充的 pokes Hive 表中装载数据:根据映射,这会将 pokes.foo 的值保存为行键,并且 pokes.bar 的数据保存到列 cf1:val 中:

    hive> INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokes;
    Query ID = larsgeorge_20150704102808_6172915c-2053-473b-9554-c9ea972e0634
    Total jobs = 1
    Launching Job 1 out of 1
    Number of reduce tasks is set to 0 since there's no reduce operator
    Starting Job = job_1433933860552_0036, Tracking URL = \
    http://master-1.internal.larsgeorge.com:8088/ \
    proxy/application_1433933860552_0036/
    Kill Command = /opt/hadoop/bin/hadoop job -kill
    job_1433933860552_0036
    Hadoop job information for Stage-0: number of mappers: 1; \
    number of reducers: 0
    2015-07-04 10:28:23,743 Stage-0 map = 0%, reduce = 0%
    2015-07-04 10:28:34,377 Stage-0 map = 100%, reduce = 0%, \
    Cumulative CPU 3.43 sec
    MapReduce Total cumulative CPU time: 3 seconds 430 msec
    Ended Job = job_1433933860552_0036
    MapReduce Jobs Launched:
    Stage-Stage-0: Map: 1 Cumulative CPU: 3.43 sec \
    HDFS Read: 15942 HDFS Write: 0 SUCCESS
    Total MapReduce CPU Time Spent: 3 seconds 430 msec
    OK
    Time taken: 27.153 seconds

示例中启动了 MapReduce 作业,将数据从基于 HDFS 的 Hive table 拷贝到 HBase-backed 的表中。

下面的命令获取 pokes 和 hbase_table_1 表中数据的行数:

    hive> SELECT COUNT(*) FROM pokes;
    Query ID =larsgeorge_20150705121407_ddc2ddfa-8cd6-4819-9460-5a88fdcf2639
    Total jobs = 1
    Launching Job 1 out of 1
    Number of reduce tasks determined at compile time: 1
    In order to change the average load for a reducer (in bytes):
    set hive.exec.reducers.bytes.per.reducer=<number>
    In order to limit the maximum number of reducers:
    set hive.exec.reducers.max=<number>
    In order to set a constant number of reducers:
    set mapreduce.job.reduces=<number>
    Starting Job = job_1433933860552_0045, Tracking URL = \
    http://master-1.internal.larsgeorge.com:8088/proxy/ \
    application_1433933860552_0045/
    Kill Command = /opt/hadoop/bin/hadoop job -kill
    job_1433933860552_0045
    Hadoop job information for Stage-1: number of mappers: 1; \
    number of reducers: 1
    2015-07-05 12:14:21,938 Stage-1 map = 0%, reduce = 0%
    2015-07-05 12:14:30,443 Stage-1 map = 100%, reduce = 0%, \
    Cumulative CPU 2.08 sec
    2015-07-05 12:14:40,017 Stage-1 map = 100%, reduce = 100%, \
    Cumulative CPU 4.23 sec
    MapReduce Total cumulative CPU time: 4 seconds 230 msec
    Ended Job = job_1433933860552_0045
    MapReduce Jobs Launched:
    Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 4.23 sec \
    HDFS Read: 12376 HDFS Write: 4 SUCCESS
    Total MapReduce CPU Time Spent: 4 seconds 230 msec
    OK
    500
    Time taken: 33.268 seconds, Fetched: 1 row(s)

    --------------------------------------------------------------
    hive> SELECT COUNT(*) FROM hbase_table_1;
    ...
    OK
    309
    Time taken: 46.218 seconds, Fetched: 1 row(s)


两个表的行数实际上是不同的,差了 100 多行, HBase-backed 表比较短,这是因为,在 HBase 中,不能有两个相同的行键,因此在拷贝时,每一行,就是
在原表的 pokes.foo 列中相同值,保存到同一行。这与在原表中执行 SELECT DISTINCT 效果是一样的。

    hive> SELECT COUNT(DISTINCT foo) FROM pokes;
    ...
    OK
    309
    Time taken: 30.512 seconds, Fetched: 1 row(s)

最后,删除这两个表,这也会删除底层的 HBase 表:

    hive> DROP TABLE pokes;
    OK
    Time taken: 0.85 seconds
    hive> DROP TABLE hbase_table_1;
    OK
    Time taken: 3.132 seconds
    hive> EXIT;

 

■ 映射已有的表 (Mapping Existing Tables)
-----------------------------------------------------------------------------------------------------------------------------------------
可以将已有的表映射到 Hive, 甚至可以将表映射为多个 Hive 表。这在有非常不同的列族时,并进行分别查询时非常有用。这会大幅度提高查询性能,因其
内部使用 Scan, 只选择映射的列族。如果有很稀疏的列族,会在磁盘上只扫描非常小的文件,相反,运行一个作业必须扫描所有的数据才能过滤出稀疏数据

另一个映射非托管的,已存在的 HBase 表到 Hive 的原因是调整表属性的能力。例如,创建一个 Hive table 底层为一个 托管的 HBase table, 使用一个
非直接的表名映射,并且后续使用 HBase shell 的 describe 命令来打印出表属性:

    hive> CREATE TABLE dwitems(key int, value string) \
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' \
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") \
    TBLPROPERTIES ("hbase.table.name" = "warehouse:items");
    OK
    Time taken: 1.961 seconds
    hbase(main):001:0> describe 'warehouse:items'
    Table warehouse:items is ENABLED
    warehouse:items
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'cf1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER =>
    'ROW', \
    REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION =>
    'NONE', \
    MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS =>
    'FALSE', \
    BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
    1 row(s) in 0.2520 seconds


托管的表使用集群范围的配置提供的属性,从 Hive 命令行没有能力覆盖任何属性。这在实践中时非常受限的,因此通常先在 HBase shell 上创建表,然后
作为一个外部表映射到 Hive 中。这要求 Hive 的 EXTERNAL 关键字,它也被用在其他地方,用于访问存储在非托管的 Hive 表中的数据,也就是不在 Hive
控制之下的数据。

下面的示例在 HBase 中创建名称空间和表,然后映射到 Hive 中:

    hbase(main):002:0> create_namespace 'salesdw'
    0 row(s) in 0.0700 seconds
    hbase(main):003:0> create 'salesdw:itemdescs', { NAME => 'meta',
    VERSIONS => 5, \
    COMPRESSION => 'Snappy', BLOCKSIZE => 8192 }, { NAME => 'data', \
    COMPRESSION => 'GZ', BLOCKSIZE => 262144, BLOCKCACHE => 'false' }
    0 row(s) in 1.3590 seconds
    => Hbase::Table - salesdw:itemdescs
    hbase(main):004:0> describe 'salesdw:itemdescs'
    Table salesdw:itemdescs is ENABLED
    salesdw:itemdescs
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'data', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER =>
    'ROW', \
    REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'GZ', \
    MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS =>
    'FALSE', \
    BLOCKSIZE => '262144', IN_MEMORY => 'false', BLOCKCACHE =>
    'false'}
    {NAME => 'meta', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER =>
    'ROW', \
    REPLICATION_SCOPE => '0', VERSIONS => '5', COMPRESSION => 'SNAPPY',
    \
    MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS =>
    'FALSE', \
    BLOCKSIZE => '8192', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
    2 row(s) in 0.0440 seconds

    -----------------------------------------------------------------------------------------
    hive> CREATE EXTERNAL TABLE salesdwitemdescs(id string, title string, createdate string)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, meta:title, meta:date")
    TBLPROPERTIES("hbase.table.name" = "salesdw:itemdescs");
    OK
    Time taken: 0.33 seconds

示例中, HBase table 设置了几个属性,例如,压缩类型和使用的块大小,这基于这样的假设,meta 列族要包含非常小的列,而 data 列族要保存比较大块
的数据。

使用 HBase shell 插入一些随机数据:

    hbase(main):003:0> require 'date';
    import java.lang.Long
    import org.apache.hadoop.hbase.util.Bytes
    def randomKey
    rowKey = Long.new(rand * 100000).to_s
    cdate = (Time.local(2011, 1,1) + rand * (Time.now.to_f - \
    Time.local(2011, 1, 1).to_f)).to_i.to_s
    recId = (rand * 10).to_i.to_s
    rowKey + "|" + cdate + "|" + recId
    end
    1000.times do
    put 'salesdw:itemdescs', randomKey, 'meta:title', \
    ('a'..'z').to_a.shuffle[0,16].join
    end
    0 row(s) in 0.0150 seconds
    0 row(s) in 0.0070 seconds
    ...
    0 row(s) in 0.0070 seconds
    => 1000
    hbase(main):004:0> scan 'salesdw:itemdescs'
    ...
    73240|1340109585|0 column=meta:title, timestamp=1436194770461,
    value=owadqizytesfxjpk
    7331|1320411151|5 column=meta:title, timestamp=1436194770291,
    value=ygskbquxrhfpjdzl
    73361|1333773850|1 column=meta:title, timestamp=1436194771546,
    value=xvwpahoderlmkzyc
    733|1322342049|7 column=meta:title, timestamp=1436194768921,
    value=lxbewcargdkzhqnf
    73504|1374527239|8 column=meta:title, timestamp=1436194773800,
    value=knweopyzcfjmbxag
    73562|1294318375|0 column=meta:title, timestamp=1436194770200,
    value=cdhorqwgpatjvykx
    73695|1415147780|1 column=meta:title, timestamp=1436194772545,
    value=hjevgfwtscoiqxbm
    73862|1358685650|7 column=meta:title, timestamp=1436194773488,
    value=fephuajtyxsbcikn
    73943|1324759091|0 column=meta:title, timestamp=1436194773597,
    value=gvdentsxayhfrpoj
    7400|1369244556|8 column=meta:title, timestamp=1436194774953,
    value=hacgrvwbnfsieopy
    74024|1363079462|3 column=meta:title, timestamp=1436194775155,
    value=qsfjpabywuovmnrt...
    
现在可以在 Hive 端查询这个表:

    hive> SELECT * FROM salesdwitemdescs LIMIT 5;
    hive> select * from salesdwitemdescs limit 5;
    OK
    10106|1415138651|1 wbnajpegdfiouzrk NULL
    10169|1429568580|9 nwlujxsyvperhqac NULL
    1023|1397904134|5 srcbzdyavlemoptq NULL
    10512|1419127826|0 xnyctsefodmzgaju NULL
    10625|1435864853|2 ysqovchlzwptibru NULL
    Time taken: 0.239 seconds, Fetched: 5 row(s)

最后,在 Hive 中删除该表,外部表不会被删除。只是将有关表的元数据信息删除。


高级列映射特性 (Advanced Column Mapping Features)
-----------------------------------------------------------------------------------------------------------------------------------------
可以将 HBase 列直接映射为一个 Hive 列,或者将整个 HBase 列族映射为一个Hive MAP 类型。如果事先不知道 HBase 列限定符,这是非常有用的方法:
映射整个列族,然后在 Hive 查询(query)中迭代列族中的列。

Hive 存储处理器(storage handlers) 对于高级应用层的工作是透明的,因此也可以使用任何 Hive 提供的用户定义函数(user-defined function, UDF),
或者自己的自定义函数。

 

■ 映射已存在的快照 (Mapping Existing Snapshots)
-----------------------------------------------------------------------------------------------------------------------------------------
在映射已存在 HBase 表到 Hive 的基础上,也可以使用 HBase 快照映射。和使用表映射做法相同,先定义一个 HBase 表的表模式(table  schema). 通过
hbase.table.name 属性设置表名称。当执行一个查询时,从命名的表中读取。对于从快照上读取,也必须在执行查询之前设置其名称,使用属性:
hive.hbase.snapshot.name。 例如,首先为之前创建的 warehouse:itemdescs 表创建快照,然后向其添加 1000 行,使其总行数为 2000:

    hbase(main):005:0> snapshot 'salesdw:itemdescs', 'itemdescs-snap1'
    0 row(s) in 0.7180 seconds
    hbase(main):006:0> 1000.times do
        put 'salesdw:itemdescs', randomKey, 'meta:title', ('a'..'z').to_a.shuffle[0,16].join
    end
    ...
    0 row(s) in 0.0060 seconds

    => 1000

    hbase(main):007:0> count 'salesdw:itemdescs'
    Current count: 1000, row: 55291|1419780087|4
    Current count: 2000, row: 999|1358386653|5
    2000 row(s) in 0.6280 seconds

    => 2000

假定快照 itemdescs-snap1 有 1000 行,而活动的表有 2000 行,可以切换到 Hive CLI 确认表的行数:

    hive> SELECT COUNT(*) FROM salesdwitemdescs;
    ...
    OK
    2000
    Time taken: 41.224 seconds, Fetched: 1 row(s)

在能使用快照之前,必须切换到 HBase 超级用户(super user, HDFS 中 HBase 文件的拥有者,这里为 hadoop), 才能读取快照。必须退出 Hive CLI 并
设置 Hadoop 变量来指定用户,类似如下:

    $ export HADOOP_USER_NAME=hadoop
    $ hive

要从一个 HBase 快照要求在 HDFS 的某个位置创建一个临时的表结构,默认为 /tmp, 可以在 Hive shell 中通过  hive.hbase.snapshot.restoredir 属性
改变默认设置,以指定一个不同的位置。现在已准备好从快照而非表中查询:

    hive> SET hive.hbase.snapshot.name=itemdescs-snap1;
    hive> SELECT COUNT(*) FROM salesdwitemdescs;
    ...
    OK
    1000
    Time taken: 34.672 seconds, Fetched: 1 row(s)

正如所期望的,我们返回了 1000 行,与快照创建时相匹配。


3.3 Pig
-----------------------------------------------------------------------------------------------------------------------------------------
Apache Pig 项目提供了一个分析海量数据的平台。它有自己的高级查询语言,称为 Pig Latin, 使用命令式编程风格表示出涉及传输输入数据到最终的输出。
这与 Hive 的声明式方法来模拟 SQL 语句相反。

Pig Latin 语言,与 HiveQL 相比,对于有过程式编程背景的开发者,天生具有吸引力,而且本身天生就具有强大的并发性。当它与强大的 Hadoop 和
MapReduce 框架配合使用时,可以在合理的时间帧内处理大规模的数据量。

Pig 0.7.0 版开始引入 LoadFunc/StoreFunc 类及其功能,可以使用户从非 HDFS 的数据源载入并存储数据,其中之一就是 HBase, 由 HBaseStorage 类实现

Pig 对 HBase 的支持包括读取和写入到现有的表。可以将表的列映射为 Pig 的元组(tuple), 对于读操作,可以将行键作为第一个字段,对于写操作,第一个
字段总是用作行键。

存储也支持基本过滤,工作于行级别,并且提供了比较操作符。


    Pig 安装 (Pig Installation)
    -------------------------------------------------------------------------------------------------------------------------------------
    可以根据操作系统选择安装预编译好的二进制包安装。如果不可用,可以下载源码编译。

    执行下载,解包:
        $ wget http://www.apache.org/dist//pig/pig-0.8.1/pig-0.8.1.tar.gz
        $ tar -xzvf pig-0.8.1.tar.gz -C /opt
        $ rm pig-0.8.1.tar.gz
    
    将 pig 脚本添加到 shell 搜索路径,并设置 PIG_HOME 环境变量
    
        $ export PATH=/opt/pig-0.8.1/bin:$PATH
        $ export PIG_HOME=/opt/pig-0.8.1
    
    完成后,验证安装是否正常工作:
    
        $ pig -version
        Apache Pig version 0.8.1
        compiled May 27 2011, 14:58:51    
        

可以使用提供的指南代码和数据体验 Pig 和 HBase. 必须先在 HBase shell 中创建要在 Pig 中工作的表:

    hbase(main):001:0> create 'excite', 'colfam1'

启动 Pig shell, 称为 Grunt, 要求 pig 脚本。对于本地测试,添加 -x local 切换开关:

    $ pig -x local
    grunt>

本地模式的 Pig 不使用单独的 MapReduce 安装,而是使用 Hadoop 自带的 LocalJobRunner,它在与 Pig 同一进程中运行 MapReduce 作业。这种方式
适用于测试和搭建原型,但不应用于较大型的数据集。

可以选择事先在编辑器上写脚本,并在后续调用 pig 脚本时指定它。或者使用 Grunt, 即 Pig shell, 交互式地输入 Pig Latin 语句。最终,语句会被解释
为一个或多个 MapReduce 作业,但不是所有语句都会触发执行。另一方面,可以一行一行地定义步骤,然后调用 DUMP 或 STORE, 最终会按步骤设置作业。


Pig 指南自带了一个由 Excite 发布的小型数据集,其中包含了一个匿名的 user ID, 一个 timestamp, 及其站点的搜索项。首先,用户需要将这些数据
加载到 HBase 中,通过一个简单的转换以生成一个组合键,这是强制每一个行键的唯一性所必须的。

    grunt> raw = LOAD 'tutorial/data/excite-small.log' USING PigStorage('\t') AS (user, time, query);
    T = FOREACH raw GENERATE CONCAT(CONCAT(user, '\u0000'), time), query;
    grunt> STORE T INTO 'excite' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('colfam1:query');

    ...
    2011-05-27 22:55:29,717 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 100% complete
    2011-05-27 22:55:29,717 [main] INFO org.apache.pig.tools.pigstats.
    PigStats - Detected Local mode. Stats reported below may be incomplete
    2011-05-27 22:55:29,718 [main] INFO org.apache.pig.tools.pigstats.
    PigStats - Script Statistics:
    HadoopVersion PigVersion UserId StartedAt FinishedAt
    Features
    0.20.2 0.8.1 larsgeorge 2011-05-27 22:55:22 2011-05-27
    22:55:29 UNKNOWN
    Success!
    Job Stats (time in seconds):
    JobId Alias Feature Outputs
    job_local_0002 T,raw MAP_ONLY excite,
    Input(s):
    Successfully read records from: "file:///opt/pig-0.8.1/tutorial/
    data/excite-small.log"
    Output(s):
    Successfully stored records in: "excite"
    Job DAG:
    job_local_0002
    
    
STORE 语句启动一个 MapReduce 作业,从给定的日志文件读取数据,并将其拷贝到 HBase 表。生成复合行键的语句,用于之后的 STORE 语句的第一个字段,
由 user 和 time 字段组成,中间以 0 字节分隔。

访问数据涉及到另外一个 LOAD 语句,这时使用 HBaseStorage 类:

grunt> R = LOAD 'excite' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('colfam1:query',
'-loadKey') AS (key: chararray, query: chararray);

括号中的参数定义了列到字段的映射,以及额外的选项以载入行键作为在关系 R 中第一个字段。AS 部分很显然地定义了行键和 colfam1:query 列转换为
字符数组,即 Pig 的字符串类型。默认情况下,以字节数组返回,这匹配 HBase 表的存储方式。转换数据类型,可用于之后对行键的切分。

通过转储 R 的内容来测试目前输入的语句,看看前面那些语句的结果:

    grunt> DUMP R;
    ...
    Success!
    ...
    (002BB5A52580A8ED970916150445,margaret laurence the stone angel)
    (002BB5A52580A8ED970916150505,margaret laurence the stone angel)
    ...


行键,作为元组中的第一个字段,在初始从文件中拷贝数据到 HBase 期间是连接创建的。现在可以将其切分为两个字段,重新创建为原始的文本字段布局:

    grunt> S = foreach R generate FLATTEN(STRSPLIT(key, '\u0000', 2))
    AS \
    (user: chararray, time: long), query;
    grunt> DESCRIBE S;
    S: {user: chararray, time: long, query: chararray}

再次使用 DUMP, 这次使用关系 S, 显示最终结果:

    grunt> DUMP S;
    (002BB5A52580A8ED,970916150445,margaret laurence the stone angel)
    (002BB5A52580A8ED,970916150505,margaret laurence the stone angel)
    ...

到此为止,可以通过之前代码中替换 LOAD 和 STORE 语句,完成 Pig 指南的剩余部分。

结束示例,输入 QUIT 最终退出 Grunt shell:

grunt> QUIT;

 

3.4 Cascading
-----------------------------------------------------------------------------------------------------------------------------------------
Cascading 是 MapReduce 的替代 API, 一言以蔽之,它在执行期间使用 MapReduce, 但在开发时不必将它当做 MapReduce 来考虑创建在 Hadoop 上执行的
解决方案。

Cascading 使用的模型类似于现实世界中的管道装置(pipe assembly), 数据源为水龙头(tap), 而输出为水槽(sink). 它们通过管道(pipe)连接在一起构成了
处理流,数据在管道中流动并在此进程中进行转换。管道可以连接成为更大的管道装置,以从现有管道构成更复杂的处理管线(pipeline)。

数据流经管线(streams through the pipeline), 并且可以被切分,合并,组合,或者联结(joined)。数据表示为元组(tuple), 并在经由装置时形成一个
元组流(tuple stream)。这种面向可视化的模型使得构建 MapReduce 作业更像是构建工作,抽象出实际工作的复杂性。

Cascading 从 1.0.1 版开始支持从 HBase 集群读写数据,更多信息访问 http://www.cascading.org/

下面示例展示如何将数据流入到(sink data into) HBase 集群的过程:

示例: Using Cascading to insert data into HBase

    // read data from the default filesystem
    // emits two fields: "offset" and "line"
    Tap source = new Hfs(new TextLine(), inputFileLhs);
    // store data in a HBase cluster, accepts fields "num", "lower", and "upper"
    // will automatically scope incoming fields to their proper familyname,
    // "left" or "right"
    Fields keyFields = new Fields("num");
    String[] familyNames = {"left", "right"};
    Fields[] valueFields = new Fields[] {new Fields("lower"), new Fields("upper") };
    Tap hBaseTap = new HBaseTap("multitable", new HBaseScheme(keyFields, familyNames, valueFields), SinkMode.REPLACE);
    // a simple pipe assembly to parse the input into fields
    // a real app would likely chain multiple Pipes together for more complex
    // processing
    Pipe parsePipe = new Each("insert", new Fields("line"), new RegexSplitter(new Fields("num", "lower", "upper"), " "));
    // "plan" a cluster executable Flow
    // this connects the source Tap and hBaseTap (the sink Tap) to the parsePipe
    Flow parseFlow = new FlowConnector(properties).connect(source, hBaseTap, parsePipe);
    // start the flow, and block until complete
    parseFlow.complete();
    // open an iterator on the HBase table we stuffed data into
    TupleEntryIterator iterator = parseFlow.openSink();
    while(iterator.hasNext()) {
        // print out each tuple from HBase
        System.out.println( "iterator.next() = " + iterator.next() );
    }
    iterator.close();

 

3.5 其它客户端 (Other Clients)
-----------------------------------------------------------------------------------------------------------------------------------------
还有其它的客户端库可以访问 HBase 集群。它们可以划分为直接运行在 JVM 上的,和通过网关服务器(gateway server) 与 HBase 集群通信。下面是一些
项目:


    ● Clojure
    -------------------------------------------------------------------------------------------------------------------------------------
    HBase-Runner 项目,提供从函数式编程语言 Clojure 对 HBase 的支持。可以在 Clojure 中编写 MapReduce 作业访问 HBase 表。


    ● JRuby
    -------------------------------------------------------------------------------------------------------------------------------------
    HBase Shell 是使用基于 JVM 语言访问基于 Java API 的例子。它自带源代码,因此可以用户可以将相同的特性加入到自己的 JRuby 代码中。
    
    
    ● HBql
    -------------------------------------------------------------------------------------------------------------------------------------    
    HBql 在 HBase 上添加类 SQL 语法,对 HBase 唯有的特性增加了必要的扩展。
    

    ● HBase-DSL
    -------------------------------------------------------------------------------------------------------------------------------------
    这个项目给出了专用类用于帮助构造对 HBase 集群的查询。使用类构建器(builder-like)风格,可以快速组装所有选项和必要参数。


    ● JPA/JPO
    -------------------------------------------------------------------------------------------------------------------------------------
    可以使用,比如 DataNucleus, 将一个 JPA/JPO 访问层置于 HBase 之上。  


    ● AsyncHBase
    -------------------------------------------------------------------------------------------------------------------------------------
    AsyncHBase 提供完全异步的,非阻塞的,线程安全的客户端访问 HBase 集群。它使用纯 RPC 协议直接与各种服务器对话。

 

参考:

HBase 客户端类型 (一)

HBase 客户端类型 (二)

HBase 客户端类型 (三)

HBase 客户端类型 (四)

 

参考:

    《HBase - The Definitive Guide - 2nd Edition》Early release —— 2015.7 Lars George

hbase用于查询客户端工具 1、有多个工具可选择使用 立即下载

相关推荐

HBaseClient:HBase客户端数据管理软件

HBaseClient HBase客户端数据管理软件 概要说明 类似PL/SQL,是一个HBase数据库的客户端数据管理软件。是免费开源的软件。 基于XJava,使用xml配置文件绘制可视化界面。 可视化界面操作 表 表的定义、编辑、删除; 数据 数据的添加、编辑、删除; 数据的全部清空、多条删除、多条复制; 查询 主键的精确; 关键字的模糊查询 关键字的模糊查询过滤显示; 数据查询结果的分页显示操作,并且对查询关键字高亮显示; 导出 表结构的导出; 表结构及数据的导出; 导入 文件批量put命令导入(支持中文) 批量put命令执行(支持中文) 非可视化界面的命令操作 HBase命令的执行 导入 文件批量put命令导入(支持中文) 批量put命令执行(支持中文) 下载 date version size support 2018-05-24 65.9M 支持HBase 1.x 2018-0

连接Hbase客户端工具,可视化界面

连接Hbase客户端工具,可视化界面,下面从使用和修改源码改进Hbase客户端工具的方法。 一、下载和使用 下载 下载地址:http://www.zrscsoft.com/sitepic/12046.html 连接Hbase客户端工具,可视化界面,包含三大部分: 1).可以直接使用的,用于连接HBase的客户端,是个可视化工具 ...

一火的专栏 4万+

Hbase 可视化客户端工具(非phoenix连接)

Hbase 可视化客户端工具(非phoenix连接),支持Hbase1.x,配置方便,类似PL/SQL,是一个HBase数据库的客户端数据管理软件。

/opt/hbase/conf 中不能启动hbase_大数据之HBase的几个常规性问题

本文主要针对对HBase不了解的人。主要想基于个人的理解回答以下几个问题: 什么是HBase? 何时用HBase? 与Hive、Pig的区别? ...

weixin_39968128的博客 321

AI工程实战:如何在实际工程中运用Claude Code

本文探讨了利用大型语言模型(LLM)进行复杂工程项目的结构化工作流。核心策略包括:1)规划先行,通过"探索子代理任务"主动分析代码库并澄清需求;2)定制AI行为,要求简洁输出和列出未解决问题;3)将大型任务分解为多阶段计划以管理上下文窗口限制;4)利用GitHub Issues作为外部存储实现跨会话状态持久化。这种"规划-执行"模式将AI从代码生成器升级为项目管理代理,通过与GitHub CLI等工具深度集成,实现了高效的多阶段工程协作。该方法展示了AI辅助编程向流程

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1095

SRC漏洞挖掘实战:从攻击面管理到业务逻辑漏洞的精准狩猎

在网络安全领域,漏洞挖掘是识别和利用软件系统中安全弱点的核心实践。其基本原理在于通过系统化的方法,识别和评估一个应用或系统的攻击面,并从中定位安全防护的薄弱环节。这项技术的价值在于能够主动发现潜在风险,防患于未然,对于保障企业数字资产安全至关重要。典型的应用场景包括对Web应用、移动端API以及各类在线业务系统的安全性评估。在实际的漏洞挖掘,尤其是针对安全应急响应中心(SRC)的实战中,高效的策略往往聚焦于**边缘资产**的发现与利用,以及对**业务逻辑漏洞**的模式化测试。掌握这些经过验证的思路,能帮助安

babing2770的博客 415

Hbase(二)Client客户端

对于使用HBase的业务方来说,从HBase客户端到HBase服务端,再到HDFS客户端,最后到HDFS服务端,这是一整条路径,其中任何一个环节出现问题,都会影响业务的可用性并造成延迟。因此,HBase的业务方需要对HBase客户端有较好地理解,以便优化服务体验。而事实上,由于HBase本身功能的复杂性以及Region定位功能设计在客户端上,导致HBase客户端并不足够轻量级。 1、 HBase客户端实现 HBase提供了面向Java、C/C++、Python等多种语言的客户端。由于HBase本身是Ja

cyq6239075的博客 3601

实验三 Gmapping建图

自主移动机器人第三次实验课,内容包括:(1)turtlebot的gmapping建图;(2)rosbag的使用;(3)gazebo中的gmapping建图。

lj164567487的博客 4649

HBase 客户端类型

HBase自带了很多用于各种编程语言客户端。 1. 介绍 (Introduction) ---------------------------- 从目前非常流行的语言和环境可以访问 HBase。可以直接使用客户端 API, 或者通过一些中间代理访问,将用户请求翻译成 API 调用。这些代理将原生的 Java API 包装成其它协议的 API,这样客户端就可以使用这些对外提供的 API ...

xiaoyaGrace的博客 332

王道考研操作系统笔记(第一章)附:王道考研408所有PPT和思维导图

学习感想 别人的笔记对你的学习基本上没有用处,容易培养人的惰性,如需ppt和思维导图请拉到最后,有github链接 记笔记并不是一件浪费时间的事情,还有利于多次学习 真心希望大家在学习的过程中记笔记 操作系统 第一章 计算机系统概述 1.1 操作系统 1.1.1 操作系统的概念和功能 概念 操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软

qq_41732756的博客 1万+

【QT开发教程】Qt中的跨平台文件系统操作

文件系统操作是应用程序开发中经常需要处理的任务。Qt提供了一套跨平台的文件系统操作API,使开发者能够在不同操作系统上无缝地进行文件和目录操作。本文将介绍Qt中的跨平台文件系统操作,包括基本概念、常用类和方法以及实际示例。

科技改变人类,技术成就未来 982

hbase 客户端超时、重连设置

hbase 客户端超时、重试策略设置

zychun1991的博客 1万+

基于STM32F103C8T6的智能蓝牙手环系统设计与实现

摘要:本文设计并实现了一款基于STM32F103C8T6单片机的智能蓝牙手环系统。该系统集成了ADXL345加速度计、DS18B20温度传感器、plusesennor心率模块和BT06蓝牙模块,实现了心率(±2bpm)、体温(±0.5℃)、步数(±3%)等健康数据的实时监测与显示。通过OLED屏提供人机交互界面,支持蓝牙APP远程控制,具备自动步数清零、异常提醒等功能。测试表明系统各项功能均达到设计要求,响应时间0.1-0.5秒,心率检测准确率98%,体温检测准确率99%,功耗50mA(工作)/10mA(待

3254968421的博客 206

Hbase学习(三)-- Hbase客户端

对于使用Hbase,通常情况下是Hbase客户端到Hbase服务端再到HDFS客户端这么一个路径,所以使用Hbase时需要对Hbase客户端有较好的理解。实际上,由于Hbase的复杂性以及Region的定位设计在客户端上(hbase:meta元数据表缓存在客户端上用于定位region),导致Hbase客户端并不足够轻量级。 Hbase客户端实现: Hbase提供了多种语言的客户端,由于Hbase是通过Java语言实现的,所以非Java语言需要先访问ThriftServer,然后通过Jav...

qq_38787854的博客 7737

2 硬件工程师笔面试高频知识考点真题解析——电容

本文全面解析了电容在电子电路中的关键应用与技术要点。主要内容包括:1. 电容选型核心要素:介质材质(陶瓷/电解/钽电容等)、容值精度、耐压等级、温度特性、ESR参数等,不同应用场景(滤波/去耦/谐振等)的选型策略。2. 典型电路应用原理:详细阐述去耦电容布局规则、晶振负载电容作用、共射放大电路旁路电容功能,以及RC电路的滤波/定时等应用。3. 特殊问题解决方案:MLCC啸叫机理与对策、寄生电容影响与消除、高速信号线电容使用禁忌等工程实践难题。4. 安全规范要点:X/Y电容的区别与选用、电解/钽电容防反接措施

XU157303764的博客 1565

Windows 11 安装 JDK 11:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统中安装 JDK 11 的完整流程,包括从 Oracle 官网下载压缩包、解压到自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章还包含一个专为 JDK 11 新特性设计的测试程序,涵盖 Lambda 表达式 var 语法、HTTP 客户端 API、字符串增强方法等,帮助读者确认安装版本正确无误,适合初学者和需要多版本 JDK 共存的开发者参考。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2783

hbase的java客户端

hbase提供了java客户端去操作数据,我们通过创建一个maven项目来实现简单的数据操作。 pom.xml添加hbase插件 <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version&...

qq_25542879的博客 909

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

hbase客户端操作

hbase客户端操作  移除点击此处添加图片说明文字 集群全部搭建完毕:  移除点击此处添加图片说明文字 ​1.首先启动zookeeper集群,在bin下执行,每台都要启动 ./zkServer.sh start​​ 2.找到hadoop的sbin执行: ./start-all.sh 3.找到hbase的bin下执行: ./start-hbase.sh  移除点

大壮的博客 5683

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Hbase的客户端连接及使用

package cn.edu360.hbase.demo; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescri...

weixin_42279393的博客 2915

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

HBase 客户端类型 (四)

5.HBase Web-based UI HBase 提供了基于 web 的用户接口(UI), 利用此接口,可以观察集群的状态及其所存储的表。大多数功能时只读的,但也有几个选择性操作可以通过 web UI 触发。另一方面,可以通过 metrics 可以获取非常详细的信息。可以在各种 UI 组件间导航,快速获取当前状态,包括内存使...

xiaoyaGrace的博客 414

dotnetcore 与 hbase 之三——c# for hbase 客户端的使用

说明 在上一篇文章dotnetcore 与 hbase 之二——thrift 客户端的制作中已经可以找到 c# hbase 客户端的使用方法了,为什么这里单独列出一篇文章来讲述呢?最简单的理由就是,本篇将为客户端的使用讲述一些简化性工作以及需要注意的事项。为此,我们做了一些工作HbaseNetCore。 存在的差异 在 c# hbase 客户端中,接口基本只接受或返回 byte 数组型的...

weixin_30307921的博客 990

Apache HBase 客户端与 API 使用完全指南

Apache HBase 是一个开源的分布式列存储数据库,基于 Hadoop 生态系统构建,专为处理海量非结构化数据而设计。作为 Google Bigtable 的开源实现,HBase 提供了高可靠性、高性能和强一致性的数据存储能力。 本文将深入探讨 HBase 客户端 API 的使用,涵盖从基础连接到高级操作的完整流程,帮助开发者快速掌握 HBase 的核心编程接口。 ## 核心概念解析 ...

gitblog_00961的博客 1224

hbase客户端工具_Hbase入门讲解

更多精彩,请点击上方蓝字关注我们!1.Hbase起源 HBase是一个开源的非关系型分布式数据库,它参考了谷歌的BigTable建模,实现的编程语言为Java。它是Apache软件基金会的Hadoop项目的一部分,运行于HDFS文件系统之上,为 Hadoop 提供类似于BigTable 规模的服务。因此,它可以容错地存储海量稀疏的数据。HBase是一个高可靠、高性能、面向列...

weixin_39591386的博客 3761

hbase 客户端_Hbase架构详解

架构组成HBase采用Master/Slave架构搭建集群,它隶属于Hadoop生态系统,由一下类型节点组成:HMaster节点、HRegionServer节点、ZooKeeper集群,而在底层,它将数据存储于HDFS中,因而涉及到HDFS的NameNode、DataNode等,总体结构如下:​在物理上,HBase由master/slave类型体系结构中的三种服务器组成。RegionServer为...

weixin_39880490的博客 293

HBase 客户端类型 (一)

HBase 自带了很多用于各种编程语言客户端。   1. 介绍 (Introduction) ---------------------------- 从目前非常流行的语言和环境可以访问 HBase。可以直接使用客户端 API, 或者通过一些中间代理访问,将用户请求翻译成 API 调用。这些代理将原生的 Java API 包装成其它协议的 API,这样客户端就可以使用这些对外提供的 API 以...

devalone 的专栏 3731
上一篇: HBase 客户端类型 (一)
下一篇: HBase 客户端类型 (三)
devalone
博客等级 码龄17年 108粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值