HBase MapReduce与Speculative Task

本文探讨了在使用HBase作为数据源时如何通过关闭MapReduce的推测执行来提高效率。介绍了推测执行的工作原理及其可能带来的负面影响,并提供了两种关闭此功能的方法。

转载自:http://blog.youkuaiyun.com/rzhzhz/article/details/7676856


Speculative Task(推测式任务)是mapreduce框架中一个比较重要的优化策略。当某个server某个时间段处于忙碌状态而无法快速完成某个task(当然也可能是server本身性能低下),从而拖延了整个job的完成进度,此时若启用Speculative Task策略,jobtacker会为执行慢的task启动speculative task,多个相同的任务同时运行,哪个task先运行完,则采用该task的执行结果,并同时kill掉执行慢的task。这样做能尽量减少执行慢的task带来的性能拖延。但同时Speculative Task也会带来负面影响。即启动了多余的task,会耗掉server更多的资源,对于资源吃紧的集群来说应该尽量不启用。关于Speculative Task更具体的介绍请参考Hadoop中Speculative Task调度策略。

 

而HBase框架中,map/reduce在操作HBase的时候会尽量采用本地策略(优先本地数据),即每个task所在的tasktracker会尽可能与它所计算数据所在的regionserver在同一个server上。所以多启动一个speculative task(此时数据肯定不在本地)只会增加io,网络等资源的消耗,不会带来实质性的性能优化。所以HBase官方文档上也强烈建议关闭speculative task来避免资源的浪费。

 

[java]  view plain copy
  1. It is generally advisable to turn off speculative execution for MapReduce jobs that use HBase as a source. This can either be done on a per-Job basis through properties, on on the entire cluster. Especially for longer running jobs, speculative execution will create duplicate map-tasks which will double-write your data to HBase; this is probably not what you want.  


关闭Speculative task有两种方式,一种是在mapred-site.xml文件中配置

[java]  view plain copy
  1. <property>  
  2. <name>mapred.map.tasks.speculative.execution</name>  
  3. <value>false</value>  
  4. </property>  
  5. <property>  
  6. <name>mapred.reduce.tasks.speculative.execution</name>  
  7. <value>false</value>  
  8. </property>  

默认情况下这两个配置都是true,处于开启状态。

另外一种方法是在提交job的时候在程序中设置,如

[java]  view plain copy
  1. jobconf.set("mapred.map.tasks.speculative.execution",false);  
  2. jobconf.set("mapred.reduce.tasks.speculative.execution",false);  
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)内容概要:本文介绍了一个涵盖多个科研领域的综合性MATLAB仿真资源集合,重点聚焦于光伏发电系统中基于粒子群优化(PSO)算法的最大功率点追踪(MPPT)技术的Simulink仿真实现。文档还列举了多种MPPT方法(如P&O、增量电导法、神经网络、模糊逻辑控制等),并展示了该团队在电力系统、智能优化算法、机器学习、路径规划、无人机控制、信号处理等多个方向的技术服务能力代码实现案例。整体内容以科研仿真为核心,提供大量可复现的Matlab/Simulink模型和优化算法应用实例。; 适合人群:具备一定电力电子、自动控制或新能源背景,熟悉MATLAB/Simulink环境,从事科研或工程仿真的研究生、科研人员及技术人员。; 使用场景及目标:①学习并实现光伏系统中基于粒子群算法的MPPT控制策略;②掌握多种智能优化算法在电力系统自动化领域的建模仿真方法;③获取可用于论文复现、项目开发和技术攻关的高质量仿真资源。; 阅读建议:建议结合提供的网盘资料,按照研究方向选取对应模块进行实践,重点关注Simulink模型结构算法代码逻辑的结合,注重从原理到仿真实现的全过程理解,提升科研建模能力。
热成像人物检测数据集 一、基础信息 数据集名称:热成像人物检测数据集 图片数量: 训练集:424张图片 验证集:121张图片 测试集:61张图片 总计:606张热成像图片 分类类别: - 热成像人物:在热成像图像中的人物实例 - 非热成像人物:在非热成像或普通图像中的人物实例,用于对比分析 标注格式: YOLO格式,包含边界框和类别标签,适用于目标检测任务。数据来源于热成像和视觉图像,覆盖多种场景条件。 二、适用场景 热成像监控安防系统开发: 数据集支持目标检测任务,帮助构建能够在低光、夜间或恶劣环境下自动检测和定位人物的AI模型,提升监控系统的可靠性和实时响应能力。 红外视觉应用研发: 集成至红外摄像头或热成像设备中,实现实时人物检测功能,应用于安防、军事、救援和工业检测等领域。 学术研究创新: 支持计算机视觉热成像技术的交叉研究,助力开发新算法用于人物行为分析或环境适应型检测模型。 教育培训: 可用于高校或培训机构,作为学习热成像人物检测和AI模型开发的教学资源,提升实践技能。 三、数据集优势 精准标注多样性: 每张图片均由专业标注员标注,确保边界框定位准确,类别分类清晰。包含热成像和非热成像类别,提供对比数据,增强模型的泛化能力和鲁棒性。 场景实用性强: 数据覆盖多种环境条件,如不同光照和天气,模拟真实世界应用,适用于复杂场景下的人物检测任务。 任务适配性高: YOLO标注格式兼容主流深度学习框架(如YOLOv5、YOLOv8等),可直接加载使用,支持快速模型开发和评估。 应用价值突出: 专注于热成像人物检测,在安防、监控和特殊环境检测中具有重要价值,支持早期预警和高效决策。
[root@node1 lib]# sqoop export \ > --connect jdbc:mysql://192.168.249.151:3306/metastore \ > --username root \ > --password 123456 \ > --table total_msg_cnt \ > --export-dir /user/hive/warehouse/mybase.db/total_msg_cnt \ > --input-fields-terminated-by ',' \ > --num-mappers 1 Warning: /export/server/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Warning: /export/server/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. Warning: /export/server/sqoop-1.4.6/../zookeeper does not exist! Accumulo imports will fail. Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation. 错误: 找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty 25/06/29 15:43:23 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6 25/06/29 15:43:23 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 25/06/29 15:43:23 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. 25/06/29 15:43:23 INFO tool.CodeGenTool: Beginning code generation Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary. 25/06/29 15:43:24 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `total_msg_cnt` AS t LIMIT 1 25/06/29 15:43:24 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `total_msg_cnt` AS t LIMIT 1 25/06/29 15:43:24 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /export/software/hadoop-2.7.5 注: /tmp/sqoop-root/compile/bd973557a2b55f58f8fb21700304a651/total_msg_cnt.java使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 25/06/29 15:43:26 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-root/compile/bd973557a2b55f58f8fb21700304a651/total_msg_cnt.jar 25/06/29 15:43:26 INFO mapreduce.ExportJobBase: Beginning export of total_msg_cnt 25/06/29 15:43:27 INFO Configuration.deprecation: mapred.jar is deprecated. Instead, use mapreduce.job.jar 25/06/29 15:43:28 INFO Configuration.deprecation: mapred.reduce.tasks.speculative.execution is deprecated. Instead, use mapreduce.reduce.speculative 25/06/29 15:43:28 INFO Configuration.deprecation: mapred.map.tasks.speculative.execution is deprecated. Instead, use mapreduce.map.speculative 25/06/29 15:43:28 INFO Configuration.deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps 25/06/29 15:43:29 INFO client.RMProxy: Connecting to ResourceManager at node1/192.168.249.151:8032 25/06/29 15:43:34 INFO input.FileInputFormat: Total input paths to process : 1 25/06/29 15:43:34 INFO input.FileInputFormat: Total input paths to process : 1 25/06/29 15:43:34 INFO mapreduce.JobSubmitter: number of splits:1 25/06/29 15:43:34 INFO Configuration.deprecation: mapred.map.tasks.speculative.execution is deprecated. Instead, use mapreduce.map.speculative 25/06/29 15:43:34 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1751172328542_000525/06/29 15:43:35 INFO impl.YarnClientImpl: Submitted application application_1751172328542_000525/06/29 15:43:35 INFO mapreduce.Job: The url to track the job: http://node1:8088/proxy/application_1751172328542_0005/ 25/06/29 15:43:35 INFO mapreduce.Job: Running job: job_1751172328542_0005 25/06/29 15:43:55 INFO mapreduce.Job: Job job_1751172328542_0005 running in uber mode : false 25/06/29 15:43:55 INFO mapreduce.Job: map 0% reduce 0% 25/06/29 15:44:13 INFO mapreduce.Job: Task Id : attempt_1751172328542_0005_m_000000_0, Status : FAILED Error: java.io.IOException: Can't export data, please check failed map task logs at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:112) at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146) at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1754) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) Caused by: java.lang.RuntimeException: Can't parse input data: '2024-06-243735' at total_msg_cnt.__loadFromFields(total_msg_cnt.java:249) at total_msg_cnt.parse(total_msg_cnt.java:192) at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:83) ... 10 more Caused by: java.util.NoSuchElementException at java.util.ArrayList$Itr.next(ArrayList.java:862) at total_msg_cnt.__loadFromFields(total_msg_cnt.java:244) ... 12 more Container killed by the ApplicationMaster. Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143 25/06/29 15:44:23 INFO mapreduce.Job: Task Id : attempt_1751172328542_0005_m_000000_1, Status : FAILED Error: java.io.IOException: Can't export data, please check failed map task logs at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:112) at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146) at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1754) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) Caused by: java.lang.RuntimeException: Can't parse input data: '2024-06-243735' at total_msg_cnt.__loadFromFields(total_msg_cnt.java:249) at total_msg_cnt.parse(total_msg_cnt.java:192) at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:83) ... 10 more Caused by: java.util.NoSuchElementException at java.util.ArrayList$Itr.next(ArrayList.java:862) at total_msg_cnt.__loadFromFields(total_msg_cnt.java:244) ... 12 more 25/06/29 15:44:35 INFO mapreduce.Job: Task Id : attempt_1751172328542_0005_m_000000_2, Status : FAILED Error: java.io.IOException: Can't export data, please check failed map task logs at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:112) at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146) at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1754) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) Caused by: java.lang.RuntimeException: Can't parse input data: '2024-06-243735' at total_msg_cnt.__loadFromFields(total_msg_cnt.java:249) at total_msg_cnt.parse(total_msg_cnt.java:192) at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:83) ... 10 more Caused by: java.util.NoSuchElementException at java.util.ArrayList$Itr.next(ArrayList.java:862) at total_msg_cnt.__loadFromFields(total_msg_cnt.java:244) ... 12 more 25/06/29 15:44:43 INFO mapreduce.Job: map 100% reduce 0% 25/06/29 15:44:44 INFO mapreduce.Job: Job job_1751172328542_0005 failed with state FAILED due to: Task failed task_1751172328542_0005_m_000000 Job failed as tasks failed. failedMaps:1 failedReduces:0 25/06/29 15:44:44 INFO mapreduce.Job: Counters: 9 Job Counters Failed map tasks=4 Launched map tasks=4 Other local map tasks=3 Data-local map tasks=1 Total time spent by all maps in occupied slots (ms)=39274 Total time spent by all reduces in occupied slots (ms)=0 Total time spent by all map tasks (ms)=39274 Total vcore-milliseconds taken by all map tasks=39274 Total megabyte-milliseconds taken by all map tasks=40216576 25/06/29 15:44:44 WARN mapreduce.Counters: Group FileSystemCounters is deprecated. Use org.apache.hadoop.mapreduce.FileSystemCounter instead 25/06/29 15:44:44 INFO mapreduce.ExportJobBase: Transferred 0 bytes in 75.7247 seconds (0 bytes/sec) 25/06/29 15:44:44 WARN mapreduce.Counters: Group org.apache.hadoop.mapred.Task$Counter is deprecated. Use org.apache.hadoop.mapreduce.TaskCounter instead 25/06/29 15:44:44 INFO mapreduce.ExportJobBase: Exported 0 records. 25/06/29 15:44:44 ERROR tool.ExportTool: Error during export: Export job failed!
06-30
### 问题分析 Sqoop 导出数据到 MySQL 失败并提示错误 `Can't parse input data` 和 `java.util.NoSuchElementException`,通常是由于 Sqoop 在解析 HDFS 上的数据文件时遇到了格式不一致的问题。这种异常通常出现在字段分隔符配置不匹配、文件格式不兼容或数据内容异常的情况下 [^1]。 ### 常见原因及解决办法 #### 1. 字段分隔符配置不一致 Hive 表在存储数据时使用特定的字段分隔符(如 `~` 或 `\t`),而 Sqoop 在导出时如果未指定相同的分隔符,会导致解析失败。例如,在某些场景中,Hive 使用了非标准分隔符 `~`,而 Sqoop 默认使用 `\t`,这将导致字段无法正确读取 [^1]。 **解决方法:** 确保 Hive 表定义中的字段分隔符 Sqoop 导出命令中 `--input-fields-terminated-by` 参数一致。例如,若 Hive 表使用 `\t` 作为字段分隔符,则 Sqoop 命令应如下所示: ```bash sqoop export \ --connect "jdbc:mysql://node1:3306/procorrect?useUnicode=true&characterEncoding=utf-8" \ --username bigdata \ --password bigdata99114 \ --table pro_supply_correct_error \ --export-dir /user/hive/warehouse/procorrect.db/pro_supply_correct_error \ --input-fields-terminated-by '\t' \ --update-key supply_id \ --update-mode allowinsert ``` #### 2. 数据文件格式异常 Hive 表可能以 ORC、Parquet 等列式存储格式保存,而 Sqoop 默认仅支持文本文件(如 TextFile)。当 Sqoop 尝试读取这些二进制格式文件时,会因无法识别文件结构而抛出异常 [^2]。 **解决方法:** 确认 Hive 表的存储格式,并在必要时将数据转换为 Sqoop 可识别的文本格式。可以通过 Hive 查询将数据写入中间目录: ```sql INSERT OVERWRITE DIRECTORY '/user/sqoop/export_data' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' SELECT * FROM your_table; ``` 随后使用 Sqoop 从该目录导出数据: ```bash sqoop export \ --connect jdbc:mysql://localhost:3306/mydb \ --username root \ --password root \ --table target_table \ --export-dir /user/sqoop/export_data \ --input-fields-terminated-by '\t' ``` #### 3. 文件路径为空或不可读 Sqoop 在执行导出任务时依赖于 HDFS 中的数据文件路径。如果指定路径下没有实际数据文件(如 `part-m-00000`),则 Sqoop 会报错“Input path contains no files” [^2]。 **解决方法:** 使用 Hadoop 命令检查目标路径是否存在有效数据文件: ```bash hadoop fs -ls /user/hive/warehouse/your_table_path ``` 若路径为空,则需要重新生成数据或将 Hive 表数据导出到新的 HDFS 路径后再进行 Sqoop 操作。 #### 4. Sqoop 版本 Hive 兼容性问题 不同版本的 Sqoop 对 Hive 表的支持能力存在差异,尤其在处理分区表或复杂类型字段时可能出现兼容性问题 [^3]。 **解决方法:** 建议使用较新版本的 Sqoop(如 Sqoop 1.4.7 或以上),并在导出前对 Hive 表结构进行简化,避免嵌套结构或特殊字符字段名。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值