Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在没有HBase API的情况下使用Spark直接编辑HBase HFile_Apache Spark_Hbase - Fatal编程技术网

Apache spark 如何在没有HBase API的情况下使用Spark直接编辑HBase HFile

Apache spark 如何在没有HBase API的情况下使用Spark直接编辑HBase HFile,apache-spark,hbase,Apache Spark,Hbase,我需要批量编辑HBase数据,编辑每行特定单元格的内容。 传递HBase PUT/GET API不是一个选项,因为这将非常缓慢。 我想设置一个Spark任务,将HBase HFile加载到正确定义的DFs中,让我编辑特定列中的数据,然后将数据保存回HDFS,保持HFile格式 我找到了一些关于如何将HFile从Spark批量写入HDFS的指南,但是,我不确定如何从HDFS获取数据。哪种数据帧/RDD最适合这种任务 谢谢你回答我自己的问题,以防别人需要 可以从HBase快照加载HFiles。按照以

我需要批量编辑HBase数据,编辑每行特定单元格的内容。 传递HBase PUT/GET API不是一个选项,因为这将非常缓慢。 我想设置一个Spark任务,将HBase HFile加载到正确定义的DFs中,让我编辑特定列中的数据,然后将数据保存回HDFS,保持HFile格式

我找到了一些关于如何将HFile从Spark批量写入HDFS的指南,但是,我不确定如何从HDFS获取数据。哪种数据帧/RDD最适合这种任务


谢谢你回答我自己的问题,以防别人需要

可以从HBase快照加载HFiles。按照以下步骤操作: (在HBase外壳中) 1.禁用“命名空间:表” 2.快照“命名空间:表”“您的\u快照”

这将创建一个可访问的快照,您可以在/[HBase\u path]/.snapshot/[your\u snapshot]上访问该快照

将快照作为RDD加载[ImmutableBytesWritable,Result]

  def loadFromSnapshot(sc: SparkContext): RDD[ImmutableBytesWritable, Result] = {

val restorePath =
  new Path(s"hdfs://$storageDirectory/$restoreDirectory/$snapshotName")
val restorePathString = restorePath.toString

// create hbase conf starting from spark's hadoop conf
val hConf = HBaseConfiguration.create()
val hadoopConf = sc.hadoopConfiguration
HBaseConfiguration.merge(hConf, hadoopConf)

// point HBase root dir to snapshot dir
hConf.set("hbase.rootdir",
  s"hdfs://$storageDirectory/$snapshotDirectory/$snapshotName/")

// point Hadoop to the bucket as default fs
hConf.set("fs.default.name", s"hdfs://$storageDirectory/")

// configure serializations
hConf.setStrings("io.serializations",
  hadoopConf.get("io.serializations"),
  classOf[MutationSerialization].getName,
  classOf[ResultSerialization].getName,
  classOf[KeyValueSerialization].getName)

// disable caches
hConf.setFloat(HConstants.HFILE_BLOCK_CACHE_SIZE_KEY, HConstants.HFILE_BLOCK_CACHE_SIZE_DEFAULT)
hConf.setFloat(HConstants.BUCKET_CACHE_SIZE_KEY, 0f)
hConf.unset(HConstants.BUCKET_CACHE_IOENGINE_KEY)

// configure TableSnapshotInputFormat
hConf.set("hbase.TableSnapshotInputFormat.snapshot.name", settingsAccessor.settings.snapshotName)
hConf.set("hbase.TableSnapshotInputFormat.restore.dir", restorePathString)

val scan = new Scan()     // Fake scan which is applied by spark on HFile. Bypass RPC
val scanString = {
  val proto = ProtobufUtil.toScan(scan)
  Base64.encodeBytes(proto.toByteArray)
}
hConf.set(TableInputFormat.SCAN, scanString)

val job = Job.getInstance(hConf)

TableSnapshotInputFormat.setInput(job, settingsAccessor.settings.snapshotName, restorePath)

// create RDD
sc.newAPIHadoopRDD(job.getConfiguration,
  classOf[TableSnapshotInputFormat],
  classOf[ImmutableBytesWritable],
  classOf[Result])
}
这将从快照目录加载HFile,并对其应用“伪”完全扫描,这避免了缓慢的远程过程调用,但允许具有相同的扫描输出

完成后,可以重新启用表

  • 启用“nasmespace:table” 也可以选择删除快照(实际上不会删除任何数据)
  • 删除\u快照“您的\u快照”