Scala 如何在Spark笔记本中从Accumulo 1.6创建Spark RDD?

Scala 如何在Spark笔记本中从Accumulo 1.6创建Spark RDD?,scala,hadoop,apache-spark,accumulo,spark-notebook,Scala,Hadoop,Apache Spark,Accumulo,Spark Notebook,我有一个流浪者形象,Spark笔记本、Spark、Accumulo 1.6和Hadoop都在运行。从笔记本中,我可以手动创建扫描仪,并从使用Accumulo示例之一创建的表中提取测试数据: val instanceNameS = "accumulo" val zooServersS = "localhost:2181" val instance: Instance = new ZooKeeperInstance(instanceNameS, zooServersS) val connector:

我有一个流浪者形象,Spark笔记本、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)
}
由于以下错误,我收到一个无法处理的RDD:

java.io.IOException:尚未设置输入信息。在 org.apache.accumulo.core.client.mapreduce.lib.impl.InputConfigurator.validateOptions(InputConfigurator.java:630) 在 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.NewHadoopRDD.getPartitions(NewHadoopRDD.scala:98) 在 org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:222) 在 org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:220) 位于scala.Option.getOrElse(Option.scala:120) org.apache.spark.rdd.rdd.partitions(rdd.scala:220)位于 org.apache.spark.SparkContext.runJob(SparkContext.scala:1367)位于 org.apache.spark.rdd.rdd.count(rdd.scala:927)

这完全有道理,因为我没有指定任何参数来连接哪个表、auth是什么等等

所以我的问题是:从这里开始,我需要做什么才能将前十行表数据放入我的RDD?

更新一个 仍然不起作用,但我确实发现了一些东西。结果发现有两个几乎相同的包

org.apache.acumulo.core.client.mapreduce

&

org.apache.acumulo.core.client.mapred

除了一些方法签名不同之外,它们的成员几乎相同。我不知道为什么两者都存在,因为我看不到任何反对意见。我试图毫无乐趣地实现Sietse的回答。以下是我所做的,以及我的回答:

import org.apache.hadoop.mapred.JobConf
import org.apache.hadoop.conf.Configuration
val jobConf = new JobConf(new Configuration)
导入org.apache.hadoop.mapred.JobConf导入 org.apache.hadoop.conf.Configuration jobConf: org.apache.hadoop.mapred.JobConf=Configuration:core-default.xml, core-site.xml、mapred-default.xml、mapred-site.xml、warn-default.xml、, web-site.xml

配置:core-default.xml、core-site.xml、mapred-default.xml、, mapred-site.xml,纱线-default.xml,纱线-site.xml

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

java.io.IOException:尚未设置输入信息。在 org.apache.accumulo.core.client.mapreduce.lib.impl.InputConfigurator.validateOptions(InputConfigurator.java:630) 在 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.HadoopRDD.getPartitions(HadoopRDD.scala:201) 在 org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:222) 在 org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:220) 位于scala.Option.getOrElse(Option.scala:120) org.apache.spark.rdd.rdd.partitions(rdd.scala:220)位于 org.apache.spark.rdd.rdd.take(rdd.scala:1077)位于 org.apache.spark.rdd.rdd.first(rdd.scala:1110)位于 $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:64) 在 $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:69) 在

*编辑2*

回复:霍尔顿的答案——仍然没有乐趣:

    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)]=NewHadoopRDD[0]位于 newAPIHadoopRDD电话:58

Out[15]:NewHadoopRDD[0]位于newAPIHadoopRDD的位置:58

java.io.IOException:尚未设置输入信息。在 org.apache.accumulo.core.client.mapreduce.lib.impl.InputConfigurator.validateOptions(InputConfigurator.java:630) 在 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.NewHadoopRDD.getPartitions(NewHadoopRDD.scala:98) 在 org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:222) 在 org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:220) 位于scala.Option.getOrElse(Option.scala:120) org.apache.spark.rdd.rdd.partitions(rdd.scala:220)位于 org.apache.spark.rdd.rdd.take(rdd.scala:1077)位于 org.apache.spark.rdd.rdd.first(rdd.scala:1110)位于 $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:61) 在

编辑3--进度

我能够找出“输入信息未设置”错误发生的原因。你们当中目光锐利的人无疑会看到下面的代码缺少一个结束符('

当我在spark notebook中执行此操作时,我一直在单击“执行”按钮并继续,因为我没有看到错误。我忘记的是,该笔记本将执行spark shell在您停止关闭时将执行的操作。)”--它将永远等待您添加它。因此,该错误是“setConnectorInfo”方法从未执行的结果

不幸的是,我仍然无法将accumulo表数据放入对我有用的RDD中。当我执行

rddX.count
我回来了

res15:Long=10000

哪一个是正确的回答?我所指的表中有10000行数据。然而,当我试图抓住数据的第一个元素时:

rddX.first
我得到以下错误:

组织。
    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.first
AbstractInputFormat.setConnectorInfo(jobConf, "root", new PasswordToken("password") 
rddX.count
rddX.first
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]
)