Запрашивать данные из HBase непосредственно в Spark как RDD или через Phoenix как Dataframe? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь запросить сохраненные данные, которые находятся в HBase, для использования Spark ML в AWS EMR. Должен ли я извлекать данные как RDD (как это делается ниже), или я должен использовать Phoenix, чтобы попытаться запросить данные в качестве Dataframe?

Я пытался как вставить данные в Spark через HBase RDD, так и через Phoenix. Однако я столкнулся с осложнениями с обоими методами.

import org.apache.hadoop.hbase.{ HBaseConfiguration, HColumnDescriptor, HTableDescriptor } 
import org.apache.hadoop.hbase.client.{ HBaseAdmin, Put, Result, HTable } 
import org.apache.hadoop.hbase.io.ImmutableBytesWritable 
import org.apache.hadoop.hbase.mapred.TableOutputFormat 
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat
import org.apache.hadoop.hbase.mapreduce.TableInputFormat 
import org.apache.hadoop.hbase.util.Bytes 
import org.apache.hadoop.mapred.JobConf 
import org.apache.hadoop.hbase.client.ConnectionFactory
import org.apache.hadoop.hbase.client.Result 
import org.apache.spark.SparkConf 
import org.apache.spark.SparkContext 
import org.apache.spark.rdd.{ PairRDDFunctions, RDD } 
import org.apache.spark.streaming._ 
import org.apache.spark.streaming.StreamingContext._ 
import org.apache.spark._
import org.apache.spark.rdd.NewHadoopRDD
import org.apache.hadoop.fs.Path

val sparkConf = new SparkConf().setAppName("HBaseGet").setMaster("local[2]")

val sc = new SparkContext(sparkConf)
val conf = HBaseConfiguration.create()
val tableName = "test_hbase2"

System.setProperty("user.name", "hdfs")
System.setProperty("HADOOP_USER_NAME", "hdfs")
conf.set("hbase.master", "localhost:60000")
conf.setInt("timeout", 120000)
conf.set("hbase.zookeeper.quorum", "localhost")
conf.set("zookeeper.znode.parent", "/hbase-unsecure")
conf.set(TableInputFormat.INPUT_TABLE, tableName)

conf.set(TableInputFormat.SCAN_ROW_START, "row1");
conf.set(TableInputFormat.SCAN_ROW_STOP, "row2");

conf.addResource(new Path("/usr/hdp/current/hbase-client/conf/hbase-site.xml"))

println("Number of Records found : " + hBaseRDD.count())

После выполнения я не получаю никакого вывода, я получаю следующую ошибку:

org.apache.hadoop.hbase.client.RetriesExhaustedException: Can't get the location for replica 0

1 Ответ

0 голосов
/ 21 июня 2019

Вы можете создать таблицу кустов поверх таблицы Hbase и выполнить запрос из spark, как показано ниже -

val hbasetable_df = spark.sql(s""" select * from ${hive-db}.${hive-hbase-tablename} """)

Приведенный выше оператор создаст для вас фрейм данных, который вы можете затем изменить на rdd или зарегистрировать временную таблицу ипродолжайте писать другие преобразования SQL, если применимо.

Надеюсь, это поможет.

...