【问题标题】:How Insert data from SparkR to Hbase in hadoop cluster如何将数据从 SparkR 插入到 hadoop 集群中的 Hbase
【发布时间】:2019-03-23 05:36:30
【问题描述】:

我正在寻求将 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。请注意,我使用的是所有开源工具。

【问题讨论】:

    标签: r apache-spark hadoop hbase sparkr


    【解决方案1】:

    无需额外部署即可使用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。


    * 以后别忘了调整包的版本。

    【讨论】:

    • 我不得不编辑我的评论,因此重写了它。我已经尝试了上述步骤(第二个选项)。当我尝试将内容写入 HBase 表时,出现错误:错误:保存时出错:org.apache.spark.sql.execution.datasources.hbase.InvalidRegionNumberException:为新表指定的区域数必须大于3. 同样,当我使用提到的第一个选项使用 RStudio 尝试相同的操作时,似乎没有任何效果。请提出建议。
    • 请注意,我想将内容写回到现有的 HBase 表中,我从中读取数据并执行一些挖掘。使用 Hadoop 2.9.0,HBase 版本:1.4.7 和 Spark 2.3.0 为 Hadoop 预构建。
    • 不是与github.com/hortonworks-spark/shc/issues/76 相关的错误(但它适用于第一个选项而不是第二个选项)。对于第二个 - 如果你有现有的 Hbase 表,它不会暴露给 Phoenix。如果我没记错的话,为了能够访问它,你必须创建一个匹配的 Phoenix 视图。
    • 感谢您的及时回复。我已经通过了github线程。但我担心的是,当我试图传递参数 'HBaseTableCatalog.newTable' 时,我得到另一个错误:write.df(df, source = "org.apache.spark.sql.execution.datasources.hbase", mode = "append" , catalog = catalog, HBaseTableCatalog.newTable -> "5") Error in .local(df, path, ...) : object 'HBaseTableCatalog.newTable' not found 不确定这是否是 SparkR 中的正确语法。另外,我没有安装 Phoenix。没有 Phoenix 有什么解决方法可以访问吗?
    • 啊太棒了....感谢您的提示。它现在正在读取 pyspark 中的数据。也检查写入选项。我将在 SparkR 中验证相同并更新
    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2019-09-08
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多