最新的EMR 4.1.0捆绑了Hive 1.0.0和Spark 1.5.0,而Hive 1.0.0使用parquet-hadoop-bundle-1.5.0.jar
而Spark使用parquet-hadoop-1.7.0.jar
不幸的是版本镶木地板1.5.0无法读取由镶木地板1.7.0生成的文件。
我试图在Hive shell中使用add jar parquet-hive-bundle-1.7.0.jar
但没有运气,Hive仍然使用其捆绑的旧Parquet jar。
然后我尝试用新罐子替换旧罐子,但即使使用sudo find / "*parquet*.jar"
命令,我也找不到任何与木地板相关的罐子。
但是我将parquet-hive-bundle-1.7.0.jar
复制到/usr/lib/hive/lib
但是它没有用,Hive仍然使用旧的拼花瓶而无法读取我的镶木地板文件。通常这种方式适用于Cloudera发行版。
所以我的问题是,实木复合地板罐在哪里?如何用更新的版本替换它?
答案 0 :(得分:0)
我通过将新的镶木地板jar位置添加到环境变量' HADOOP_CLASSPATH'来解决了这个问题。在环境或.profile或.bashrc文件
export HADOOP_CLASSPATH = / var / lib / hive / parquet-hadoop-bundle-1.9.0.jar:$ HADOOP_CLASSPATH
运行以下命令以获取配置单元命令位置
which hive
打开' hive'文件在/ usr / bin /(您的蜂巢位置)
vi /usr/bin/hive
您应该看到类似下面的内容。
备份hive文件,并在exec之前的末尾为HADOOP_CLASSPATH添加一个echo命令,如下所示。
<强>蜂房强>
#!/bin/bash
if [ -d "/usr/hdp/2.5.0.0-1245/atlas/hook/hive" ]; then
if [ -z "${HADOOP_CLASSPATH}" ]; then
export HADOOP_CLASSPATH=/usr/hdp/2.5.0.0-1245/atlas/hook/hive/*
else
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:/usr/hdp/2.5.0.0-1245/atlas/hook/hive/*
fi
fi
...
if [ -z "${HADOOP_CLASSPATH}" ]; then
export HADOOP_CLASSPATH=${HCATALOG_JAR_PATH}
else
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${HCATALOG_JAR_PATH}
fi
echo&#34; Classpath = $ HADOOP_CLASSPATH&#34;
exec "${HIVE_HOME}/bin/hive.distro" "$@"
运行hive命令以显示类路径。
一旦我们获得了实际的类路径,我们就知道在哪里添加新的jar文件以优先于旧的拼花瓶。
在这种情况下,如果我们设置HADOOP_CLASSPATH,则hive的类路径将以HADOOP_CLASSPATH中的值为前缀。
因此,在新的拼花瓶中添加HADOOP_CLASSPATH值可以解决问题。
我不知道这是否是正确的解决方案,但它的工作原理。