ETL日志数据到HBASE表中,程序代码优化点

本文探讨了在Spark中优化程序执行效率的方法,包括利用广播变量减少数据传输消耗,以及在向HBase存储数据时采用HFileOutputFormat以提高写入性能。同时,介绍了在创建表时设置数据压缩、预分区及禁用数据缓存等策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.创建表的时候

设置表的数据压缩

创建预分区

设置读取表中的数据不缓存

2.spark程序的优化

.filter(tuple =>eventTypeList.contains(EventEnum.valueOfAlias(tuple._1)))

eventTypeList是Driver里面,filter是在Executor里面task运行

如果是一个数据库对应一个分区,一个分区对应一个Task,假设有1000个分区
如果eventTypeList1M的话,将消耗1GB
可以考虑一个executor存储一份,如果有10个executor存储10M就好了

Spark supports two types of shared variables

broadcast variables:广播变量
which can be used to cache a value in memory on all nodes,
使用广播变量将集合类别 广播出去:将数据发送到每一个executor里面

accumulators:累加器
which are variables that are only “added” to, such as counters and sums.

3.使用HFileOuputFile

向HBASE表中存储数据的时候

put方式
putData ->WAL->MemStore ->StoreFile(HFile)

Hfile方式
Date –>Hfile ->load table

### 数据迁移概述 对于大规模数据量(如一亿条记录),从关系型数据库MySQL迁移到NoSQL存储系统HBase是一项复杂而重要的任务。为了确保高效、稳定的数据传输,通常会采用多种技术手段相结合的方式完成这一过程[^1]。 ### 方案选择依据 考虑到不同场景下的需求差异,在实际操作过程中可以根据业务特选取合适的工具和技术栈来实现数据同步目标: - **实时性要求不高**:可以考虑批量处理方式; - **对延迟敏感的应用环境**:则更适合流式计算框架来进行增量更新; ### 方法介绍 #### 批量加载模式 利用ETL(Extract, Transform, Load)工具如DataX能够有效地将源中的全量数据抽取写入至目的端HBase集群中。这种方式适用于一次性初始化或者周期性的大批量导入作业[^2]。 ```python from datax import DataX job_config = { "job": { "content": [ { "reader": {"name": "mysqlreader", ...}, "writer": {"name": "hbasewriter", ...} } ] } } dx = DataX(job_config) result = dx.start() print(f"Job finished with status {result}") ``` #### 流式处理机制 借助Apache Flink等分布式流处理器件,通过监听MySQL binlog日志变化事件触发相应的变更捕获动作,即时转发给下游消费者即HBase实例执行最终持久化操作。此法能较好地满足低延时诉求的同时保持两端一致性水平[^3]。 ```java // Java伪代码展示Flink连接器配置片段 FlinkKafkaConsumer<String> mySqlBinLogSource = new FlinkKafkaConsumer<>( topic, new SimpleStringSchema(), properties); DataStream<String> stream = env.addSource(mySqlBinLogSource); stream.process(new HBaseWriteFunction()).setParallelism(parallelismDegree).addSink(...); ``` #### Python脚本驱动 针对某些特定应用场景下可能存在的定制化需求,也可以编写专门的Python应用程序负责协调整个流程控制逻辑,包括但不限于预处理阶段的任务调度安排以及事后验证环节的质量检查工作等。 ```bash #!/usr/bin/env python3 import mysql.connector as mc from happybase import ConnectionPool def migrate_data(): try: # 连接设置省略... sql_query = 'SELECT * FROM source_table' hbase_row_key_format = '{id}' with connection_pool.connection() as conn: batch_size = 1000 cursor.execute(sql_query) while True: rows = cursor.fetchmany(batch_size) if not rows: break table.put([dict(zip(columns, row)) for row in rows], column_family='cf:', timestamp=int(time.time()*1e6), wal=True) if __name__ == '__main__': migrate_data() ``` ### 性能考量因素 当评估上述任一种策略优劣之时,除了关注吞吐率指标之外还应充分重视其他方面的影响要素,比如网络带宽消耗状况、磁盘I/O压力分布情况等等。此外,Phoenix作为构建于HBase之上的SQL层解决方案提供了更为便捷高效的查询接口支持,因此值得特别留意其相对于传统API调用所带来的潜在优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值