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

本文介绍了如何通过自定义 AlluxioBlockManager 将 Spark 1.6 与 Alluxio 结合使用,解决了 Spark 在使用过程中遇到的数据共享和 GC 等问题。文中详细描述了配置步骤,并提供了测试方法。

我们知道,Spark + Tachyon 可以解决 Spark 在使用过程中的一些问题,可以总结为 数据共享GC 等问题。
但是呢,Tachyon 在今年已经更名为 Alluxio,并且其访问schema也从tachyon修改为alluxio;Spark 1.6 的版本也在维护中;可是,到目前为止,Spark还没有将之前的 Tachyon 的协议修改为 Alluxio 的协议,因此 Alluxio 就没有办法很顺利的与 Spark 进行结合使用。此处所说的结合是针对RDD在persist时使用 OFF_HEAP 的方式。


一、如何解决上面的问题呢?

方案是,针对alluxio自定义开发一个了继承自ExternalBlockManager的 AlluxioBlockManager,即可。但是在自定义之前,还是先到网上找找看有没有已经开源的实现方案呢,结果还是被我找到了两个:
1、https://github.com/winse/spark-alluxio-blockstorage
2、https://github.com/chengqiangboy/spark-alluxio-blockstore

经过测试,我发现第一个在使用中没有问题,但是第二个总是会报错,因此下面使用第一个的开源实现来进行配置。
需要说明的是,在Alluxio中 ALLUXIO_UNDERFS_ADDRESS 千万不要配置为本地目录,不然,你的测试会总是报错,一定要配置为HDFS集群,至于为什么,没有去深究。


二、Spark1.6 + Alluxio 1.2 配置

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/spark-defaults.conf 修改 spark.externalBlockStore 的相关配置,如下:

spark.externalBlockStore.blockManager org.apache.spark.storage.AlluxioBlockManager
spark.externalBlockStore.subDirectories 8
spark.externalBlockStore.url alluxio://hdfs-yarn-1:19998
spark.externalBlockStore.baseDir /tmp_spark_alluxio

三、测试

1、以文件方式访问

val file = sc.textFile("/home/hadoop/sample-1g")
file.saveAsTextFile("alluxio://hdfs-yarn-1:19998/sample-1g")
val alluxioFile = sc.textFile("alluxio://hdfs-yarn-1: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中了。

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

<think>我们正在处理一个关于KeilMDK链接脚本(分散加载文件)配置的问题。用户希望了解LR_IROM1、BSP_FLASH_START_ADDRESS、BSP_FLASH_SIZE、RW_IRAM1、ARM_LIB_HEAP这些关键元素的配置方法和含义。根据用户提供的引用[1]和之前的知识,我们可以这样组织答案:1.首先解释分散加载文件的基本结构,包括加载区域(LR)和执行区域(ER)。2.详细解释每个关键字和配置项的含义。3.给出一个完整的示例,并逐行解释。4.特别说明ARM_LIB_HEAP配置方法,因为这是动态内存分配相关的。注意:用户特别提到了RW_IRAM1和ARM_LIB_HEAP,说明用户可能关注RAM区域的配置,尤其是堆(heap)的设置。下面我们按照这个思路来回答:</think>### Keil MDK 链接脚本配置详解:LR_IROM1, BSP_FLASH*, RW_IRAM1, ARM_LIB_HEAP #### 1. **核心组件功能说明** | **关键字** | **类型** | **作用** | **典型值** | |------------|----------|----------|------------| | **`LR_IROM1`** | 加载区域 | 定义 Flash 存储区逻辑范围 | 用户自定义名称 | | **`BSP_FLASH_START_ADDRESS`** | 宏定义 | Flash 物理起始地址 | `0x08000000` (STM32) | | **`BSP_FLASH_SIZE`** | 宏定义 | Flash 总容量 | `0x00100000` (1MB) | | **`RW_IRAM1`** | 执行区域 | 定义 RAM 数据存储区 | 用户自定义名称 | | **`ARM_LIB_HEAP`** | 保留段 | 动态内存分配堆空间 | `0x2000` (8KB) | #### 2. **完整配置示例与解析** ```scatter ;===== FLASH 区域(只读)===== LR_IROM1 BSP_FLASH_START_ADDRESS BSP_FLASH_SIZE { ; 加载区域定义 ER_IROM1 BSP_FLASH_START_ADDRESS BSP_FLASH_SIZE { ; 执行区域=加载地址 *.o (RESET, +First) ; 复位向量(必须首位)[^1] *(InRoot$$Sections) ; C库初始化代码(__main等) .ANY (+RO) ; 所有只读数据(.text/.rodata) } ;===== RAM 区域(读写)===== RW_IRAM1 0x20000000 0x00020000 { ; RAM起始地址+大小 .ANY (+RW) ; 初始化变量(.data) .ANY (+ZI) ; 未初始化变量(.bss) ARM_LIB_HEAP 0x2000A000 EMPTY 0x00001000 {} ; 堆区(8KB) ARM_LIB_STACK 0x2000B000 EMPTY 0x00000800 {} ; 栈区(2KB) } } ``` #### 3. **关键配置详解** 1. **Flash 配置 (`LR_IROM1`)**: - `BSP_FLASH_START_ADDRESS`:必须匹配芯片手册的 Flash 基址 - `RESET, +First`:保证中断向量表位于 `0x08000000` - `.ANY (+RO)`:自动分配所有代码段和常量 2. **RAM 配置 (`RW_IRAM1`)**: - `0x20000000`:Cortex-M 内核 SRAM 标准起始地址 - `+RW`:已初始化的全局/静态变量 - `+ZI`:未初始化的全局/静态变量(自动清零) 3. **动态内存管理 (`ARM_LIB_HEAP`)**: ```scatter ARM_LIB_HEAP [起始地址] EMPTY [大小] {} ``` - 必须使用 `EMPTY` 关键字预留未初始化空间 - 大小需在 `startup_*.s` 中同步配置: ```asm Heap_Size EQU 0x00001000 ; 匹配链接脚本设置 ``` #### 4. **宏定义规范(`bsp_memory.h`)** ```c #define BSP_FLASH_START_ADDRESS 0x08000000 #define BSP_FLASH_SIZE 0x00100000 // 1MB Flash #define BSP_RAM_START_ADDRESS 0x20000000 #define BSP_RAM_SIZE 0x00020000 // 128KB RAM ``` #### 5. **地址分配策略** ```mermaid graph LR Flash[LR_IROM1] --> |代码+常量| ER_IROM1 RAM[RW_IRAM1] --> |变量| RW_ZI(RW+ZI) RAM --> |动态内存| Heap(ARM_LIB_HEAP) RAM --> |函数调用| Stack(ARM_LIB_STACK) ``` #### 6. **验证配置正确性** 1. 查看 `map` 文件确认地址: ``` Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00001000) Reset_Handler 0x08000000 .text 0x08000100 Execution Region RW_IRAM1 (Base: 0x20000000) .data 0x20000000 .bss 0x20000100 ARM_LIB_HEAP 0x2000A000 EMPTY 0x1000 ``` 2. 运行时检查堆地址: ```c extern uint8_t __heap_base[]; // 声明链接器符号 printf("Heap start: 0x%p\n", __heap_base); ``` #### 7. **常见问题解决** - **堆栈溢出**: ```diff - ARM_LIB_HEAP 0x2000A000 EMPTY 0x00001000 {} + ARM_LIB_HEAP 0x2000A000 EMPTY 0x00002000 {} ; 增大堆空间 ``` - **Flash 地址错误**: 在 `Options for Target > Target` 中检查: - IROM1 地址 = `BSP_FLASH_START_ADDRESS` - IROM1 大小 = `BSP_FLASH_SIZE` - **双 Bank Flash 配置**(STM32F4/F7): ```scatter LR_IROM1 0x08000000 0x00080000 { ... } ; Bank1 LR_IROM2 0x08100000 0x00080000 { ... } ; Bank2 ``` > **设计原则**:堆(Heap)和栈(Stack)必须物理隔离,推荐布局: > ```plaintext > 0x20000000 ┌────────────┐ > │ .data │ > │ .bss │ > ├────────────┤ ← 堆起始 > │ HEAP │ > ├────────────┤ ← 栈顶(向下生长) > │ STACK │ > 0x20020000 └────────────┘ > ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值