在大数据企业生态系统中,分析和数据科学总是有新的选择。 Apache孵化了许多项目,人们总是对如何选择合适的生态系统项目感到困惑。 在数据科学管道中,即席查询是重要的方面,它使用户能够运行不同的查询,从而产生探索性统计信息,从而帮助他们理解数据。 实际上,对于许多公司和实践而言,Hive仍然是他们的工作之马。 与Hive一样古老,不同的组织可能会以不同的方式破解它,以使其易于使用。 仍然,我听到很多抱怨说查询无法完成。 花时间等待查询执行和调整查询结果会减慢数据科学发现的速度。
就个人而言,与Hive map-reduce程序相比,我喜欢使用Spark来运行即席查询,这主要是因为同时在Spark上执行其他操作比较容易。 我不必使用其他工具来回切换。 最近,我还研究了Alluxio,这是一个分布式的内存文件系统。 在本文中,我将演示使用SparkSQL,Parquet和Alluxio来加速即席查询分析的示例。 使用Spark加速查询时,数据局部性是关键。
使用MapR安装Alluxio
首先,我们从在3节点AWS实例(m4.2xlarge)上运行的现有MapR 5.1系统开始。 我们从Github下载Alluxio并使用Mapr5.1构件进行编译。
git clone git://github.com/alluxio/alluxio.git
cd alluxio
git checkout v1.2.0
mvn clean package -Dhadoop.version=2.7.0-mapr-1602 -Pspark -DskipTests
Oracle Java 8用于编译Alluxio,它也是与MapR系统运行的Java相同的版本。 但是,要启动Alluxio Web UI,需要暂时切换回Java 7。 我们还对配置进行了一些更改,添加了alluxio-env.sh:
ALLUXIO_MASTER_HOSTNAME=${ALLUXIO_MASTER_HOSTNAME:-"node1 host name"}
ALLUXIO_WORKER_MEMORY_SIZE=${ALLUXIO_WORKER_MEMORY_SIZE:-"5120MB"}
ALLUXIO_RAM_FOLDER=${ALLUXIO_RAM_FOLDER:-"/mnt/ramdisk"}
ALLUXIO_UNDERFS_ADDRESS=${ALLUXIO_UNDERFS_ADDRESS:- "/mapr/clustername/tmp/underFSStorage"}
ALLUXIO_JAVA_OPTS+=" - Dalluxio.master.journal.folder=/mapr/clustername/tmp/journal"
这些配置将放置在MapR文件系统上的Alluxio文件存储以及主日志中,同时还为Alluxio工作集文件设置5GB的内存。 我们甚至可以在MapR-FS中设置一个专用的卷作为Alluxio的文件系统。 我们还可以添加一个工作文件,该文件的主机名是我们计划在其上运行Alluxio worker的3个节点的主机名。
node1
node2
node3
因此,在我们的3节点MapR集群之上,我们具有Alluxio架构,其中主服务器运行在node1上,工作服务器运行在node1,node2和node3上。 您只需要运行一些命令就可以运行Alluxio。 那么您将可以在节点1:19999处访问Web UI
clush -ac /opt/mapr/alluxio/conf
cd /opt/mapr/alluxio/
bin/alluxio format
bin/alluxio-start.sh all
准备数据
为了进行比较,我们还使用CDH-5.8.0构建了一个4节点的Cloudera集群(m4.2xlarge),并将Alluxio放在具有相同架构的3个数据节点上。 我们在两个集群上运行一个独立的Spark shell,在node1上运行spark-master,在node [1-3]上运行3个工作线程,每个工作线程的内存均为10GB。 我们将使用来自Kaggle的点击率预测数据作为我们将要处理的样本数据。 样本数据的大小为5.9GB,包含超过4000万行。 要启动Spark shell,我们使用:
spark-shell --master spark://node1:7077 --executor-memory 2G --packages com.databricks:spark-csv_2.1:0:1.4.0
在Spark Shell中,我们从maprfs和hdfs的受尊重路径中加载csv:
val trainSchema = StructType(Array(
StructField("id", StringType, false),
StructField("click", IntegerType, true),
StructField("hour", IntegerType, true),
StructField("C1", IntegerType, true),
StructField("banner_pos", IntegerType, true),
StructField("site_id", StringType, true),
StructField("site_domain", StringType, true),
StructField("site_category", StringType, true),
StructField("app_id", StringType, true),
StructField("app_domain", StringType, true),
StructField("app_category", StringType, true),
StructField("device_id", StringType,