Spark案例:Spark on HBase样例
1.1场景说明
适用版本
FusionInsight HD V100R002C70、FusionInsight HD V100R002C80。
场景说明
用户可以使用Spark调用HBase的接口来操作HBase表的功能。在Spark应用中,用户可以自由使用HBase的接口来实现创建表、读取表、往表中插入数据等操作。
数据规划
首先需要把数据文件放置在HDFS系统里。
1.本地新建文本文件,将data文件中的内容复制保存到input_data1.txt。
2.在HDFS上建立一个文件夹,“/tmp/input”,并上传input_data1.txt到此目录,命令如下:
a.在HDFS客户端,执行如下命令获取安全认证。
cd /opt/hadoopclient
kinit
b.在Linux系统HDFS客户端使用命令hadoop
fs -mkdir /tmp/input(hdfs
dfs命令有同样的作用),创建对应目录。
c.在Linux系统HDFS客户端使用命令hadoop
fs -put input_data1.txt /tmp/input,上传数据文件。
1.2开发思路
1.创建HBase表。
2.往HBase表中插入数据。
3.通过Spark Application读取HBase表的数据。
1.3样例代码说明
1.3.1JAVA代码样例
功能简介
在Spark应用中,通过使用HBase接口来实现创建表,读取表,往表中插入数据等操作。
代码样例
下面代码片段仅为演示,具体代码参见SparkOnHbaseJavaExample:
样例:创建HBase表
public class TableCreation {
public static void main (String[] args) throws IOException {
SparkConf conf = new
SparkConf().setAppName("CollectFemaleInfo");
JavaSparkContext jsc = new
JavaSparkContext(conf);
Configuration hbConf = HBaseConfiguration.create(jsc.hadoopConfiguration());
// 创建和hbase的连接通道
Connection connection = ConnectionFactory.createConnection(hbConf);
// 声明表的描述信息
TableName userTable =
TableName.valueOf("shb1");
HTableDescriptor tableDescr = new
HTableDescriptor(userTable);
tableDescr.addFamily(new
HColumnDescriptor("info".getBytes()));
// 创建表
System.out.println("Creating
table shb1. ");
Admin admin = connection.getAdmin();
if (admin.tableExists(userTable)) {
admin.disableTable(userTable);
admin.deleteTable(userTable);
}
admin.createTable(tableDescr);
connection.close();
jsc.stop();
System.out.println("Done!");
}
}
样例:在HBase表中插入数据
public class TableInputData {
public static void main(String[] args) throws IOException {
// 建立连接hbase的配置参数,此时需要保证hbase-site.xml在classpath中
SparkConf conf = new
SparkConf().setAppName("CollectFemaleInfo");
JavaSparkContext jsc = new JavaSparkContext(conf);
Configuration hbConf =
HBaseConfiguration.create(jsc.hadoopConfiguration());
// 声明表的信息
Table table = null;
String tableName = "shb1";
byte[] familyName = Bytes.toBytes("info");
Connection connection = null;
try {
// 获取hbase连接
connection =
ConnectionFactory.createConnection(hbConf);
// 获取table对象
table =
connection.getTable(TableName.valueOf(tableName));
List
String>> data = jsc.textFile(args[0]).map(
new Function
Tuple4>() {
public
Tuple4 call(String s) throws Exception {
String[] tokens = s.split(",");
return new Tuple4(tokens[0], tokens[1],
tokens[2], tokens[3]);
}
}).collect();
Integer i = 0;
for (Tuple4
String> line : data) {
Put put = new
Put(Bytes.toBytes("row" + i));
put.addColumn(familyName,
Bytes.toBytes("c11"), Bytes.toBytes(line._1()));
put.addColumn(familyName,
Bytes.toBytes("c12"), Bytes.toBytes(line._2()));
put.addColumn(familyName,
Bytes.toBytes("c13"), Bytes.toBytes(line._3()));
put.addColumn(familyName,
Bytes.toBytes("c14"), Bytes.toBytes(line._4()));
i += 1;
table.put(put);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (table != null) {
try {
// 关闭table对象
table.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {