最近在研究基于内存处理技术,其中就有比较出名的Apache Ignite的项目。应用场景是,通过Spark/Java等工具处理Parquet文件,但是直接通过Java API处理Parquet文件的性能较差,主要原因在于不能实现并行化处理。
Ignite特性
Ignite的应用场景比较多,主要用在数据库缓存方便。当然,集合Ignite也可以结合Spark共享RDD用作缓存处理。
更多关于 Ignite的介绍,可以查看官方文档V1.7。如果对实际操作比较感兴趣,可以查看Ignite在Github上的实例代码。
安装Ignite
版主使用四节点实现分布式Ignite的安装,由于 Ignite具有自动发现机制,因此即使不进行配置,在同一局域网中也可以实现多个Server的分布式配置。
配置环境
- CDH5.8.0;
- JDK1.8.0;
- Spark1.6。
配置代码
同一般Spark集群不同的地方在于,Ignite安装在Yarn节点上,且配置Yarn节点与Spark Geteway环境变量,在/XXX/conf.cloudera.spark_on_yarn2/spark-env.sh文件中添加:
# Optionally set IGNITE_HOME here.
# IGNITE_HOME=/path/to/ignite
IGNITE_LIBS="\${IGNITE_HOME}/libs/*"
for file in \${IGNITE_HOME}/libs/*
do
if [ -d \${file} ] && [ "\${file}"!="\${IGNITE_HOME}"/libs/optional ]; then
IGNITE_LIBS=\${IGNITE_LIBS}:\${file}/*
fi
done
export SPARK_DIST_CLASSPATH=$IGNITE_LIBS
这里与官方文档中唯一的区别在于,官方文档中使用的CLASSPATH为SPARK_CLASSPATH,这里使用的CLASSPATH为SPARK_DIST_CLASSPATH。
测试Ignite
使用简单测试代码(spark-shell):
import org.apache.ignite.configuration._
import org.apache.ignite.spark._
// 使用default-config下面的配置
val igniteContext = new IgniteContext(sc, () => new IgniteConfiguration())
// val igniteContext = new IgniteContext(sc, "config/default-config.xml")
val cache = igniteContext.fromCache[Integer,Integer]("partitioned")
println("Name: "+cache.cacheName+"\tCount: "+cache.count())
cache.savePairs(sc.parallelize(1 to 10000, 10).map( item => (item, item)))
println("Name: "+cache.cacheName+"\tCount: "+cache.count())
报错信息:
java.lang.NoClassDefFoundError: javax/cache/configuration/MutableConfiguration
这个类主要是在cache-api中,在Ignite的libs里面有,将给Jar包的路径包含在Jars的路径中即可。另外一种,可能的解决方案为:Ignite Installation with Spark under CDH。
ClassNoDefMethodError: org.apache.ignite.configuration.IgniteConfiguration
缺少Jar包:将要Ignite下面的Ignite-core包含在Jars里面,或者配置路径。
另,Ignite-Spark这个Jar包不回在Ignite_Home/libs下面,所以需要手动下载到相应的路径下面,最好的办法就是将libs下面所有的Jar包放在spark_home/jars下面。
org.apache.ignite.IgniteCheckedException: Work directory does not exist and cannot be created
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!