docs: def run_tool_cmd(tool, cmd, args=None, properties=None, hadoop_conf_dir=None,
                   logger=None, keep_streams=True):
      """
      Run a Hadoop command.
  
      If ``keep_streams`` is set to :obj:`True` (the default), the
      stdout and stderr of the command will be buffered in memory.  If
      the command succeeds, the former will be returned; if it fails, a
      ``RunCmdError`` will be raised with the latter as the message.
      This mode is appropriate for short-running commands whose "result"
      is represented by their standard output (e.g., ``"dfsadmin",
      ["-safemode", "get"]``).
  
      If ``keep_streams`` is set to :obj:`False`, the command will write
      directly to the stdout and stderr of the calling process, and the
      return value will be empty.  This mode is appropriate for long
      running commands that do not write their "real" output to stdout
      (such as pipes).
  
      .. code-block:: python
  
        >>> hadoop_classpath = run_cmd('classpath')
      """
      if logger is None:
          logger = utils.NullLogger()
      _args = [tool]
      if hadoop_conf_dir:
          _args.extend(["--config", hadoop_conf_dir])
      _args.append(cmd)
      if properties:
          _args.extend(_construct_property_args(properties))
      if args:
          if isinstance(args, basestring):
              args = shlex.split(args)
          _merge_csv_args(args)
          gargs = _pop_generic_args(args)
          for seq in gargs, args:
              _args.extend(map(str, seq))
      logger.debug('final args: %r', (_args,))
      if keep_streams:
          p = subprocess.Popen(
              _args, stdout=subprocess.PIPE, stderr=subprocess.PIPE
          )
          error = ""
          stderr_iterator = iter(p.stderr.readline, b"")
          for line in stderr_iterator:
              error += line
              logger.info("cmd stderr line: %s", line.strip())
  
          output, _ = p.communicate()
      else:
          p = subprocess.Popen(_args, stdout=None, stderr=None, bufsize=1)
          ret = p.wait()
          error = 'command exited with %d status' % ret if ret else ''
          output = ''
      if p.returncode:
          raise RunCmdError(p.returncode, ' '.join(_args), error)
      return output