http://www.alluxio.org/docs/1.8/en/Running-Spark-on-Alluxio.html
Alluxio 解决的问题:
现有的streaming architecture 的bottleneck是:
1.hdfs 存储系统位于远端的服务器:文件的输入输出会引起大量的网络延迟,数据的更改变成流处理的一个bottleneck
。
2.HDFS使用普通的磁盘,因此IO操作,尤其是读操作有很高的延迟。spark streaming的executor需要重复的跨集群从HDFS执行读操作,进一步降低了整体的性能。
3.当spark stremaing的 executor 用光内存并且失败时,将会在另外的节点重启,但是这样就不会利用之前的checkpoint,因此某些任务可能永远不能完成。
4.当spark streaming 任务持久化数据使用 MEMORY_ONLY时,会复制数据在jvm的内存中。会引起垃圾回收,有时候会导致任务失败。
如果持久化的级别的为MEMORY_TO_DISK 或者DISK_ONLY时,磁盘的IO又成了系统的瓶颈。
问题的解决:
并没有改变之前的架构逻辑,只是在计算框架和HSDF之间部署了Alluxio,因为Alluxio可以加速数据的处理,
因此计算框架可以高效的交换数据。在架构中,只有最终的输出结果才会持久化到HDFS上。
架构的大部分和之前类似。主要的不同是由spark streaming生成和使用的大部分数据存储在Alluxio中,避免了和慢速的远端hdfs集群交互。与此同时数据存储在Alluxio中可以很方便的被其他的计算框架Flink,Zeppelin共享。
因为Alluxio具备以下的特点,所以在提升系统性能的过程中扮演了重要的角色。
01: Alluxio的workers部署在每个计算节点上,以管理本地的内存,SSD和磁盘
。流处理所需的数据尽可能的保存在本地,以节省带宽。与此同时,Alluxio提供多种赶出策略,以将大多数使用的
数据保存在内存中。这极大的提高了数据的访问效率。
02:除了spark streaming,其他组件也可以从Alluxio中读取数据,Spark Streaming和spark batch作业也可以用Alluxio
环境
系统版本:Centos 7.5
Scala版本:2.11.11
Spark版本: Apache spark-2.1.1
介绍:
Alluxio是一个分布式内存文件系统,是底层文件系统和上层计算框架之间的中间件。通过把部分不需要存到文件系统的文件存储到内存文件系统中达到访问效率的提高,从而让集群中可以内存访问的速度共享数据。Alluxio不仅支持Spark,还支持Hadoop,Impala,Tez等,底层可以连接HDFS,S3,NFS等
解压安装Alluxio
[pony@master~]$ cp /home/pony/tgz/alluxio-1.6.1-bin.tar.gz ~/
[pony@master~]$ tar xvfz alluxio-1.6.1-bin.tar.gz
[pony@master~]$ cd alluxio-1.6.1/conf
创建配置文件
[pony@master conf]$cp alluxio-site.properties.template alluxio-site.properties
[pony@master conf]$vim alluxio-site.properties
4.1. 本次实验中使用的是单机,所以需要修改如下配置。alluxio.master.hostname=localhost配置的是 alluxio文件系统使用的是本地,alluxio.underfs.address设置为一个本地文件系统上的临时文件夹(例如,alluxio.underfs.address=/home/pony/alluxio-1.6.1/tmp)。
4.2 首先创建文件夹
mkdir -p /home/pony/alluxio-1.6.1/tmp
4.3 然后 alluxio-site.properties 配置文件中修改成如下:
alluxio.master.hostname=localhost
alluxio.underfs.address= /home/pony/alluxio-1.6.1/tmp
格式化存储
[pony@master conf]$cd ..
[pony@master ]$bin/alluxio format
启动Alluxio :
[pony@master alluxio-1.6.1]$ bin/alluxio-start.sh local
验证Alluxio是否运行
1) 为了确认Alluxio处于运行状态,用户可以访问http://localhost:19999,或者查看logs文件夹下的日志。
2) 命令行键入命令启动Firefox,然后地址栏键入上述地址即可查看
[pony@master alluxio-1.6.1]$ firefox &
运行一个更全面的系统完整性检查:
[pony@master alluxio-1.6.1]$ bin/alluxio runTests
Alluxio 的常用操作接口
9.1 命令行接口:
[pony@master alluxio-1.6.1]$bin/alluxio fs
1) 对于用Alluxio URI(如ls, mkdir)作为参数的fs子命令来说,参数应该要么是完全的Alluxio URI alluxio://:/ ,要么是没有头部信息的/ ,以使用conf/allluxio-site.properties中设置的默认的主机名和端口。
2) 拷贝文件到alluxio:
[pony@master alluxio-1.6.1]$bin/alluxio fs copyFromLocal /etc/protocols /hosts
3) 查看已经上传的文件
[pony@master alluxio-1.6.1]$ bin/alluxio fs ls /hosts
4) 查看上传的文件内容
[pony@master alluxio-1.6.1]$ bin/alluxio fs cat /hosts
[pony@master ~]$cd
[pony@master ~]$ mv hadoop-2.7.3/ hadoop-2.7.3.bak/
1) 拷贝Alluxio相关的jar包spark 家目录下的jar文件夹
[pony@master ~]$ cp alluxio-1.6.1/client/spark/alluxio-1.6.1-spark-client.jar /home/pony/spark-2.1.1-bin-hadoop2.7/jars/
2) 启动spark-shell
[pony@master ~]$ cd
[pony@master ~]$ cd spark-2.1.1-bin-hadoop2.7/
[pony@master spark-2.1.1-bin-hadoop2.7]$ bin/spark-shell --master local[*]
3) 读取Alluxio 中文件
scala>file = sc.textFile("alluxio://localhost:19998/hosts")
4) 对文件进行词频统计:
scala>val wc= file.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
5) 将词频统计结果输出到 alluxio:
wc.saveAsTextFile("alluxio://localhost:19998/result")
6) 然后ctrl +D组合键退出命令行
7) 去alluxio文件系统中查看结果
[pony@master~]$ cd
[pony@master~]$ cd alluxio-1.6.1/
[pony@master alluxio-1.6.1]$ bin/alluxio fs ls /result
停止服务
[pony@master alluxio-1.6.1]$ /bin/alluxio -stop.sh local
其他的模式操作也类似。