Spark读取Hbase中的数据
大家可能都知道很熟悉Spark的两种常见的数据读取方式(存放到RDD中):(1)、调用parallelize函数直接从集合中获取数据,并存入RDD中;Java版本如下:
JavaRDD<Integer> myRDD = sc.parallelize(Arrays.asList(1,2,3)); |
Scala版本如下:
val myRDD= sc.parallelize(List(1,2,3)) |
这种方式很简单,很容易就可以将一个集合中的数据变成RDD的初始化值;更常见的是(2)、从文本中读取数据到RDD中,这个文本可以是纯文本文件、可以是sequence文件;可以存放在本地(file://)、可以存放在HDFS(hdfs://)上,还可以存放在S3上。其实对文件来说,Spark支持Hadoop所支持的所有文件类型和文件存放位置。Java版如下:
///////////////////////////////////////////////////////////////////// User: 过往记忆 Date: 14-6-29 Time: 23:59 bolg: 本文地址:/archives/1051 过往记忆博客,专注于hadoop、hive、spark、shark、flume的技术博客,大量的干货 过往记忆博客微信公共帐号:iteblog_hadoop/////////////////////////////////////////////////////////////////////import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.api.java.JavaSparkContext;SparkConf conf = new SparkConf().setAppName("Simple Application");JavaSparkContext sc = new JavaSparkContext(conf);sc.addFile("wyp.data");JavaRDD<String> lines = sc.textFile(SparkFiles.get("wyp.data")); |
Scala版本如下:
import org.apache.spark.SparkContextimport org.apache.spark.SparkConfval conf = new SparkConf().setAppName("Simple Application")val sc = new SparkContext(conf)sc.addFile("spam.data")val inFile = sc.textFile(SparkFiles.get("spam.data")) |
在实际情况下,我们需要的数据可能不是简单的存放在HDFS文本中,我们需要的数据可能就存放在Hbase中,那么我们如何用Spark来读取Hbase中的数据呢?本文的所有测试是基于Hadoop 2.2.0、Hbase 0.98.2、Spark 0.9.1,不同版本可能代码的编写有点不同。本文只是简单地用Spark来读取Hbase中的数据,如果需要对Hbase进行更强的操作,本文可能不能帮你。话不多说,Spark操作Hbase的Java版本代码如下:
package com.iteblog.spark; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
import org.apache.hadoop.hbase.util.Base64;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Serializable;
import scala.Tuple2; import java.io.IOException;
import java.util.List; /**
* User: iteblog
* Date: 14-6-27
* Time: 下午5:18
*blog: http://www.iteblog.com
*
* Usage: bin/spark-submit --master yarn-cluster --class com.iteblog.spark.SparkFromHbase
* --jars /home/q/hbase/hbase-0.96.0-hadoop2/lib/htrace-core-2.01.jar,
* /home/q/hbase/hbase-0.96.0-hadoop2/lib/hbase-common-0.96.0-hadoop2.jar,
* /home/q/hbase/hbase-0.96.0-hadoop2/lib/hbase-client-0.96.0-hadoop2.jar,
* /home/q/hbase/hbase-0.96.0-hadoop2/lib/hbase-protocol-0.96.0-hadoop2.jar,
* /home/q/hbase/hbase-0.96.0-hadoop2/lib/hbase-server-0.96.0-hadoop2.jar
* ./spark_2.10-1.0.jar
*/
public class SparkFromHbase implements Serializable { /**
* copy from org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil
*
* @param scan
* @return
* @throws IOException
*/
String convertScanToString(Scan scan) throws IOException {
ClientProtos.Scan proto = ProtobufUtil.toScan(scan);
return Base64.encodeBytes(proto.toByteArray());
} public void start() {
SparkConf sparkConf = new SparkConf();
JavaSparkContext sc = new JavaSparkContext(sparkConf); Configuration conf = HBaseConfiguration.create(); Scan scan = new Scan();
//scan.setStartRow(Bytes.toBytes("195861-1035177490"));
//scan.setStopRow(Bytes.toBytes("195861-1072173147"));
scan.addFamily(Bytes.toBytes("cf"));
scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col_1")); try { String tableName = "wyp";
conf.set(TableInputFormat.INPUT_TABLE, tableName);
conf.set(TableInputFormat.SCAN, convertScanToString(scan)); JavaPairRDD<ImmutableBytesWritable, Result> hBaseRDD = sc.newAPIHadoopRDD(conf,
TableInputFormat.class, ImmutableBytesWritable.class,
Result.class); JavaPairRDD<String, Integer> levels = hBaseRDD.mapToPair(
new PairFunction<Tuple2<ImmutableBytesWritable, Result>, String, Integer>() {
@Override
public Tuple2<String, Integer> call(Tuple2<ImmutableBytesWritable, Result> immutableBytesWritableResultTuple2) throws Exception {
byte[] o = immutableBytesWritableResultTuple2._2().getValue(Bytes.toBytes("cf"), Bytes.toBytes("col_1"));
if (o != null) {
return new Tuple2<String, Integer>(new String(o), 1);
}
return null;
}
}); JavaPairRDD<String, Integer> counts = levels.reduceByKey(
new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer i1, Integer i2) {
return i1 + i2;
}
}); List<Tuple2<String, Integer>> output = counts.collect();
for (Tuple2 tuple : output) {
System.out.println(tuple._1() + ": " + tuple._2());
} sc.stop(); } catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) throws InterruptedException {
new SparkFromHbase().start();
System.exit(0);
}
}
这样本段代码段是从Hbase表名为flight_wap_order_log的数据库中读取cf列簇上的airName一列的数据,这样我们就可以对myRDD进行相应的操作:
System.out.println(myRDD.count()); |
本段代码需要在pom.xml文件加入以下依赖:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.10</artifactId> <version>0.9.1</version></dependency><dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase</artifactId> <version>0.98.2-hadoop2</version></dependency><dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>0.98.2-hadoop2</version></dependency><dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-common</artifactId> <version>0.98.2-hadoop2</version></dependency><dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>0.98.2-hadoop2</version></dependency> |
Scala版如下:
import org.apache.spark._import org.apache.spark.rdd.NewHadoopRDDimport org.apache.hadoop.hbase.{HBaseConfiguration, HTableDescriptor}import org.apache.hadoop.hbase.client.HBaseAdminimport org.apache.hadoop.hbase.mapreduce.TableInputFormat///////////////////////////////////////////////////////////////////// User: 过往记忆 Date: 14-6-29 Time: 23:59 bolg: 本文地址:/archives/1051 过往记忆博客,专注于hadoop、hive、spark、shark、flume的技术博客,大量的干货 过往记忆博客微信公共帐号:iteblog_hadoop/////////////////////////////////////////////////////////////////////object HBaseTest { def main(args: Array[String]) { val sc = new SparkContext(args(0), "HBaseTest", System.getenv("SPARK_HOME"), SparkContext.jarOfClass(this.getClass)) val conf = HBaseConfiguration.create() conf.set(TableInputFormat.INPUT_TABLE, args(1)) val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable], classOf[org.apache.hadoop.hbase.client.Result]) hBaseRDD.count() System.exit(0) }} |
我们需要在加入如下依赖:
libraryDependencies ++= Seq( "org.apache.spark" % "spark-core_2.10" % "0.9.1", "org.apache.hbase" % "hbase" % "0.98.2-hadoop2", "org.apache.hbase" % "hbase-client" % "0.98.2-hadoop2", "org.apache.hbase" % "hbase-common" % "0.98.2-hadoop2", "org.apache.hbase" % "hbase-server" % "0.98.2-hadoop2") |
在测试的时候,需要配置好Hbase、Hadoop环境,否则程序会出现问题,特别是让程序找到Hbase-site.xml配置文件。
| package com.iteblog.spark; | |
| import org.apache.hadoop.conf.Configuration; | |
| import org.apache.hadoop.hbase.HBaseConfiguration; | |
| import org.apache.hadoop.hbase.client.Result; | |
| import org.apache.hadoop.hbase.client.Scan; | |
| import org.apache.hadoop.hbase.io.ImmutableBytesWritable; | |
| import org.apache.hadoop.hbase.mapreduce.TableInputFormat; | |
| import org.apache.hadoop.hbase.protobuf.ProtobufUtil; | |
| import org.apache.hadoop.hbase.protobuf.generated.ClientProtos; | |
| import org.apache.hadoop.hbase.util.Base64; | |
| import org.apache.hadoop.hbase.util.Bytes; | |
| import org.apache.spark.SparkConf; | |
| import org.apache.spark.api.java.JavaPairRDD; | |
| import org.apache.spark.api.java.JavaSparkContext; | |
| import org.apache.spark.api.java.function.Function2; | |
| import org.apache.spark.api.java.function.PairFunction; | |
| import scala.Serializable; | |
| import scala.Tuple2; | |
| import java.io.IOException; | |
| import java.util.List; | |
| /** | |
| * User: iteblog | |
| * Date: 14-6-27 | |
| * Time: 下午5:18 | |
| *blog: http://www.iteblog.com | |
| * | |
| * Usage: bin/spark-submit --master yarn-cluster --class com.iteblog.spark.SparkFromHbase | |
| * --jars /home/q/hbase/hbase-0.96.0-hadoop2/lib/htrace-core-2.01.jar, | |
| * /home/q/hbase/hbase-0.96.0-hadoop2/lib/hbase-common-0.96.0-hadoop2.jar, | |
| * /home/q/hbase/hbase-0.96.0-hadoop2/lib/hbase-client-0.96.0-hadoop2.jar, | |
| * /home/q/hbase/hbase-0.96.0-hadoop2/lib/hbase-protocol-0.96.0-hadoop2.jar, | |
| * /home/q/hbase/hbase-0.96.0-hadoop2/lib/hbase-server-0.96.0-hadoop2.jar | |
| * ./spark_2.10-1.0.jar | |
| */ | |
| public class SparkFromHbase implements Serializable { | |
| /** | |
| * copy from org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil | |
| * | |
| * @param scan | |
| * @return | |
| * @throws IOException | |
| */ | |
| String convertScanToString(Scan scan) throws IOException { | |
| ClientProtos.Scan proto = ProtobufUtil.toScan(scan); | |
| return Base64.encodeBytes(proto.toByteArray()); | |
| } | |
| public void start() { | |
| SparkConf sparkConf = new SparkConf(); | |
| JavaSparkContext sc = new JavaSparkContext(sparkConf); | |
| Configuration conf = HBaseConfiguration.create(); | |
| Scan scan = new Scan(); | |
| //scan.setStartRow(Bytes.toBytes("195861-1035177490")); | |
| //scan.setStopRow(Bytes.toBytes("195861-1072173147")); | |
| scan.addFamily(Bytes.toBytes("cf")); | |
| scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col_1")); | |
| try { | |
| String tableName = "wyp"; | |
| conf.set(TableInputFormat.INPUT_TABLE, tableName); | |
| conf.set(TableInputFormat.SCAN, convertScanToString(scan)); | |
| JavaPairRDD<ImmutableBytesWritable, Result> hBaseRDD = sc.newAPIHadoopRDD(conf, | |
| TableInputFormat.class, ImmutableBytesWritable.class, | |
| Result.class); | |
| JavaPairRDD<String, Integer> levels = hBaseRDD.mapToPair( | |
| new PairFunction<Tuple2<ImmutableBytesWritable, Result>, String, Integer>() { | |
| @Override | |
| public Tuple2<String, Integer> call(Tuple2<ImmutableBytesWritable, Result> immutableBytesWritableResultTuple2) throws Exception { | |
| byte[] o = immutableBytesWritableResultTuple2._2().getValue(Bytes.toBytes("cf"), Bytes.toBytes("col_1")); | |
| if (o != null) { | |
| return new Tuple2<String, Integer>(new String(o), 1); | |
| } | |
| return null; | |
| } | |
| }); | |
| JavaPairRDD<String, Integer> counts = levels.reduceByKey( | |
| new Function2<Integer, Integer, Integer>() { | |
| @Override | |
| public Integer call(Integer i1, Integer i2) { | |
| return i1 + i2; | |
| } | |
| }); | |
| List<Tuple2<String, Integer>> output = counts.collect(); | |
| for (Tuple2 tuple : output) { | |
| System.out.println(tuple._1() + ": " + tuple._2()); | |
| } | |
| sc.stop(); | |
| } catch (Exception e) { | |
| e.printStackTrace(); | |
| } | |
| } | |
| public static void main(String[] args) throws InterruptedException { | |
| new SparkFromHbase().start(); | |
| System.exit(0); | |
| } | |
| } |
Spark读取Hbase中的数据的更多相关文章
- IDEA中Spark读Hbase中的数据
import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.io.ImmutableBytesWr ...
- IDEA中Spark往Hbase中写数据
import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.io.ImmutableBytesWr ...
- Spark 读取HBase和SolrCloud数据
Spark1.6.2读取SolrCloud 5.5.1 //httpmime-4.4.1.jar // solr-solrj-5.5.1.jar //spark-solr-2.2.2-20161007 ...
- Spark读写Hbase中的数据
def main(args: Array[String]) { val sparkConf = new SparkConf().setMaster("local").setAppN ...
- 用Spark向HBase中插入数据
java代码如下: package db.insert; import java.util.Iterator; import java.util.StringTokenizer; import org ...
- 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- Spark读取HDFS中的Zip文件
1. 任务背景 近日有个项目任务,要求读取压缩在Zip中的百科HTML文件,经分析发现,提供的Zip文件有如下特点(=>指代对应解决方案): (1) 压缩为分卷文件 => 只需将解压缩在同 ...
- Python中如何读取xls中的数据
要想读取EXCEL中的数据,首先得下载xlrd包,地址:https://pypi.python.org/pypi/xlrd 安装方法:下载解压后,利用windows dos命令进入解压目录eg,c ...
- 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释
在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...
随机推荐
- VMware虚拟机,vps忘记密码修改密码
因为业务经常会用到虚拟机,然后过不了多久,登录密码就用不了. 解决问题有两种办法,其中一种是通过Dos命令窗:还有一个就是通过制作pe启动盘来操作,进行密码重置,删除等等. 制作pe启动盘的方式有 ...
- 搭建Istio基础环境
需求 搭建istio基础环境(基于1.5.1版本) 安装步骤 在安装 Istio 之前,需要一个运行着 Kubernetes 的环境,安装步骤可以参考前面的文章 下载istio,然后解压,然后将 is ...
- 如何使用git命令行上传项目到github
第一步:我们需要先创建一个本地的版本库(其实也就是一个文件夹). 你可以直接右击新建文件夹,也可以右击打开Git bash命令行窗口通过命令来创建. 现在我通过命令行在桌面新建一个TEST文件夹(你也 ...
- Life In Changsha College- SQA计划与验收测试规程
本次任务 以前面小组完成的SCRUM设计任务作为背景,拟制软件开发任务的虚拟SQA计划. 编制前面小组完成的SCRUM设计任务的验收测试规程. SQA计划 验收测试规程 测试分析:工程完成的功能包括登 ...
- [256个管理学理论]002.青蛙效应(Frog Effect)
青蛙效应(Frog Effect) 从一个话题开始: 当下,社会发展突飞猛进,日新月异.在世界经济危机中,我国国民生产总值增长幅度始终在8%以上,引起世人的瞩目. 但,在国内时常也能听到广大投资者对股 ...
- 【转】DataFrame合并
参考:python 把几个DataFrame合并成一个DataFrame——merge,append,join,conca 横向合并(扩展列):merge,类似SQL的join,内连接,外连接等. 纵 ...
- 【转】最长公共子序列(LCS),求LCS长度和打印输出LCS
求LCS的长度,Java版本: public static int LCS(int[]a,int[] b) { int [][]c=new int[a.length+1][b.length+1]; f ...
- Spring IoC componet-scan 节点解析详解
前言 我们在了解 Spring 容器的扩展功能 (ApplicationContext) 之前,先介绍下 context:componet-scan 标签的解析过程,其作用很大是注解能生效的关键所在. ...
- python 反向shell后门
linux 编码改为utf-8,windows 默认gbk,python一般都是白名单减少查杀可能性,端口可以改为443,ssl混肴数据传输. python client端 import subpro ...
- vnc server,vnc server去哪下载,下载后如何连接使用(vnc viewer)
vnc server是vnc服务端,通过需要下载的服务器连接之后在服务器端下载. 1.使用到的工具:iis7服务器管理 2.首先去服务器端下载vnc 3.根据要求安装结束,得到登录密码. 4.用IIS ...