使用stdout popen捕获sqoop日志

jvlzgdj9  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(621)

下面是我正在运行的调用sqoop的python代码,但是除了下面几行之外,它没有捕获日志
警告:/usr/hdp/2.6.4.0-91/acumulo不存在!accumulo进口将失败。请将$accumulo\u home设置为accumulo安装的根目录。

  1. import subprocess
  2. job = "sqoop-import --direct --connect 'jdbc:sqlserver://host' --username myuser --password-file /user/ivr_sqoop --table data_app_det --delete-target-dir --verbose --split-by attribute_name_id --where \"db_process_time BETWEEN ('2018-07-15') and ('9999-12-31')\""
  3. print job
  4. with open('save.txt','w') as fp:
  5. proc = subprocess.Popen(job, stdout=fp, stderr=subprocess.PIPE, shell=True)
  6. stdout, stderr = proc.communicate()
  7. print "Here is the return code :: " + str(proc.returncode)
  8. print stdout`

如果我打电话的方式有问题,请告诉我。
注意:单个sqoop cmd运行良好并生成所有日志。
我也试过下面的方法,结果是一样的

  1. import subprocess
  2. job = "sqoop-import --direct --connect 'jdbc:sqlserver://host' --username myuser --password-file /user/ivr_sqoop --table data_app_det --delete-target-dir --verbose --split-by attribute_name_id --where \"db_process_time BETWEEN ('2018-07-15') and ('9999-12-31')\""
  3. proc = subprocess.Popen(job, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
  4. stdout, stderr = proc.communicate()

并在cmd的末尾使用'2>mylog.log'

  1. import subprocess
  2. job = "sqoop-import --direct --connect 'jdbc:sqlserver://host' --username myuser --password-file /user/ivr_sqoop --table data_app_det --delete-target-dir --verbose --split-by attribute_name_id --where \"db_process_time BETWEEN ('2018-07-15') and ('9999-12-31')\" > mylog.log "
  3. proc = subprocess.Popen(job, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
  4. stdout, stderr = proc.communicate()

我发现了下面类似的问题,但也没有答案。
子进程popen:忽略accumulo警告并继续执行sqoop

bxfogqkk

bxfogqkk1#

既然你添加了 shell=True ,它没有捕获sqoop日志。请删除 shell=True 从你的命令中添加 universal_newlines=True ,它将显示控制台日志。
工作代码:

  1. import subprocess
  2. import logging
  3. logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
  4. # Function to run Hadoop command
  5. def run_unix_cmd(args_list):
  6. """
  7. run linux commands
  8. """
  9. print('Running system command: {0}'.format(' '.join(args_list)))
  10. proc = subprocess.Popen(args_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
  11. s_output, s_err = proc.communicate()
  12. s_return = proc.returncode
  13. return s_return, s_output, s_err
  14. # Create Sqoop Job
  15. def sqoop_job():
  16. """
  17. Create Sqoop job
  18. """
  19. cmd = ['sqoop', 'import', '--connect', 'jdbc:oracle:thin:@//host:port/schema', '--username', 'user','--password', 'XX', '--query', '"your query"', '-m', '1', '--target-dir', 'tgt_dir']
  20. print(cmd)
  21. (ret, out, err) = run_unix_cmd(cmd)
  22. print(ret, out, err)
  23. if ret == 0:
  24. logging.info('Success.')
  25. else:
  26. logging.info('Error.')
  27. if __name__ == '__main__':
  28. sqoop_job()
展开查看全部

相关问题