hive cli启动判断hadoop version的问题

测试环境的hive cli启动时报错:

1 Unable to determine Hadoop version information.

hive是一个shell:

使用sh -x跟踪运行过程,可以看到其通过hadoop version获取hdfs的版本

相关的代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # Make sure we're using a compatible version of Hadoop if  "x$HADOOP_VERSION"  ==  "x"  ];  then      HADOOP_VERSION=$($HADOOP version |  awk  '{if (NR == 1) {print $2;}}' ); fi echo  "hadoop_version is $HADOOP_VERSION" # Save the regex to a var to workaround quoting incompatabilities # between Bash 3.1 and 3.2 hadoop_version_re= "^([[:digit:]]+)\.([[:digit:]]+)(\.([[:digit:]]+))?.*$" if  [[  "$HADOOP_VERSION"  =~ $hadoop_version_re ]];  then      hadoop_major_ver=${BASH_REMATCH[1]}      hadoop_minor_ver=${BASH_REMATCH[2]}      hadoop_patch_ver=${BASH_REMATCH[4]} else      echo  "Unable to determine Hadoop version information."      echo  "'hadoop version' returned:"      echo  `$HADOOP version`      exit  5 fi if  "$hadoop_major_ver"  -lt  "1"  -a   "$hadoop_minor_ver$hadoop_patch_ver"  -lt  "201"  ];  then      echo  "Hive requires Hadoop 0.20.x (x >= 1)."      echo  "'hadoop version' returned:"      echo  `$HADOOP version`      exit  6 fi

先使用

1 hadoop version |  awk  '{if (NR == 1) {print $2;}}'

来获取version输出地第一行,然后用到了3.x shell中的正则功能。,最后通过BASH_REMATCH数组来判断匹配组,hadoop 也是一个shell ,运行hadoop version时其实是调用了org.apache.hadoop.util.VersionInfo类

而这里由于之前debug hadoop的变量问题,更改了hadoop的脚本,导致其第一行并没有输出version的信息。

这里其实使用hadoop version的第一行输出严格来说不太好,最好使用正则来处理,更改如下:

1 2 3 4 if  "x$HADOOP_VERSION"  ==  "x"  ];  then      #HADOOP_VERSION=$($HADOOP version | awk '{if (NR == 1) {print $2;}}');      HADOOP_VERSION=$($HADOOP version |  awk  '{if($0 ~ /[[:alpha:]]+ ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)?.*$/){print  $2};}' ); fi

本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1579829,如需转载请自行联系原作者

点赞