簡體   English   中英

如何在Spark-notebook中使用Accumulo 1.6創建Spark RDD?

[英]How do I create a Spark RDD from Accumulo 1.6 in spark-notebook?

我有一個Vagrant圖像,Spark Notebook,Spark,Accumulo 1.6和Hadoop都在運行。 從筆記本,我可以手動創建一個掃描儀,並從我使用其中一個Accumulo示例創建的表中提取測試數據:

val instanceNameS = "accumulo"
val zooServersS = "localhost:2181"
val instance: Instance = new ZooKeeperInstance(instanceNameS, zooServersS)
val connector: Connector = instance.getConnector( "root", new PasswordToken("password"))
val auths = new Authorizations("exampleVis")
val scanner = connector.createScanner("batchtest1", auths)

scanner.setRange(new Range("row_0000000000", "row_0000000010"))

for(entry: Entry[Key, Value] <- scanner) {
  println(entry.getKey + " is " + entry.getValue)
}

將給出前10行表數據。

當我嘗試創建RDD時:

val rdd2 = 
  sparkContext.newAPIHadoopRDD (
    new Configuration(), 
    classOf[org.apache.accumulo.core.client.mapreduce.AccumuloInputFormat], 
    classOf[org.apache.accumulo.core.data.Key], 
    classOf[org.apache.accumulo.core.data.Value]
  )

由於以下錯誤,我得到一個RDD返回給我,我做不了多少:

java.io.IOException:尚未設置輸入信息。 org.apache.accumulo.core.client.mapreduce.lib.impl.InputConfigurator.validateOptions(InputConfigurator.java:630)at org.apache.accumulo.core.client.mapreduce.AbstractInputFormat.validateOptions(AbstractInputFormat.java:343) org.apache.accumulo.core.client.mapreduce.AbstractInputFormat.getSplits(AbstractInputFormat.java:538)位於org.apache.spark.rdd的org.apache.spark.rdd.NewHadoopRDD.getPartitions(NewHadoopRDD.scala:98) .RDD $$ anonfun $ partition $ 2.apply(RDD.scala:222)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:220)at scala.Option.getOrElse(Option .scala:120)org.apache.spark.rdd.RDD.partitions(RDD.scala:220)atg.apache.spark.SparkContext.runJob(SparkContext.scala:1367)org.apache.spark.rdd。 RDD.count(RDD.scala:927)

考慮到我沒有指定任何關於連接哪個表,auths是什么等的參數,這完全有道理。

所以我的問題是: 從這里我需要做什么才能將前十行表數據放入我的RDD?

更新一個仍然無法正常工作,但我確實發現了一些事情。 原來有兩個幾乎相同的包,

org.apache.accumulo.core.client.mapreduce

org.apache.accumulo.core.client.mapred

兩者都有幾乎相同的成員,除了一些方法簽名不同的事實。 不知道為什么兩者都存在,因為沒有我可以看到的棄用通知。 我試圖毫不高興地實施Sietse的答案。 以下是我的所作所為,以及回復:

import org.apache.hadoop.mapred.JobConf
import org.apache.hadoop.conf.Configuration
val jobConf = new JobConf(new Configuration)

import org.apache.hadoop.mapred.JobConf import org.apache.hadoop.conf.Configuration jobConf:org.apache.hadoop.mapred.JobConf =配置:core-default.xml,core-site.xml,mapred-default。 xml,mapred-site.xml,yarn-default.xml,yarn-site.xml

配置:core-default.xml,core-site.xml,mapred-default.xml,mapred-site.xml,yarn-default.xml,yarn-site.xml

AbstractInputFormat.setConnectorInfo(jobConf, 
                                     "root", 
                                     new PasswordToken("password")

AbstractInputFormat.setScanAuthorizations(jobConf, auths)

AbstractInputFormat.setZooKeeperInstance(jobConf, new ClientConfiguration)

val rdd2 = 
  sparkContext.hadoopRDD (
    jobConf, 
    classOf[org.apache.accumulo.core.client.mapred.AccumuloInputFormat], 
    classOf[org.apache.accumulo.core.data.Key], 
    classOf[org.apache.accumulo.core.data.Value], 
    1
  )

rdd2:org.apache.spark.rdd.RDD [(org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value)] = HadoopRDD [1] at hadoopRDD at:62

rdd2.first

java.io.IOException:尚未設置輸入信息。 org.apache.accumulo.core.client.mapreduce.lib.impl.InputConfigurator.validateOptions(InputConfigurator.java:630)at org.apache.accumulo.core.client.mapred.AbstractInputFormat.validateOptions(AbstractInputFormat.java:308) org.apache.accumulo.core.client.mapred.AbstractInputFormat.getSplits(AbstractInputFormat.java:505)位於org.apache.spark.rdd的org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:201) .RDD $$ anonfun $ partition $ 2.apply(RDD.scala:222)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:220)at scala.Option.getOrElse(Option .scala:120)org.apache.spark.rdd.RDD.partitions(RDD.scala:220)位於org.apache.spark的org.apache.spark.rdd.RDD.take(RDD.scala:1077)。 rdd.RDD.first(RDD.scala:1110)at $ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC。(:64)at $ iwC $$ iwC $$ IWC萬國表$$ $$ IWC萬國表$$ $$ IWC萬國表$$ $$ IWC萬國表$$ $$ IWC萬國表$$ $$ IWC萬國表$$ $$ IWC萬國表$$ $$ IWC萬國表$$ $$ IWC $ $ iwC $$ iwC $$ iwC $$ iwC $$ iwC。(:69)at。 ..

*編輯2 *

re:霍爾頓的回答 - 仍然沒有快樂:

    AbstractInputFormat.setConnectorInfo(jobConf, 
                                         "root", 
                                         new PasswordToken("password")
    AbstractInputFormat.setScanAuthorizations(jobConf, auths)
    AbstractInputFormat.setZooKeeperInstance(jobConf, new ClientConfiguration)
    InputFormatBase.setInputTableName(jobConf, "batchtest1")
    val rddX = sparkContext.newAPIHadoopRDD(
      jobConf, 
      classOf[org.apache.accumulo.core.client.mapreduce.AccumuloInputFormat], 
      classOf[org.apache.accumulo.core.data.Key], 
      classOf[org.apache.accumulo.core.data.Value]
      )

rddX:org.apache.spark.rdd.RDD [(org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value)] = NewAPIHadoopRDD的NewHadoopRDD [0]:58

Out [15]:NewAPIHadoopRDD的NewHadoopRDD [0]:58

rddX.first

java.io.IOException:尚未設置輸入信息。 org.apache.accumulo.core.client.mapreduce.lib.impl.InputConfigurator.validateOptions(InputConfigurator.java:630)at org.apache.accumulo.core.client.mapreduce.AbstractInputFormat.validateOptions(AbstractInputFormat.java:343) org.apache.accumulo.core.client.mapreduce.AbstractInputFormat.getSplits(AbstractInputFormat.java:538)位於org.apache.spark.rdd的org.apache.spark.rdd.NewHadoopRDD.getPartitions(NewHadoopRDD.scala:98) .RDD $$ anonfun $ partition $ 2.apply(RDD.scala:222)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:220)at scala.Option.getOrElse(Option .scala:120)org.apache.spark.rdd.RDD.partitions(RDD.scala:220)位於org.apache.spark的org.apache.spark.rdd.RDD.take(RDD.scala:1077)。 rdd.RDD.first(RDD.scala:1110)at $ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC。(:61)at

編輯3 - 進步!

我能夠弄清楚為什么'輸入INFO未設置'錯誤發生了。 你們中間的老鷹眼無疑會看到以下代碼缺少一個結束'(''

AbstractInputFormat.setConnectorInfo(jobConf, "root", new PasswordToken("password") 

因為我在spark-notebook中這樣做,我一直點擊執行按鈕繼續前進,因為我沒有看到錯誤。 我忘了的是,當你放棄關閉')時,筆記本將會執行spark-shell所做的事情 - 它將永遠等待你添加它 所以錯誤是“setConnectorInfo”方法永遠不會被執行的結果。

不幸的是,我仍然無法將累積表數據推送到可用於我的RDD中。 當我執行

rddX.count

我回來了

res15:長= 10000

這是正確的響應 - 我指出的表中有10,000行數據。 但是,當我試圖抓住數據的第一個元素時:

rddX.first

我收到以下錯誤:

org.apache.spark.SparkException:作業因階段失敗而中止:階段0.0(TID 0)中的任務0.0具有不可序列化的結果:org.apache.accumulo.core.data.Key

關於從哪里去的任何想法?

編輯4 - 成功!

接受的答案+評論是90%的方式 - 除了accumulo鍵/值需要被強制轉換為可序列化的事實。 我通過在兩者上調用.toString()方法來實現這一點。 我會嘗試盡快發布一些完整的工作代碼,以防其他任何人遇到同樣的問題。

通常使用自定義Hadoop InputFormats,使用JobConf指定信息。 正如@Sietse所指出的,AccumuloInputFormat上有一些靜態方法可用於配置JobConf。 在這種情況下,我認為你想要做的是:

val jobConf = new JobConf() // Create a job conf
// Configure the job conf with our accumulo properties
AccumuloInputFormat.setConnectorInfo(jobConf, principal, token)
AccumuloInputFormat.setScanAuthorizations(jobConf, authorizations)
val clientConfig =  new ClientConfiguration().withInstance(instanceName).withZkHosts(zooKeepers)
AccumuloInputFormat.setZooKeeperInstance(jobConf, clientConfig)
AccumuloInputFormat.setInputTableName(jobConf, tableName)
// Create an RDD using the jobConf
val rdd2 = sc.newAPIHadoopRDD(jobConf, 
classOf[org.apache.accumulo.core.client.mapreduce.AccumuloInputFormat], 
classOf[org.apache.accumulo.core.data.Key], 
classOf[org.apache.accumulo.core.data.Value]
)

注意:在深入研究代碼之后,看來配置屬性的設置部分基於被調用的類(有意識地避免與其他包沖突),所以當我們去具體類中時后來它找不到配置好的標志。 解決方法是不使用Abstract類。 有關實施細節,請參閱https://github.com/apache/accumulo/blob/bf102d0711103e903afa0589500f5796ad51c366/core/src/main/java/org/apache/accumulo/core/client/mapreduce/lib/impl/ConfiguratorBase.java#L127 )。 如果你不能使用spark-notebook在具體的實現上調用這個方法,可能使用spark-shell或定期構建的應用程序是最簡單的解決方案。

看起來這些參數必須通過靜態方法設置: http//accumulo.apache.org/1.6/apidocs/org/apache/accumulo/core/client/mapred/AccumuloInputFormat.html 因此,請嘗試設置非可選參數並再次運行。 它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM