从 pyspark 读取 hbase

read hbase from pyspark

我正在尝试使用 pyspark 从 hbase 读取数据。

我想我需要使用这个 jar hbase-spark-1.2.0-cdh5.16.2.jar

我下载了它 运行 代码:

from pyspark.sql import SparkSession

app_name = "hbase"
spark = (
    SparkSession.builder.master("yarn")
    .appName(app_name)
    .config("spark.jars", "hbase-spark-1.2.0-cdh5.16.2.jar")
    .getOrCreate()
)


dataSourceFormat = "org.apache.hadoop.hbase.spark"

readCatalog = """{
    "table":{"namespace":"namespace_dev", "name":"logs"},
    "rowkey":"key",
    "columns":{
        "key":{"cf":"rowkey", "col":"key", "type":"string"},
        "ARTICLE":{"cf":"atlas_data","col":"ARTICLE","type":"int"}
    }
}"""

readDF = spark.read.options(catalog=readCatalog).format(dataSourceFormat).load()

但出现错误:

Py4JJavaError: An error occurred while calling o87.load.
: java.lang.ClassNotFoundException: org.apache.spark.Logging was removed in Spark 2.0. Please check if your library is compatible with Spark 2.0

据我了解,我当前的版本与 Spark 2 不兼容,是否正确? 在这种情况下,我在哪里可以找到相同但可用于 Spark 2.X 的驱动程序?

Spark 版本为 2.3.0,hbase-connector 为 spark 1.2.0,请尝试从 maven 中央存储库使用较新的版本,例如 this

问题是您正在使用 spark.jars 并且仅传递 HBase Spark 连接器的名称。但是这个连接器本身取决于大量的罐子,例如 hbase-client 等,并且找不到这些罐子中的 类,例如 TableDescriptor 中的 [=] 11=] - 因为你没有指定它们。

您有几种解决方案:

  1. spark.jars 中明确指定所有依赖项 - 但这可能很麻烦,因为依赖项的数量很多
  2. 在启动 spark-shellspark-submit 时通过 --packages org.apache.hbase:hbase-spark:1.2.0-cdh5.16.2 指定 Spark HBase 连接器 - 它更容易,但您可能还需要指定 --repository 才能拉取Cloudera 构建
  3. 为 HBase Spark 连接器创建一个 fat jar 及其所有依赖项 - 但它应该由您自己完成,因为我没有看到官方的“fat jar”

我个人会选择选项 2...