spark通过Phoenix读取hbase数据

此篇文章主要介绍用spark如何读取hbase中的数据。

 spark官方提供了用spark直接读取hbase的方法,但是直接读取hbase的数据类似于hbase shell中的scan方法全表扫描,当然如果知道rowkey当然就不会有什么问题,但是在真实的业务场景中onebyone通过rowkey去取hbase的数据是不现实的,这样也没用必要用spark去跑数据,因为发挥不出spark的性能,当用spark批量取hbase中数据去处理时,spark提供的方法就会存在很多问题。可参照一下代码:

host = 'hadoop03'
table = 'test'
conf = {"hbase.zookeeper.quorum": host, "hbase.mapreduce.inputtable": table,"zookeeper.znode.parent":"/hbase-unsecure"}
keyConv = "org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter"
valueConv = "org.apache.spark.examples.pythonconverters.HBaseResultToStringConverter"
hbase_rdd = sc.newAPIHadoopRDD("org.apache.hadoop.hbase.mapreduce.TableInputFormat","org.apache.hadoop.hbase.io.ImmutableBytesWritable","org.apache.hadoop.hbase.client.Result",keyConverter=keyConv,valueConverter=valueConv,conf=conf)
count = hbase_rdd.count()
hbase_rdd.cache()
output = hbase_rdd.collect()
for (k, v) in output:
        print (k, v)
其中,host为提交spark节点,table为hbase中表,此种方式是加载hbase中的全量数据,对于很多场景是不适用的。

同样也可以用spark向hbase中插入数据,代码可以参照:

host = 'hadoop03'
table = 'test'
keyConv = "org.apache.spark.examples.pythonconverters.StringToImmutableBytesWritableConverter"
valueConv = "org.apache.spark.examples.pythonconverters.StringListToPutConverter"
conf = {"hbase.zookeeper.quorum": host,"hbase.mapred.outputtable": table,"zookeeper.znode.parent":"/hbase-unsecure","mapreduce.outputformat.class": "org.apache.hadoop.hbase.mapreduce.TableOutputFormat","mapreduce.job.output.key.class": "org.apache.hadoop.hbase.io.ImmutableBytesWritable","mapreduce.job.output.value.class": "org.apache.hadoop.io.Writable"}
rawData = ['bbb,info,c1,Rongcheng','bbb,info,c1,Guanhua']
sc.parallelize(rawData).map(lambda x: (x[0],x.split(','))).saveAsNewAPIHadoopDataset(conf=conf,keyConverter=keyConv,valueConverter=valueConv)

 而如今常用的方法为用Phoenix读取hbase数据,Phoenix详情可见官方(Phoenix官网链接),Phoenix也为Apache项目,通过spark去连Phoenix读取hbase中的数据会方便的多,Phoenix提供的sqlApI可以很方便的通过sql去查询hbase中的数据,且官方也提供spark链接Phoenix的方法,代码如下(参见此链接)pyspark处,也提供了其他语言方法:

df = spark.read \
            .format("org.apache.phoenix.spark") \
            .option("table", TableName) \
            .option("zkurl", "hbase端口") \
            .load()
 当然,其中也包括了写入方法,这里不一一赘述。此方法load出一个sparkDF,对DF在进行相应的表映射(构建一个视图),用官方提供的方法即可,类似于createOrReplaceTempView("table"),然后再对相应的table进行sql操作即可获取想要的数据,在转成Rdd进行相应的map操作,但是在使用Phoenix的时候需要注意几个问题,Phoenix查询时以key查询会很快,但是当要查询其他字段时,同样走的全表扫描,而当hbase表的数据量很大时,此种方法任然效率很慢,但庆幸的是,通过Phoenix可以很方便的构建二级索引,有了二级索引之后,对hbase的查询就会快很多,满足大多数的业务要求,但在建二级索引的时候同样需要注意一个问题,当表的数据量足够大时,构建索引会非常耗时,且通常都构建不起来,会timeout或者抛出异常,所以在构建二级索引时最好的方式为:异步创建索引,可参考此链接中提供的方法( 点击打开链接)。

spark通过Phoenix读取hbase数据_第1张图片



你可能感兴趣的:(Spark,Hbase)