Bash代码表现模糊:巨大的文件处理

时间:2017-10-19 07:18:26

标签: unix hadoop hdfs

这是一个hadoop& unix mix问题,我真的不确定哪一个对错误负责。

我有一个bash脚本,用以下方式执行文件验证:

  1. 检查文件的总行数是否与文件页脚中提到的值匹配。 (页脚是一个元数据,包含它上面的实际行总数,它位于数据文件的末尾)
  2. 检查文件名是否与应有的匹配。
  3. 计算行数&的函数。提取文件的页脚数是:

    count() {
        rowCount=$(echo $(hdfs dfs -cat ${hdfspath}/${fileName} | wc -l) - 2 | bc -l)
        footer=$(hdfs dfs -tail  ${hdfspath}/${fileName} | tail -1)
        footerRecordCount=`echo $footer | sed "s/[^0-9]//g"`
    }
    

    调用上述功能的代码段&执行验证测试如下:

    count()
    if [[ ${footerRecordCount} -ne ${rowCount} ]]; then
         echo "error=Number of records in the file doesn't match with record count value mentioned in the footer of the file" >&2
         exit 1
    else
         fn_logMessage "Footer Record Count $footerRecordCount matched with rows count $rowCount"
    fi
    
    if [ ${fileName} -ne ${actualFileName} ]; then
       echo "error=File name mismatch"
       exit 1
    else
    echo "File name matched"
    fi
    

    代码看起来相当直接&简单;它确实并且完美地运作。

    但是,当我在大文件(>400 GB)上开始此测试时,问题出现了。我收到如下错误:

    Footer Record Count 00000003370000000002000082238384885577696960005044939533796567041020102349250692990597110000000000000000002222111111111111110200000003440000100013060089448361739204836173971223 matched with rows count 929901602
    error=File name mismatch
    

    奇怪!!

    页脚记录计数实际上应该是数字929901602,但出现的数字是一些随机数,根本不存在于文件中的任何位置。然而,即使它的外观,它不匹配,输出被抛出为“匹配”。 虽然显示了下一个if循环的错误。

    不确定谁是罪魁祸首,unix或hadoop。但我连续3次进行了这项测试。每次弹出的“巨大数字”与前一个完全不同。所以,这些大数字之间甚至没有相关性。

    知道究竟出了什么问题?

    PS:就像我说的,代码适用于20 GB,50 GB等小文件。

    提前致谢。

0 个答案:

没有答案