如何将数据从SparkR插入hadoop集群中的Hbase

时间:2018-10-18 12:01:05

标签: r apache-spark hadoop hbase sparkr

我正在寻求有关将SparkR数据直接加载到HBase中的帮助。 读取功能在我可以使用SparkR(sparkR.session)从Hive外部表读取数据的地方起作用

执行的步骤:

  • 创建了一个HBase表(hbase_test1)
  • 在Hive中创建一个外部表以映射Hive中的HBase表(test1)

代码:

library(SparkR)

sc <- sparkR.session(master = "local",sparkEnvir = list(spark.driver.memory="2g",enableHiveSupport=TRUE))
sqlContext <- sparkR.session(sc)

df <- sql("show tables")
collect(df)

sdf <- sql("SELECT * from test1")

这就是我的立场。

我可以直接从SparkR将数据直接写入HBase吗? 仅供参考:对于某些ML代码,我需要使用SparkR。结果需要保存回HBase。请注意,我正在使用所有开源工具。

1 个答案:

答案 0 :(得分:0)

如果没有其他部署,则可以使用Apache Spark - Apache HBase Connector

首先,您必须包括包装。可以使用以下选项*

spark.jars.packages  com.hortonworks:shc-core:1.1.1-2.1-s_2.11
spark.jars.repositories http://repo.hortonworks.com/content/groups/public/

在您的spark-defaults.confspark-submit / SparkR的等效命令行参数中

--packages com.hortonworks:shc-core:1.1.1-2.1-s_2.11 \
--repositories http://repo.hortonworks.com/content/groups/public/ 

该软件包的版本(上述s_2.11)必须与用于构建Spark的Scala版本相匹配。

现在假设您将表定义为

create 'FooBar', 'Foo', 'Bar'

,并且您希望SparkR插入等效于:

put 'FooBar', '1000', 'Foo:Value', 'x1'
put 'FooBar', '1000', 'Bar:Value', 'y1'
put 'FooBar', '2000', 'Foo:Value', 'x2'
put 'FooBar', '2000', 'Bar:Value', 'y2'

您必须提供目录映射:

catalog = '{
  "table":{"namespace":"default", "name":"FooBar"},
  "rowkey":"key",
  "columns":{
  "rowkey":{"cf":"rowkey", "col":"key", "type":"string"},
  "foo_value":{"cf":"Foo", "col":"Value", "type":"string"},
  "bar_value":{"cf":"Bar", "col":"Value", "type":"string"}
  }
}'

和输入表:

df <- createDataFrame(data.frame(
  rowkey = c("1000", "2000"), foo_value = c("x1", "x2"), bar_value = c("y1", "y2")
))

最后,您可以使用以下选项来应用write.ml

write.df(df, 
   source = "org.apache.spark.sql.execution.datasources.hbase", 
   mode = "append", catalog = catalog)

有关详细信息,请参阅official connector documantion

如果您不介意其他依赖项,则可以部署Apache Phoenix,映射HBase表(例如检查PHOENIX-447),然后使用the official connectorbuilt-in JDBC source ,以写入您的数据。

需要支付额外费用,才能提供更好的用户体验。例如,如果您将Phoenix表定义为:

CREATE TABLE foobar (
  id VARCHAR NOT NULL PRIMARY KEY, 
  foo INTEGER, 
  bar VARCHAR
); 

您可以

SparkR:::callJStatic(
  "java.lang.Class", "forName",  
  "org.apache.phoenix.jdbc.PhoenixDriver"
)


df <- createDataFrame(data.frame(
  id = c("1000", "2000"), foo = c(1, 2), bar = c("x", "y")
))


write.df(
  dfr, source = "org.apache.phoenix.spark", 
  # Note that the only supported mode is `overwrite`, 
  # which in fact works like `UPSERT`
  mode = "overwrite",
  table = "FooBar", 
  # ZooKeeper URL
  zkUrl = "host:port"  
)

类似于第一个选项,您必须包含corresponding connector。但是,与HBase连接器不同,它不是自给自足的,需要CLASSPATH上的Phoenix Core和Client jar。


*不要忘记以后调整软件包的版本。