SPARK Yarn:未注册Azure ServiceBus JAVA SDK的服务或财产

时间:2016-05-03 19:11:35

标签: java scala azure apache-spark azure-java-sdk

我正在尝试让SDK工作,以便从SPARK项目向Azure Service Bus发送一条简单的消息。当我在本地spark环境中本地运行时,代码运行正常。

但是当我向YARN提交时,起初我很难让群集找到JAR文件,现在它执行时出现以下错误:

java.lang.RuntimeException: Service or property not registered:  com.microsoft.windowsazure.services.servicebus.ServiceBusContract interface com.microsoft.windowsazure.services.servicebus.ServiceBusContract

我调用服务总线的代码如下,我在使用和不使用类加载器部分的情况下尝试过,仍然是完全相同的问题:

  @throws[Exception]
  def SendMessageToSB(message: String) {


    try {

      // Get current context class loader
      val contextLoader = Thread.currentThread().getContextClassLoader();
      // Change context classloader to class context loader
      contextLoader.loadClass("com.microsoft.windowsazure.services.servicebus.ServiceBusContract")

      // Call Azure API and reset back the context loader

      val config: com.microsoft.windowsazure.Configuration = ServiceBusConfiguration.configureWithSASAuthentication("CTRATEST-NS$")
      val service: ServiceBusContract = ServiceBusService.create(config)
      val queueInfo: QueueInfo = new QueueInfo("inputdataqueue")
      try {
        val bm: BrokeredMessage = new BrokeredMessage(message)
        service.sendQueueMessage("inputdataqueue", bm)
      }
      catch {
        case e: Exception => {
          System.out.print("ServiceException encountered: ")
          System.out.println(e.getMessage)
          System.exit(-1)
        }
      }


      Thread.currentThread().setContextClassLoader(contextLoader);
    }
  }

我已经看到了类似暴风雨的线程,但它指出了类加载器问题,因为我使用的是scala,所以这里没有解决。

Azure SDK版本是通过maven构建的0.9.0。

HELP!

1 个答案:

答案 0 :(得分:0)

根据我的理解,根据我的经验,我认为您可以尝试下面的代码。

import com.microsoft.windowsazure.services.servicebus.ServiceBusContract


try {
    // Get current context class loader
    val contextLoader = Thread.currentThread().getContextClassLoader();
    // Change context classloader to class context loader
    Thread.currentThread().setContextClassLoader(ServiceBusContract.class.getClassLoader))
    // Call Azure API and reset back the context loader

    val config: com.microsoft.windowsazure.Configuration = ServiceBusConfiguration.configureWithSASAuthentication("CTRATEST-NS$")
    val service: ServiceBusContract = ServiceBusService.create(config)
    val queueInfo: QueueInfo = new QueueInfo("inputdataqueue")
    try {
        val bm: BrokeredMessage = new BrokeredMessage(message)
        service.sendQueueMessage("inputdataqueue", bm)
    } catch {
        case e: Exception => {
            System.out.print("ServiceException encountered: ")
            System.out.println(e.getMessage)
            System.exit(-1)
        }
    }
} catch {
    // handle exceptions  
} finally {
    // Reset back class loader
    Thread.currentThread().setContextClassLoader(contextLoader)
}

如果要按名称将类加载到JVM,可以尝试使用下面的代码。

Class.forName("com.microsoft.windowsazure.services.servicebus.ServiceBusContract")