code: def fetch_task_failures(tracking_url):
      
      import mechanize
      timeout = 3.0
      failures_url = tracking_url.replace('jobdetails.jsp', 'jobfailures.jsp') + '&cause=failed'
      logger.debug('Fetching data from %s', failures_url)
      b = mechanize.Browser()
      b.open(failures_url, timeout=timeout)
      links = list(b.links(text_regex='Last 4KB'))  # For some reason text_regex='All' doesn't work... no idea why
      links = random.sample(links, min(10, len(links)))  # Fetch a random subset of all failed tasks, so not to be biased towards the early fails
      error_text = []
      for link in links:
          task_url = link.url.replace('&start=-4097', '&start=-100000')  # Increase the offset
          logger.debug('Fetching data from %s', task_url)
          b2 = mechanize.Browser()
          try:
              r = b2.open(task_url, timeout=timeout)
              data = r.read()
          except Exception as e:
              logger.debug('Error fetching data from %s: %s', task_url, e)
              continue
          # Try to get the hex-encoded traceback back from the output
          for exc in re.findall(r'luigi-exc-hex=[0-9a-f]+', data):
              error_text.append('---------- %s:' % task_url)
              error_text.append(exc.split('=')[-1].decode('hex'))
  
      return '\n'.join(error_text)
docs: Uses mechanize to fetch the actual task logs from the task tracker.
  
      This is highly opportunistic, and we might not succeed.
      So we set a low timeout and hope it works.
      If it does not, it's not the end of the world.
  
      TODO: Yarn has a REST API that we should probably use instead:
      http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/WebServicesIntro.html