2017-02-20 11 views
1

Я пишу большой соединитель запросов google для искры, а под ним используется соединитель gooogle gooop.Настройка среды Vairable в режиме реального времени. Google Bigquery

В настоящее время для соединения google hadoop требуется переменная env Google, указывающая на файл js creds.

Это может быть раздражающим, чтобы установить, когда ваш запуск кластеров вне dataproc мира

Это плохая практика, чтобы установить его в режиме реального времени в коде? или есть обходной путь, чтобы сообщить соединителю hadoop игнорировать переменную env, поскольку она была установлена ​​в конфигурации hadoop «fs.gs.auth.service.account.json.keyfile»?

Dennis с вашего вклада в проект, возможно, вы тоже можете помочь на этот раз?

+0

@ dennis-huo Вы были упомянуты – Pentium10

+0

Хмм, я не помню, где используются переменные среды; он должен использовать только ключи конфигурации Hadoop. У вас есть указатель на то, где используются переменные среды кода? –

+0

@DennisHuo его использовали при создании клиента вал BigQuery = { Val = GoogleCredential.getApplicationDefault.createScoped учетных данных (SCOPES) новый Bigquery.Builder (новый NetHttpTransport, новый JacksonFactory, удостоверение) .setApplicationName ("искра-BigQuery") .build() –

ответ

0

Для тех, кто заинтересован я просто установить их в время выполнения, используя приведенную ниже суть в Скале

https://gist.github.com/jaytaylor/770bc416f0dd5954cf0f

Но вот код в случае сутью когда-либо переходит в автономный режим

trait EnvHacker { 
/** 
* Portable method for setting env vars on both *nix and Windows. 
* @see http://stackoverflow.com/a/7201825/293064 
*/ 
def setEnv(newEnv: Map[String, String]): Unit = { 
    try { 
     val processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment") 
     val theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment") 
     theEnvironmentField.setAccessible(true) 
     val env = theEnvironmentField.get(null).asInstanceOf[JavaMap[String, String]] 
     env.putAll(newEnv) 
     val theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment") 
     theCaseInsensitiveEnvironmentField.setAccessible(true) 
     val cienv = theCaseInsensitiveEnvironmentField.get(null).asInstanceOf[JavaMap[String, String]] 
     cienv.putAll(newEnv) 
    } catch { 
     case e: NoSuchFieldException => 
      try { 
       val classes = classOf[Collections].getDeclaredClasses() 
       val env = System.getenv() 
       for (cl <- classes) { 
        if (cl.getName() == "java.util.Collections$UnmodifiableMap") { 
         val field = cl.getDeclaredField("m") 
         field.setAccessible(true) 
         val obj = field.get(env) 
         val map = obj.asInstanceOf[JavaMap[String, String]] 
         map.clear() 
         map.putAll(newEnv) 
        } 
       } 
      } catch { 
       case e2: Exception => e2.printStackTrace() 
      } 

     case e1: Exception => e1.printStackTrace() 
    } 
} 

}