还有stderr中的数据,当我在shell中执行命令时不应该有

时间:2015-10-10 19:29:33

标签: python hadoop

我有这个函数在本地执行命令[1],但是我用函数hdfs dfs -cat /user/xubuntu/digests/output1-1444497943/part-m-00000.digest调用了这个命令,我在stdout中得到了正确的输出,我得到了stderr中的log4j数据{1}}。由于在stderr中获取数据,我无法找到执行是否成功运行。如果执行成功,我为什么要在stderr中获取数据?

[1]本地执行的功能。     def executeCommand(命令):

  logging.debug("Executing: %s" % command)
  if "JAVA_HOME" not in os.environ:
    os.environ["JAVA_HOME"] = JAVA_HOME

  logging.debug("command: %s" % command)

  try:
    process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = process.communicate()
    if len(err) > 0:  # there is an exception
        raise ValueError("Exception:\n" + err)
  except ValueError as e:
    return e.message
  return out

[2]输出stdout和stderr

output in stdout: '{"mapreduce.file.input.name":"hdfs:\\/\\/hadoop-coc-1:9000\\/input1\\/b.txt","mapreduce.file.output.name":"\\/output1-1444497943\\/part-m-00000","mapreduce.digest":"1b344587f6c1398e7aaa59cd5f01b585"}'

output in stderr: '15/10/10 15:25:19 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n'

1 个答案:

答案 0 :(得分:0)

Hadoop会将 INFO 及以上级别的所有邮件记录到控制台的stderr

如上所述here

默认情况下,Hadoop会将消息记录到 Log4j Log4j 是通过类路径上的 log4j.properties 配置的。此文件定义记录的内容和位置。 对于应用程序,默认根记录器是" INFO,console",它将INFO级别以上的所有消息记录到控制台的stderr 。服务器记录到" INFO,DRFA",它记录到每天滚动的文件。日志文件名为$ HADOOP_LOG_DIR / hadoop- $ HADOOP_IDENT_STRING-.log。