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

标签 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。请注意,我正在使用所有开源工具。

    最佳答案

    如果没有其他部署,则可以使用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。

    *不要忘了将来调整软件包的版本。

    关于r - 如何将数据从SparkR插入到hadoop集群中的Hbase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52873526/

    相关文章:

    r - 如何将 %LET 参数从 R 传递到 sas 脚本?

    scala - 在 Spark GraphX 中寻找最大边权重

    hadoop - 为什么 Hadoop 2.6.4 在 2.7.2 之后发布

    apache-spark - 启动 Hive 时出现此错误 - log4j :ERROR Could not instantiate class [org. apache.hadoop.hive.shims.HiveEventCounter]

    sql - Impala select * 不显示表的所有详细信息

    r - 在 clusterApply 中找不到函数

    r - 如何安装 RHadoop 包(Rmr、Rhdfs、Rhbase)?

    r - 从 caret::train 获取预测的置信区间

    scala - "row +: savedState.toSeq"在StateStoreRestoreExec.doExecute中做了什么?

    scala - 什么是 Spark 中的 DecisionTree.trainClassifier 参数