背景:
已经存在如下环境:
Ambari 2.7.5
HDFS 3.2.1
YARN 3.2.1
HIVE 3.1.1 ON MapReduce2 3.2.2
新安装了 Spark2 2.4.8
提交spark任务到yarn集群,不能成功执行
Spark2.4.8遇到的问题与处理方式
错误:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
原因:spark自带的guava库版本比较低
处理方法:去除spark自带的旧版的guava库,使用hadoop自带的guava库,重启Spark2
- su spark
- cd /opt/redoop/apps/spark-2.4.8-bin-hadoop2.7/jars
- rm -f guava-14.0.1.jar
- ln -s /opt/redoop/apps/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar guava-27.0-jre.jar
- ll guava-27.0-jre.jar
错误:java.lang.IllegalArgumentException: Unrecognized Hadoop major version number: 3.2.2
原因:spark自带的hive库版本比较低
处理方法:去除spark自带的旧版的hive库,使用hive的自己的库,重启Spark2
- mkdir -p /root/zsp/spark-2.4.8-bin-hadoop2.7/jars
- mv /opt/redoop/apps/spark-2.4.8-bin-hadoop2.7/jars/hive*.jar /root/zsp/spark-2.4.8-bin-hadoop2.7/jars
-
- su spark
- cd /opt/redoop/apps/spark-2.4.8-bin-hadoop2.7/jars
- ln -s /opt/redoop/apps/apache-hive-3.1.1-bin/lib/hive-beeline-3.1.1.jar hive-beeline-3.1.1.jar
- ln -s /opt/redoop/apps/apache-hive-3.1.1-bin/lib/hive-cli-3.1.1.jar hive-cli-3.1.1.jar
- ln -s /opt/redoop/apps/apache-hive-3.1.1-bin/lib/hive-exec-3.1.1.jar hive-exec-3.1.1.jar
- ln -s /opt/redoop/apps/apache-hive-3.1.1-bin/lib/hive-jdbc-3.1.1.jar hive-jdbc-3.1.1.jar
- ln -s /opt/redoop/apps/apache-hive-3.1.1-bin/lib/hive-metastore-3.1.1.jar hive-metastore-3.1.1.jar
- ln -s /opt/redoop/apps/apache-hive-3.1.1-bin/lib/hive-shims-3.1.1.jar hive-shims-3.1.1.jar
- ln -s /opt/redoop/apps/apache-hive-3.1.1-bin/lib/hive-shims-common-3.1.1.jar hive-shims-common-3.1.1.jar
- ln -s /opt/redoop/apps/apache-hive-3.1.1-bin/lib/hive-shims-scheduler-3.1.1.jar hive-shims-scheduler-3.1.1.jar
- ll hive*
错误:java.lang.NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT
原因:spark-hive基于旧版的hive代码,在新版hive中已经不存在对应的字段
处理方法:重新编译Spark之后,拿编译后的spark-hive_2.11-2.4.8.jar替换原来的jar,重启Spark2
- cd /usr/local/src
- tar -xvf spark-2.4.8.tgz
- cd /usr/local/src/spark-2.4.8
- 修改 /usr/local/src/spark-2.4.8/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveUtils.scala
- 注释掉 HIVE_STATS_JDBC_TIMEOUT 和 HIVE_STATS_RETRIES_WAIT 所在行
- 修改 /usr/local/src/spark-2.4.8/pom.xml
- 加入依赖
- <dependency>
- <groupId>net.alchim31.maven</groupId>
- <artifactId>scala-maven-plugin</artifactId>
- <version>3.2.2</version>
- </dependency>
- ./build/mvn -Pyarn -Phadoop-2.7 -Phive -Phive-thriftserver -Dhadoop.version=2.7.3 -DskipTests clean package
- su spark
- cp -f /usr/local/src/spark-2.4.8/sql/hive/target/spark-hive_2.11-2.4.8.jar /opt/redoop/apps/spark-2.4.8-bin-hadoop2.7/jars/
- ll /opt/redoop/apps/spark-2.4.8-bin-hadoop2.7/jars/spark-hive*
- 其他机器:
- scp root@master:/opt/redoop/apps/spark-2.4.8-bin-hadoop2.7/jars/spark-hive_2.11-2.4.8.jar /tmp/
- su spark
- cp -f /tmp/spark-hive_2.11-2.4.8.jar /opt/redoop/apps/spark-2.4.8-bin-hadoop2.7/jars/
- ll /opt/redoop/apps/spark-2.4.8-bin-hadoop2.7/jars/spark-hive*
错误:org.apache.hadoop.hive.ql.metadata.HiveException: InvalidObjectException(message:No such catalog spark)
处理方法:spark配置目录里的hive-site.xml问题,使用hive的配置文件,重启Spark2
- su spark
- mv /etc/spark/hive-site.xml /etc/spark/hive-site.xml_bak
- cp -p /etc/hive/hive-site.xml /etc/spark/
- ll /etc/spark/
错误:NoSuchMethodError: org.apache.hadoop.hive.ql.exec.Utilities.copyTableJobPropertiesToConf(Lorg/apache/hadoop/hive/ql/plan/TableDesc;Lorg/apache/hadoop/conf/Configuration;)V
原因:spark jar包与低版本hive一起编译,导致编译的class文件入参类型JobConf转为父类了
处理方法:重新编译Spark之后,拿编译后的spark-hive_2.11-2.4.8.jar替换原来的jar,重启Spark2
此处问题没能解决,最终走向了升级spark
升级到spark3.1.3
spark文件升级
- cd /opt/redoop/apps
- wget --no-check-certificate https://dlcdn.apache.org/spark/spark-3.1.3/spark-3.1.3-bin-hadoop3.2.tgz
- tar -xvf spark-3.1.3-bin-hadoop3.2.tgz
- mv spark-3.1.3-bin-hadoop3.2/conf spark-3.1.3-bin-hadoop3.2/conf_bak
- ln -s /etc/spark spark-3.1.3-bin-hadoop3.2/conf
- chown -R spark:hadoop spark-3.1.3-bin-hadoop3.2
- rm spark
- ln -s spark-3.1.3-bin-hadoop3.2 spark
-
- su spark
- cd /opt/redoop/apps/spark/jars
- rm -f guava-14.0.1.jar
- ln -s /opt/redoop/apps/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar guava-27.0-jre.jar
- ll guava-27.0-jre.jar
Ambari页面上修改spark的配置文件
spark2-hive-site-override
metastore.catalog.default:spark->hive
spark2-env content 追加
#spark3 needs
export SPARK_DIST_CLASSPATH=$(${HADOOP_HOME}/bin/hadoop classpath)
错误:java.lang.UnsatisfiedLinkError: no gplcompression in java.library.path
原因:spark sql输出时使用了LZO压缩,没有找到对应的库
处理方法:安装LZO,重启HDFS
- 1. 安装lzop
- sudo yum -y install lzop
- 2. 安装lzo
- 下载
- cd /usr/local/src
- wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
- 编译
- tar -zxvf lzo-2.10.tar.gz
- cd lzo-2.10
- export CFLAGS=-m64
- ./configure -enable-shared
- make
- sudo make install
- 编辑 lzo.conf 文件
- sudo vi /etc/ld.so.conf.d/lzo.conf
- 在里面写入 /usr/local/lib
- sudo /sbin/ldconfig -v
- rm -rf lzo-2.10
- 3. 安装Hadoop-LZO
- 先下载 https://github.com/twitter/hadoop-lzo
- 编译
- cd /usr/local/src/hadoop-lzo-master
- export CFLAGS=-m64
- export CXXFLAGS=-m64
- export C_INCLUDE_PATH=/usr/local/include/lzo
- export LIBRARY_PATH=/usr/local/lib
- sudo yum install maven
- mvn clean package -Dmaven.test.skip=true
- 复制文件
- cp target/native/Linux-amd64-64/lib/* /opt/redoop/apps/hadoop/lib/native/
- cp target/hadoop-lzo-0.4.21-SNAPSHOT.jar /opt/redoop/apps/hadoop/share/hadoop/common/lib/
- cp target/hadoop-lzo-0.4.21-SNAPSHOT-javadoc.jar /opt/redoop/apps/hadoop/share/hadoop/common/lib/
- cp target/hadoop-lzo-0.4.21-SNAPSHOT-sources.jar /opt/redoop/apps/hadoop/share/hadoop/common/lib/
错误:WARN HdfsUtils: Unable to inherit permissions for file
处理方法:代码中设置hive参数 hive.warehouse.subdir.inherit.perms:false,关闭hive的文件权限继承来规避该问题
错误:java.lang.IllegalStateException: User did not initialize spark context
处理方法:打包前注释掉代码中的.master("local[*]")
错误:Class path contains multiple SLF4J bindings.
处理方法:把spark下的slf4j-log4j12包重命名,重启spark
mv /opt/redoop/apps/spark/jars/slf4j-log4j12-1.7.30.jar /opt/redoop/apps/spark/jars/slf4j-log4j12-1.7.30.jar_bak
Ambari页面上显示组件心跳丢失
集群节点中重启ambari-agent
- service ambari-agent status
- service ambari-agent restart