spark-shell 通过scala 连接、操作hbase

2 篇文章 0 订阅
1 篇文章 0 订阅

//1) 建立表, 表名:test 字段名: cf
//安装hbase 后通过hbase-shell启动hbase命令行方式
//参考:https://www.w3cschool.cn/hbase_doc/hbase_doc-7hpa2llr.html
create ‘test’, ‘cf’

//desc 表信息
list ‘test’

//插值
put ‘test’, ‘row1’, ‘cf:a’, ‘value1’
put ‘test’, ‘row1’, ‘cf:b’, ‘value2’

put ‘test’, ‘row2’, ‘cf:a’, ‘value21’
put ‘test’, ‘row2’, ‘cf:b’, ‘value22’

//select 所有表信息
scan ‘test’

//获取记录信息
get ‘test’, ‘row1’

//禁用表
disable ‘test’
enable ‘test’

//删除表
disable ‘test’
drop ‘test’

// 2) 使用spark-shell调用hbase
// 2.1 必须确保以下文件在目录中存在,没有就需要设法复制。复制到哪个目录无所谓,下面的SPARK_CLASSPATH可以指定
cp hbase* /home/hadoop/app/spark-1.6.1-bin-hadoop2.6/lib
cp guava-14.0.1.jar /home/hadoop/app/spark-1.6.1-bin-hadoop2.6/lib
cp htrace-core-3.1.0-incubating.jar /home/hadoop/app/spark-1.6.1-bin-hadoop2.6/lib
cp protobuf-java-2.5.0.jar /home/hadoop/app/spark-1.6.1-bin-hadoop2.6/lib

// 2.2. 可以通过以下命令检查主要的jar 文件是否存在,最好把所有以下SPARK_CLASSPATH中指定的所有文件全都检查一遍
ls /home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.45-bin.jar
ls /home/hadoop/app/hbase-1.5.0/lib/hbase-server-1.5.0.jar
ls /home/hadoop/app/hbase-1.5.0/lib/hbase-protocol-1.5.0.jar
ls /home/hadoop/app/hbase-1.5.0/lib/hbase-hadoop2-compat-1.5.0.jar
ls /home/hadoop/app/hbase-1.5.0/lib/hbase-client-1.5.0.jar
ls /home/hadoop/app/hbase-1.5.0/lib/hbase-common-1.5.0.jar
ls /home/hadoop/app/hbase-1.5.0/lib/guava-12.0.1.jar
ls /home/hadoop/app/hbase-1.5.0/lib/htrace-core-3.1.0-incubating.jar
ls /home/hadoop/app/hbase-1.5.0/lib/protobuf-java-2.5.0.jar
ls /home/hadoop/app/hbase-1.5.0/lib/metrics-core-3.1.2.jar

// 2.3 重中之重,以下所有文件必须都包括在内,否则永远报错
export SPARK_CLASSPATH=/home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.45-bin.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-annotations-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-hadoop2-compat-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-prefix-tree-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-server-1.5.0-tests.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-annotations-1.5.0-tests.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-hadoop-compat-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-procedure-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-shaded-gson-3.0.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-client-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-hbtop-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-protocol-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-shell-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-common-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-it-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-resource-bundle-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-thrift-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-common-1.5.0-tests.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-it-1.5.0-tests.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-rest-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-examples-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-metrics-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-rsgroup-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-external-blockcache-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-metrics-api-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-server-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-server-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-protocol-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-hadoop2-compat-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-client-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-common-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/guava-12.0.1.jar:/home/hadoop/app/hbase-1.5.0/lib/htrace-core-3.1.0-incubating.jar:/home/hadoop/app/hbase-1.5.0/lib/protobuf-java-2.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/metrics-core-3.1.2.jar:/home/hadoop/app/hbase-1.5.0/lib/metrics-core-2.2.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-metrics-1.5.0.jar:/home/hadoop/app/hbase-1.5.0/lib/hbase-metrics-api-1.5.0.jar

// 2.4 启动spark-shell
spark-shell --master spark://localhost:7077 --executor-memory 1g --total-executor-cores 2

// 3 导入所有需要的文件
import java.io.IOException
import org.apache.spark.rdd.NewHadoopRDD
import org.apache.hadoop.mapred.JobConf
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.mapreduce.Job
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat
import org.apache.hadoop.fs.Path
import org.apache.hadoop.hbase.client.{HBaseAdmin, Put, Result}
import org.apache.hadoop.hbase.HColumnDescriptor
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapred.TableOutputFormat
import org.apache.hadoop.hbase._
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat
import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles
import org.apache.hadoop.hbase.{HBaseConfiguration, HColumnDescriptor, HTableDescriptor, TableName}
import org.apache.hadoop.hbase.client._
import org.apache.hadoop.hbase.client.HBaseAdmin
import org.apache.hadoop.hbase.client.HTable
import org.apache.hadoop.hbase.client.Scan
import org.apache.hadoop.hbase.client.Get
import org.apache.hadoop.hbase.protobuf.ProtobufUtil
import org.apache.hadoop.hbase.util.{Base64,Bytes}
import org.apache.hadoop.hbase.KeyValue
import org.apache.hadoop.mapred.JobConf
import org.apache.hadoop.mapreduce.Job
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapred.TableOutputFormat
import org.apache.hadoop.hbase.util.JsonMapper
import org.apache.commons.codec.digest.DigestUtils
import org.apache.hadoop.hbase.metrics
import org.apache.spark._

//3.1) 查找表,查找记录
// 参考: https://www.cnblogs.com/zzhangyuhang/p/9018739.html
val conf = HBaseConfiguration.create();
conf.set(TableInputFormat.INPUT_TABLE,“test”)
val stuRdd = sc.newAPIHadoopRDD(conf,classOf[TableInputFormat],
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
classOf[org.apache.hadoop.hbase.client.Result]);
stuRdd.cache();//持久化
//计算数据条数
val count = stuRdd.count();
println(“Student rdd count:”+count);

//3.2)写入单条记录
val i=3
var put= new Put(Bytes.toBytes(“row” + i));
// column name:cf … sub-column name: a … value: i
put.add(Bytes.toBytes(“cf”),Bytes.toBytes(“a”),Bytes.toBytes(“value”+i));
table.put(put)

//3.3)循环写入多条记录
for(i <- 5 to 100){
var put= new Put(Bytes.toBytes(“row”+i));
// column name:cf … sub-column name: a … value: i
put.add(Bytes.toBytes(“cf”),Bytes.toBytes(“a”),Bytes.toBytes(“value”+i));
put.add(Bytes.toBytes(“cf”),Bytes.toBytes(“b”),Bytes.toBytes(“value”+i+1));
table.put(put)
}

//仅获取表信息,没有实质作用
val hbaseRdd = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],classOf[org.apache.hadoop.hbase.client.Result])
var scan = new Scan();
scan.addFamily(Bytes.toBytes(“cf”));
var proto = ProtobufUtil.toScan(scan)
var scanToString = Base64.encodeBytes(proto.toByteArray());
conf.set(TableInputFormat.SCAN,scanToString)

//3.5) 获取整个数据集
val hbaseRdd = sc.newAPIHadoopRDD(
conf,
classOf[TableInputFormat],
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
classOf[org.apache.hadoop.hbase.client.Result]
)

val datas = hbaseRdd.map( x=>x._2).map{
result => (
result.getRow,result.getValue(Bytes.toBytes(“cf”),Bytes.toBytes(“a”)))}.map(
row => (new String(row._1),new String(row._2))).collect.foreach(r => (
println(r._1+":"+r._2)
)
)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了您的问题。下面是具体的步骤: 1. 首先需要在Spark的classpath中添加相关的Jar包: ``` spark-shell --master yarn --jars /path/to/hive-jdbc.jar,/path/to/hbase-client.jar,/path/to/hbase-common.jar,/path/to/hbase-server.jar,/path/to/hive-exec.jar,/path/to/hive-metastore.jar ``` 这里的Jar包路径需要根据您的实际情况进行修改。 2. 接下来需要创建HiveContext,然后使用HiveContext读取Hive表中的数据: ```scala val hiveContext = new HiveContext(sc) val df = hiveContext.sql("select * from mytable") ``` 这里的mytable是您需要上传到HBase的Hive表名,可以根据实际情况进行修改。 3. 创建HBase连接和表: ```scala val hbaseConf = HBaseConfiguration.create() hbaseConf.set("hbase.zookeeper.quorum", "your.zookeeper.quorum") val tableName = TableName.valueOf("mytable") val hBaseConn = ConnectionFactory.createConnection(hbaseConf) val hBaseTable = hBaseConn.getTable(tableName) ``` 其中,hbase.zookeeper.quorum需要设置为您的Zookeeper集群的地址,mytable是您需要在HBase中创建的表名。 4. 将Hive表中的数据上传到HBase: ```scala df.foreachPartition { partition => val hBasePuts = new util.ArrayList[Put]() partition.foreach { row => val put = new Put(Bytes.toBytes(row.getString(0))) // 这里假设第一列是RowKey // 依次将每个列族的每个列添加到Put中 put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"), Bytes.toBytes(row.getString(1))) put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col2"), Bytes.toBytes(row.getString(2))) hBasePuts.add(put) } hBaseTable.put(hBasePuts) } ``` 这里将每个Hive表中的行转换为HBase中的Put,并将这些Put添加到一个List中,最后一次性将这个List中的所有Put上传到HBase。 5. 最后不要忘记关闭HBase连接: ```scala hBaseTable.close() hBaseConn.close() ``` 以上就是用Spark连接Hive并将数据上传到HBase的具体步骤。希望能帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值