使用Spark将数据框存储到HBase中



我将数据框从CDP7中的pyspark数据框存储到hbase表,以下示例中,我使用的组件是:

  • Spark版本3.1.1
  • Scala 2.12.10版本人体自燃现象
  • -核心- 1.1.1 - 2.1 - s_2.11.jar

我使用的命令:

spark3-submit  --packages com.hortonworks:shc-core:1.1.1-2.1-s_2.11 --repositories http://repo.hortonworks.com/content/groups/public/ --files /etc/hbase/conf/hbase-site.xml test-hbase3.py

然而,我得到了这个错误,它是相当长的,我需要把它放在hastebin.com如下:spark-log

错误代码片段:

Traceback (most recent call last):
File "/opt/cloudera/parcels/CDH-7.1.6-1.cdh7.1.6.p0.10506313/test-hbase3.py", line 45, in <module>
main()
File "/opt/cloudera/parcels/CDH-7.1.6-1.cdh7.1.6.p0.10506313/test-hbase3.py", line 24, in main
writeDF.write.options(catalog=writeCatalog, newtable=5).format(dataSourceFormat).save()
File "/opt/cloudera/parcels/SPARK3-3.1.1.3.1.7270.0-253-1.p0.11638568/lib/spark3/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 1107, in save
File "/opt/cloudera/parcels/SPARK3-3.1.1.3.1.7270.0-253-1.p0.11638568/lib/spark3/python/lib/py4j-0.10.9-src.zip/py4j/java_gateway.py", line 1305, in __call__
File "/opt/cloudera/parcels/SPARK3-3.1.1.3.1.7270.0-253-1.p0.11638568/lib/spark3/python/lib/pyspark.zip/pyspark/sql/utils.py", line 111, in deco
File "/opt/cloudera/parcels/SPARK3-3.1.1.3.1.7270.0-253-1.p0.11638568/lib/spark3/python/lib/py4j-0.10.9-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o36.save.
: java.lang.NoClassDefFoundError: scala/Product$class
at org.apache.spark.sql.execution.datasources.hbase.HBaseRelation.<init>(HBaseRelation.scala:73)
at org.apache.spark.sql.execution.datasources.hbase.DefaultSource.createRelation(HBaseRelation.scala:59)
at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:46)

我应该怎么做来修复这个错误?我试着找其他连接器。但是,只找到了SHC连接器。我在这里没有使用任何Maven仓库。但是,不确定是否缺少依赖项或其他错误。

这是一个scala版本冲突。你的shc_core.jar是为scala 2.11编译的,但你使用的是scala 2.12,它与2.11不兼容。

最简单的修复方法是从scala 2.12的源代码中重新编译shc_core(尽管您可能会遇到兼容性问题,因为项目是显然没有在scala 2.12上测试过)

你可以探索其他方法来解决你的问题:

  • 通过Hive表访问HBase (https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.5/hbase-data-access/content/hdag_hbase_hive_integration_example.html)

  • 使用类似凤凰的连接器(https://docs.cloudera.com/runtime/7.2.8/phoenix-access-data/topics/phoenix-spark-connector-examples.html)

  • 为你的数据框架使用HBase API滚动你自己的连接器,如果你不想实现一个完全通用的解决方案,这是相当直接的

最新更新