Scala 如何在Spark笔记本中从Accumulo 1.6创建Spark RDD?
我有一个流浪者形象,Spark笔记本、Spark、Accumulo 1.6和Hadoop都在运行。从笔记本中,我可以手动创建扫描仪,并从使用Accumulo示例之一创建的表中提取测试数据: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:
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]
)