"Spark 1.6 + Alluxio 1.2 HA + OFF_HEAP" 的配置

1、到
https://github.com/winse/spark-alluxio-blockstorage
下载 AlluxioBlockManager.scala 文件,并进行编译打包为 spark-alluxio-blockstore.jar

2、将alluxio-core-client-spark-1.2.0-jar-with-dependencies.jar、 spark-alluxio-blockstore.jar 放到所有Spark节点的lib目录下。并在 conf/spark-env.sh 的 SPARK_CLASSPATH 环境变量中加上这两个jar的路径,Spark 集群中所有的节点都需要这样配置。

echo 'export SPARK_CLASSPATH=/usr/spark-1.6.0/lib/alluxio-core-client-spark-1.2.0-jar-with-dependencies.jar:$SPARK_CLASSPATH' >> conf/spark-env.sh
echo 'export SPARK_CLASSPATH=/usr/spark-1.6.0/lib/ spark-alluxio-blockstore.jar:$SPARK_CLASSPATH' >> conf/spark-env.sh

3、在conf目录下创建 alluxio-site.properties,并添加如下内容:

alluxio.zookeeper.enabled=true
alluxio.zookeeper.address=192.168.1.151:2181

3、在 conf/spark-defaults.conf 修改 spark.externalBlockStore 的相关配置,如下:

spark.externalBlockStore.blockManager org.apache.spark.storage.AlluxioBlockManager
spark.externalBlockStore.subDirectories 8
spark.externalBlockStore.url alluxio-ft://unknown:19998 //此处可以任意的主机名和任意端口
spark.externalBlockStore.baseDir /tmp_spark_alluxio

三、测试

1、以文件方式访问

val file = sc.textFile("/home/hadoop/sample-1g") //此处可以任意的主机名和任意端口
file.saveAsTextFile("alluxio-ft://unknown:19998/sample-1g")
val alluxioFile = sc.textFile("alluxio-ft://unknown:19998/sample-1g")
alluxioFile.count()

2、调用RDD的persist,并使用OFF_HEAP进行数据缓存
在 spark-shell 中运行下面的测试代码:

val file = sc.textFile("/home/hadoop/sample-1g",4)
file.persist(org.apache.spark.storage.StorageLevel.OFF_HEAP)
file.count()

6、查看 Alluxio 中的缓存情况
这里写图片描述
从上面的图片中可以看到,已经缓存到Alluxio中了。

由于这个是开源的方案,所以在应用到真实环境之前,大家还是要多测试测试。

### 功能和作用 `static long get_dma_heap_pool_total(void)` 函数的主要功能是获取 DMA 堆页面池的总内存使用量。从之前的输出信息 `dma_heap: mtk_debug dma_heap_oom_notify: dmabuf buffer total: 1600400 KB, page pool total: 0 KB` 可知,页面池的总使用量是一个重要的监控指标,该函数可能用于提供这个指标的具体数值。 在系统运行过程中,DMA 堆的内存使用情况对于调试和性能优化非常关键。通过调用这个函数,开发者可以实时了解页面池的总内存使用量,判断是否存在内存耗尽或碎片化等问题。例如,当函数返回值持续增长且接近系统的物理内存上限时,可能会出现内存不足的情况,进而触发 `dma_heap_oom_notify` 通知。 ### 可能的实现示例 以下是一个简单的示例,展示该函数可能的实现方式: ```c #include <linux/dma-heap.h> static long get_dma_heap_pool_total(void) { struct dma_heap *heap; long total = 0; // 遍历所有的 DMA 堆 list_for_each_entry(heap, &dma_heap_list, node) { // 假设每个 DMA 堆有一个表示页面池总大小的成员变量 total += heap->page_pool_total; } return total; } ``` ### 可能存在的问题 - **准确性问题**:如果 `dma_heap` 结构体中的 `page_pool_total` 成员变量没有正确更新,函数返回的结果可能不准确。例如,在内存分配和释放操作中,如果没有及时更新该成员变量,会导致统计的总内存使用量与实际情况不符。 - **并发访问问题**:在多线程或多进程环境下,多个线程可能同时调用该函数或对 `page_pool_total` 进行读写操作,这可能会导致数据竞争和不一致的问题。 ### 优化建议 - **使用原子操作**:为了避免并发访问问题,可以使用原子操作来更新和读取 `page_pool_total` 成员变量。例如,将 `page_pool_total` 定义为 `atomic_long_t` 类型,并使用原子函数进行操作。 ```c #include <linux/dma-heap.h> #include <linux/atomic.h> struct dma_heap { // ... atomic_long_t page_pool_total; // ... }; static long get_dma_heap_pool_total(void) { struct dma_heap *heap; long total = 0; list_for_each_entry(heap, &dma_heap_list, node) { total += atomic_long_read(&heap->page_pool_total); } return total; } ``` - **缓存机制**:如果频繁调用该函数,可以考虑使用缓存机制来减少遍历 `dma_heap_list` 的开销。例如,在内存分配和释放操作中更新一个全局的页面池总使用量变量,函数直接返回该变量的值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值