这是一个hadoop& unix mix问题,我真的不确定哪一个对错误负责。
我有一个bash脚本,用以下方式执行文件验证:
计算行数&的函数。提取文件的页脚数是:
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等小文件。
提前致谢。