Scala: не могу запустить gcloud вычислить ssh

Я пытаюсь запустить запрос улья, используя gcloud вычисление ssh через scala

Во-первых, вот что я пробовал

scala> import sys.process._
scala> val results = Seq("hive", "-e", "show databases;").!!
asd
zxc
qwe
scala>

и это хорошо. Теперь я хочу запустить ту же команду hive, но для кластера GCP. У меня есть настройка gcloud на моей виртуальной машине, и из командной строки я могу легко сделать

$ gcloud compute ssh --zone myZone myNode --internal-ip  -- 'hive -e "show databases;"'
Updating project ssh metadata...⠶Updated [https://www.googleapis.com/compute/v1/projects/myProject].
Updating project ssh metadata...done.
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.2746937995265952194' (RSA) to the list of known hosts.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    19  100    19    0     0   2982      0 --:--:-- --:--:-- --:--:--  3166

Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j2.properties Async: true
OK
asd
zxc
qwe

Теперь я хочу запустить вышеуказанное, используя scala. Вот что я пробовал

scala> val results = Seq("gcloud", "compute", "ssh", "--zone", "myZone", "myNode", "--internal-ip", "--", "hive", "-e" ,"show databases").!!
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    19  100    19    0     0   3270      0 --:--:-- --:--:-- --:--:--  3800
Pseudo-terminal will not be allocated because stdin is not a terminal.

Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j2.properties Async: true
NoViableAltException(-1@[846:1: ddlStatement : ( createDatabaseStatement | switchDatabaseStatement | dropDatabaseStatement | createTableStatement | dropTableStatement | truncateTableStatement | alterStatement | descStatement | showStatement | metastoreCheck | createViewStatement | createMaterializedViewStatement | dropViewStatement | dropMaterializedViewStatement | createFunctionStatement | createMacroStatement | createIndexStatement | dropIndexStatement | dropFunctionStatement | reloadFunctionStatement | dropMacroStatement | analyzeStatement | lockStatement | unlockStatement | lockDatabase | unlockDatabase | createRoleStatement | dropRoleStatement | ( grantPrivileges )=> grantPrivileges | ( revokePrivileges )=> revokePrivileges | showGrants | showRoleGrants | showRolePrincipals | showRoles | grantRole | revokeRole | setRole | showCurrentRole | abortTransactionStatement );])
    at org.antlr.runtime.DFA.noViableAlt(DFA.java:158)
    at org.antlr.runtime.DFA.predict(DFA.java:144)
    at org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:3757)
    at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:2382)
    at org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1333)
    at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:208)
    at org.apache.hadoop.hive.ql.parse.ParseUtils.parse(ParseUtils.java:77)
    at org.apache.hadoop.hive.ql.parse.ParseUtils.parse(ParseUtils.java:70)
    at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:468)
    at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1317)
    at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1457)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1237)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1227)
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:233)
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:184)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:403)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:336)
    at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:787)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:759)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:686)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:244)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:158)
FAILED: ParseException line 1:4 cannot recognize input near 'show' '<EOF>' '<EOF>' in ddl statement
java.lang.RuntimeException: Nonzero exit value: 64
  at scala.sys.package$.error(package.scala:27)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:132)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:102)
  ... 50 elided

scala>

почему я получаю эту ошибку? я тоже пробовал

scala> val results = Seq("gcloud", "compute", "ssh", "--zone", "myZone", "myNode", "--internal-ip", "--", "hive", "-e" ,"show databases;").!!

но получил ту же ошибку. Затем я попытался

scala> val results = Seq("gcloud", "compute", "ssh", "--zone", "myZone", "myNode", "--internal-ip", "--", "'hive -e \"show databases;\"'").!!
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    19  100    19    0     0   3245      0 --:--:-- --:--:-- --:--:--  3800
Pseudo-terminal will not be allocated because stdin is not a terminal.
bash: hive -e "show databases;": command not found
java.lang.RuntimeException: Nonzero exit value: 127
  at scala.sys.package$.error(package.scala:27)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:132)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:102)
  ... 50 elided

Как я могу правильно запустить gcloud comput ssh с помощью scala?


person AbtPst    schedule 09.09.2019    source источник
comment
IDK, но я не думаю, что вам нужны одинарные кавычки в вашем последнем примере. Вы пытаетесь передать строку hive -e "show databases;". Ради интереса я бы использовал тройные кавычки в Scala: """hive -e "show databases;"""", чтобы избежать обратной косой черты. Одинарные кавычки в вашей хорошей командной строке обрабатываются bash.   -  person som-snytt    schedule 09.09.2019
comment
это сработало! тройные кавычки сработали :)   -  person AbtPst    schedule 09.09.2019
comment
@som-snytt Не могли бы вы опубликовать то, что вы сказали, в качестве ответа, чтобы автор сообщения мог принять это как ответ? Это сделает его более заметным для сообщества.   -  person JKleinne    schedule 09.09.2019
comment
Ничего себе, это сработало? У меня ужасная цитатная карма.   -  person som-snytt    schedule 11.09.2019


Ответы (1)


Вам не нужны одинарные кавычки в вашем последнем примере. Вы пытаетесь передать строку:

hive -e "show databases;"

Ради интереса я бы использовал тройные кавычки в Scala:

"""hive -e "show databases;""""

чтобы избежать обратной косой черты. Одинарные кавычки в вашей хорошей командной строке обрабатываются bash.

Вот что сработало в bash:

$ gcloud compute ssh --zone myZone myNode --internal-ip  -- 'hive -e "show databases;"'

scala.sys.process в какой-то момент получил базовый анализ. В этом имени файла есть пробел, который необходимо заключить в кавычки. Удивительно, но кажется, что он делает кавычки в стиле оболочки:

$ scala
Welcome to Scala 2.13.0 (OpenJDK 64-Bit Server VM, Java 11.0.3).
Type in expressions for evaluation. Or try :help.

scala> import scala.sys.process._
import scala.sys.process._

scala> "ls -l /tmp/skypeforlinux Crashes".!!
ls: cannot access '/tmp/skypeforlinux': No such file or directory
ls: cannot access 'Crashes': No such file or directory
java.lang.RuntimeException: Nonzero exit value: 2
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:155)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:112)
  ... 28 elided

scala> """ls -l "/tmp/skypeforlinux Crashes"""".!!
res1: String =
"total 0
"

scala> """ls -l '/tmp/skypeforlinux Crashes'""".!!
res2: String =
"total 0
"

scala> """ls -l /tmp/skypeforlin'ux Cr'ashes""".!!
res3: String =
"total 0
"

scala> """echo 'hive -e "show databases;"'""".!!
res4: String =
"hive -e "show databases;"
"

Двойные кавычки вокруг "my house" являются частью имени файла:

scala> """ls '/tmp/"my house"'""".!!
res5: String =
"/tmp/"my house"
"

Я думаю, что именно в этом коде я узнал, как работают кавычки в стиле оболочки, хотя у меня никогда не было возможности использовать эти знания. За исключением этого ответа, так что спасибо за возможность.

person som-snytt    schedule 10.09.2019