1.最近想用spark输出parquet,但在用lz4压缩时出现了问题,各种报错.
首先是报错的是native lz4 library not available,这个我查了蛮久,大概就是hadoop中少了/Hadoop_Path/lib/native 中少了一个so. 因为这个报错是我在本地装了单机版本的spark, 其中的hadoop版本是pre-built在里面的.
好在服务器集群中是没问题的.
然后在服务器运行的时候又报错了.报错信息是No enum constant org.apache.parquet.hadoop.metadata.CompressionCodecName.LZ4.经过我查看,主要是版本问题,CompressionCodecName的对应的parquet-common应该需要的是1.10版本,而服务器只有是1.9版本,这就需要替换相应的包了.经过找了一圈解决方法,最后发现spark-submit有个参数,可以优先加载自己的包.设置如下,true表示优先使用自己提供的包.
--conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true
建议你把parquet需要的几个包全部添加到jars_dir中,然后在spark-submit添加下面参数,以及上面说的参数.这样就可以解决这些问题了.
--conf spark.executor.extraClassPath='/jars_dir/*' \
--conf spark.driver.extraClassPath='/jars_dir*' \
parquet需要的包主要有下面这些,你都添加进去就好了
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-column</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-hadoop</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-avro</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-common</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-format-structures</artifactId>
<version>${parquet-format-structures.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-encoding</artifactId>
<version>${parquet.version}</version>
</dependency>
2.spark 提交任务, 报错class not found 以及main class not found等问题,为什么我们配置了main class而且class文件也在jar包中还会出现这种问题,是因为我们把spark hadoop包也打包到jar包了,或者添加到extraClassPath中.(不是指pom.xml,这个添加不影响)
解决方法:把spark hadoop的包拿掉,比如spark-core ,spark-sql, parquet-format 等等.除非你要替换的话就参考1.
3.另外附上查看某个类具体使用的是哪个包的代码
classOf[redis.clients.jedis.JedisPool].getProtectionDomain.getCodeSource.getLocation.toString)
感谢这篇博客提供的帮助,解决了我的大忙.