【问题标题】:Spark on Glue is not able to connect to AWS/ElasticSearchGlue 上的 Spark 无法连接到 AWS/ElasticSearch
【发布时间】:2020-04-27 16:08:17
【问题描述】:

我在 Glue 中运行 Spark 以使用以下 Spark 配置写入 AWS/ElasticSearch:

  conf.set("es.nodes", s"$nodes/$indexName")
  conf.set("es.port", "443")
  conf.set("es.batch.write.retry.count", "200")
  conf.set("es.batch.size.bytes", "512kb")
  conf.set("es.batch.size.entries", "500")
  conf.set("es.index.auto.create", "false")
  conf.set("es.nodes.wan.only", "true")
  conf.set("es.net.ssl", "true")

但是我得到的是以下错误:

diagnostics: User class threw exception: org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: Cannot detect ES version - typically this happens if the network/Elasticsearch cluster is not accessible or when targeting a WAN/Cloud instance without the proper setting 'es.nodes.wan.only'
    at org.elasticsearch.hadoop.rest.InitializationUtils.discoverClusterInfo(InitializationUtils.java:340)
    at org.elasticsearch.spark.rdd.EsSpark$.doSaveToEs(EsSpark.scala:104)
    ....

我知道我的 ElasticSearch 实例在哪个“VPC”中运行,但我不确定如何为 Glue/Spark 设置它,或者它是否是另一个问题。有什么想法吗?

我还尝试添加一个“glue jdbc”连接,它应该使用正确的 VPC 连接,但我不确定如何正确设置:

  import scala.reflect.runtime.universe._
  def saveToEs[T <: Product : TypeTag](index: String, data: RDD[T]) =
    SparkProvider.glueContext.getJDBCSink(
      catalogConnection = "my-elasticsearch-connection",
      options = JsonOptions(
        "WHAT HERE?"
      ),
      transformationContext = "SinkToElasticSearch"
    ).writeDynamicFrame(DynamicFrame(
      SparkProvider.sqlContext.createDataFrame[T](data),
      SparkProvider.glueContext))

【问题讨论】:

    标签: apache-spark elasticsearch aws-glue


    【解决方案1】:

    尝试创建一个虚拟 JDBC 连接。虚拟连接将告诉 Glue ES - VPC、子网和安全组。测试连接可能不起作用,但是当您使用连接运行作业时,它将使用连接元数据在您的 VPC 中启动弹性网络接口以促进这种通信。更多关于连接的信息可以在这里找到:

    [1]https://docs.aws.amazon.com/glue/latest/dg/start-connecting.html

    【讨论】:

    • 谢谢,我已经试过了(请看我更新的答案),但到目前为止还没有运气。
    • 您可以在这里进行的测试只是网络测试。如果您将连接附加到您的工作,请确保您的安全组具有促进通信的必要规则。一个简单的:os.system("nc -vz &lt;ip-address&gt; &lt;port&gt;") 应该在开始修改代码之前证明连接性。
    • 是的,安全组和 VPC/子网设置正确,因为我已经用于 RDS 连接。我怀疑的是整个过程。我想我必须在这里下载用于弹性搜索的驱动程序:org.elasticsearch.xpack.sql.jdbc.EsDriver 并“强制”它使用我的连接,使用类似于我提出的 sn-p 的东西。
    • 在我的情况下,我下载了 jar 并将其添加到依赖 jar 路径(上传到 s3),其余的我参考了这里的示例docs.databricks.com/data/data-sources/elasticsearch.html
    • 在您的情况下,您使用的是 EMR/Spark + AWS/ElasticSearch 还是 Glue/Spark + AWS/ElasticSearch?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2017-01-22
    • 2016-01-13
    相关资源
    最近更新 更多