【问题标题】:Capturing hive output over ssh using python使用 python 通过 ssh 捕获 hive 输出
【发布时间】:2016-10-21 13:19:29
【问题描述】:

我正在尝试使用织物自动化我的许多蜂巢作业并捕获输出。 hive 作业在服务器上运行(通过代理访问),我想将这些 hive 作业的输出保存到本地计算机上的文件中。目前我的方法是使用 shell 脚本通过 SSH 调用 hive 并将输出重定向到文本文件。这是一个例子:

ssh myserver "hive -e 'show tables;'" > myserver_results.txt

我正在尝试使用 python 和 fabric 重新创建类似的东西:

from fabric.api import run, env

env.gateway = 'my_proxy'
env.hosts = ['hive_server']
output = run("hive -e 'show tables;'")
print(output)

我的问题是使用 shell 脚本和使用结构的输出不相等。 shell 脚本的输出如下所示:

[HIVE OUTPUT]

print(output)print(output.stdout) 的结构结果都将如下所示:

[WELCOME MESSAGE FOR THIS SERVER]
[HIVE START CONSOLE OUTPUT]
[HIVE OUTPUT]
[Time taken: 0.2 seconds, Fetched: 520 row(s)]

有没有一种简单的方法可以使用 python 和 fabric 重现我的 shell 脚本的输出?

编辑: 我想编辑我的原始问题并扩大范围。经过更多的实验,我认为 Fabric 将无法以我想要的方式轻松捕获输出。所以我提出一个问题,有没有办法使用 python 通过 SSH 运行 hive 脚本并捕获 hive 输出?

这里是要求的摘要:

  1. 当我这样做时,输出必须与文件的内容匹配:ssh myserver "hive -e 'show tables;'" > myserver_results.txt

  2. hive 消息/进度的流式输出,就像我在 shell 中运行上述命令一样

  3. 轻松设置以使用 SSH 和代理服务器,而无需依赖设置 ssh 配置。

根据我的实验,我尝试使用以下 python 库:paramiko、fabric、plumbum、sarge。

我认为 Fabric 是最接近的并且满足 (2)、(3)。 Sarge 似乎满足 (1) 和 (2)。

【问题讨论】:

    标签: python ssh hive fabric


    【解决方案1】:

    我不确定您为什么会收到登录横幅,但这可能对如何抑制它有一些解释:https://serverfault.com/questions/66986/suppressing-ssh-banner-from-openssh-client/67006 您也可以使用tailhead 来按摩您的输出,以及当然,您总是可以在内存中操作stdout 的结果。所以我会做这样的事情

    output = run(
        "hive -e 'show tables;' "
        "| head -n -1 "
        "| tail -n -3")
    # where 3 is the number of lines you want to skip at the beginning
    

    虽然我不是 Hive 专家,但您也可以在 .hiverc 文件中设置几个设置,这些设置可以更改输出格式。

    【讨论】:

    • 我也很困惑,当我通过 SSH 运行命令时,我在终端中看到了服务器欢迎消息,但它没有通过管道传输到文本文件。
    • 不幸的是,这似乎不起作用,head/tail 限制了 hive 输出,但服务器消息和 hive 开始/结束消息仍然显示
    【解决方案2】:

    在对 Fabric 进行更多试验后,我可以非常接近于模仿 ssh myserver "hive -e 'show tables;'" > myserver_results.txt 的输出。以下是我尝试过的几种方法:

    1. run("hive -e 'show tables;' 2>/dev/null"):这会将 hive 的 stderr 消息重定向到 null 并且由 fabric 返回的最终输出将不包括它。这并不完全奏效,因为它还会抑制 hive 的进度消息——对于长时间的作业,您永远无法确定作业是否正确运行或已停止。

    2. 照常设置env.combine_stderr = Falseenv.always_use_pty = Falserun。从文档来看,这将关闭伪终端,使其难以交互,但在运行蜂巢作业时似乎没什么大不了的。此外,通过这两个选项,它允许不同的标准输出和标准错误。但是,这仍然没有消除 hive 启动之前来自服务器的欢迎消息。

    3. output = run("hive -e 'show tables;' > temp_file.txt")。将输出通过管道传输到服务器上的文件,甚至根本不尝试处理从结构返回的流输出。该文件可以写入服务器的/tmp,也可以复制到本地机器。

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2017-07-17
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多