网上提供的bin包中native下的so文件都是32位的,所以hadoop无法直接启动,启动时会报一大堆错。只能自己编译hadoop。因为是内网,要用代理出去,打包hadoop2.4的时候会有问题,maven的ant plug无法下载tomcat6,编译无法完成,使用路由让本机不使用代理可以打包成功,或只编译,编译后把so文件找出来替换bin包里的so也可以。
hadoop能够运行之后编译tez,需要在关闭hadoop的情况下编译,否则报错。按照官网上的说明配置好后还是不好用,tez-site.xml配置需要注意,网上看到的0.2.0版本的安装配置中写的
<configuration>
<property>
<name>tez.lib.uris</name>
<value>/tez-0.2.0/lib,/tez-0.2.0/</value>
</property>
</configuration>
不再适用0.4.0版本,新版本的配置应该是这样:
<property>
<name>tez.lib.uris</name>
<value>${fs.default.name}/tez,${fs.default.name}/tez/lib/</value>
</property>
lib文件夹在后边,而且还得带上${fs.default.name},文件是放在hdfs的根目录的。
测试时会报错:
java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.
at org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:120)
at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:82)
at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:75)
at org.apache.hadoop.mapreduce.Job$9.run(Job.java:1255)
at org.apache.hadoop.mapreduce.Job$9.run(Job.java:1251)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
则是hadoop_classpath配置不对,要添加tez包,但发现加好了这个配置以后hive启动不了。
还需要在yarn-site.xml中增加如下配置(在网上查到hadoop2.2就有这个问题,还被标记了解决,2.3和2.4仍然存在)。
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
否则会报:
org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateException(SerializedExceptionPBImpl.java:152)
at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.deSerialize(SerializedExceptionPBImpl.java:106)
hadoop正常了,接下来解决hive无法启动的问题。
hive 启动的时候报这个错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/thrift/TException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at org.apache.hadoop.util.RunJar.main(RunJar.java:205)
Caused by: java.lang.ClassNotFoundException: org.apache.thrift.TException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
想了半天,后来忽然明白过来了,这个不是hive报的,是hadoop报的,hive通过hadoop jar 的方式调用了hadoop,而hadoop的hadoop_classpath中没有这个包。原因是改hadoop_classpath的时候写了
export TEZ_CONF_DIR=$HADOOP_HOME/etc/hadoop/tez-site.xml
export TEZ_JARS=$HADOOP_HOME/share/tez
export HADOOP_CLASSPATH=$TEZ_CONF_DIR:$TEZ_JARS/*:$TEZ_JARS/lib/*
所以hive在调hadoop的时候,HADOOP_CLASSPATH没了,最后一句需要写成这样:
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:$TEZ_CONF_DIR:$TEZ_JARS/*:$TEZ_JARS/lib/*
hive正常启动了。