Apache Spark, HBase bağlayıcısı aracılığıyla LindormTable'da depolanan verileri sorgulayabilir ve analiz edebilir. Bu konu; bağlantıyı yapılandırma, HBase tablo şemanızı bir Spark tablosuna eşleme ve Spark SQL sorgularını çalıştırma adımlarında size rehberlik eder.
Ön Koşullar
Başlamadan önce aşağıdaki gereksinimleri karşıladığınızdan emin olun:
LindormTable sürüm 2.4.3 veya üzeri
İstemci IP adresinizin Lindorm örneği izin listesine eklenmiş olması. Bkz. Configure whitelists
Java için HBase API'sinin LindormTable uç noktası. Bkz. View endpoints
Kullanım Notları
Bir Lindorm örneğine İnternet üzerinden erişiyorsanız veya Lindorm örneğiniz tek düğümlü bir örnekse, devam etmeden önce SDK'nızı yükseltin ve yapılandırmalarınızı güncelleyin. Bkz. Use the ApsaraDB for HBase API for Java to connect to and use LindormTable içindeki 1. Adım.
-
Uygulamanız bir Elastic Compute Service (ECS) örneğinde çalışıyorsa aşağıdaki koşulları sağladığınızdan emin olun:
Lindorm örneğiniz ve ECS örneğiniz aynı bölgede bulunmalıdır. Ağ gecikme süresini azaltmak için bunları aynı alanda dağıtın.
Lindorm örneğiniz ve ECS örneğiniz aynı VPC içinde yer almalıdır.
Genel Süreç
Spark'ı LindormTable'a bağlama süreci şu adımlardan oluşur:
LindormTable bağlantı uç noktasını yapılandırın.
Bir HBase tablosu oluşturun ve veri ekleyin.
HBase sütunlarını bir Spark tablosuna eşlemek için bir katalog tanımlayın.
Kataloğu kullanarak Spark tablosunu oluşturun.
Spark tablosu üzerinde Spark SQL sorguları çalıştırın.
Bağlantıyı Yapılandırma
hbase.zookeeper.quorum parametresini Java için HBase API'sinin LindormTable uç noktasına ayarlayın. Aşağıdaki yöntemlerden birini kullanabilirsiniz:
Yöntem 1: Yapılandırma dosyası
Aşağıdaki satırı hbase-site.xml dosyasına ekleyin:
<configuration>
<!-- LindormTable endpoint of the HBase API for Java -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>ld-m5ef25p66n5es****-proxy-lindorm.lindorm.rds.aliyuncs.com:30020</value>
</property>
</configuration>
Yöntem 2: Yapılandırma nesnesi
// Create a Configuration object.
val conf = HBaseConfiguration.create()
// Specify the LindormTable endpoint of the HBase API for Java.
conf.set("hbase.zookeeper.quorum", "ld-m5ef25p66n5es****-proxy-lindorm.lindorm.rds.aliyuncs.com:30020")
Örnek
Aşağıdaki örnek; bağlantıyı yapılandırma, HBase tablosu oluşturma, veri ekleme, katalog ile Spark tablosu tanımlama ve COUNT() sorgusu çalıştırma dahil olmak üzere uçtan uca iş akışını gösterir.
1. Adım: Bağlantıyı yapılandırma
var conf = HBaseConfiguration.create
conf.set("hbase.zookeeper.quorum", "ld-m5ef25p66n5es****-proxy-lindorm.lindorm.rds.aliyuncs.com:30020")
2. Adım: HBase tablosu oluşturma
val hbaseTableName = "testTable"
val cf = "f"
val column1 = cf + ":a"
val column2 = cf + ":b"
var namespace = "spark_test"
val admin = ConnectionFactory.createConnection(conf).getAdmin()
val tableName = TableName.valueOf(namespace, hbaseTableName)
val htd = new HTableDescriptor(tableName)
htd.addFamily(new HColumnDescriptor(cf))
admin.createTable(htd)
3. Adım: Veri ekleme
val k: Array[Byte] = new Array[Byte](3)
val famAndQf = KeyValue.parseColumn(Bytes.toBytes(column1))
val puts = new util.ArrayList[Put]()
var i = 0
for (b1 <- ('a' to 'z')) {
for (b2 <- ('a' to 'z')) {
for (b3 <- ('a' to 'z')) {
if (i < 10) {
k(0) = b1.toByte
k(1) = b2.toByte
k(2) = b3.toByte
val put = new Put(k)
put.addColumn(famAndQf(0), famAndQf(1), ("value_" + b1 + b2 + b3).getBytes())
puts.add(put)
i = i + 1
}
}
}
}
val conn = ConnectionFactory.createConnection(conf)
val table = conn.getTable(tableName)
table.put(puts)
4. Adım: Katalog kullanarak Spark tablosu oluşturma
Katalog, HBase tablonuz ile Spark tablosu arasındaki eşlemeyi tanımlar. Satır anahtarını belirtir ve her Spark sütununu bir HBase sütun ailesi ile sütun niteleyicisine eşler. Katalog, CREATE TABLE deyiminin OPTIONS yan tümcesinde JSON dizesi olarak geçirilir.
val sparkTableName = "spark_hbase"
val createCmd =
s"""CREATE TABLE ${sparkTableName} USING org.apache.hadoop.hbase.spark
|OPTIONS ('catalog'=
|'{"table":{"namespace":"${namespace}", "name":"${hbaseTableName}"},
|"rowkey":"rowkey",
|"columns":{
|"col0":{"cf":"rowkey", "col":"rowkey", "type":"string"},
|"col1":{"cf":"f", "col":"a", "type":"string"},
|"col2":{"cf":"f", "col":"b", "type":"string"}}}')
""".stripMargin
sparkSession.sql(createCmd)
5. Adım: Spark SQL sorgusu çalıştırma
val result = sparkSession.sql("select count(*) from " + sparkTableName)
val sparkCounts = result.collect().apply(0).getLong(0)
println("Row count: " + sparkCounts)