streamsets2.6.0导数据常见问题总结

streamsets2.6.0导数据常见问题总结

streamsets2.6.0.1版本使用需要的环境保证此版本能够正常运行

每个问题都有描述使用场景与解决方法streamsets2.6.0.1版本常见问题汇总

一、执行任务时有表空间的问题使用场景

问题描述

问题解答方法

二、单表消费oracle数据库表中有Binary_FLOAT字段使用场景

问题描述

问题解决方法

三、读取oracle数据到hive出现null使用场景

问题描述

问题解决方法

四、读取oracle速度慢的问题使用场景

问题描述

问题解决方法

五、导数据出现字段长度不够的情况使用场景

问题描述

问题解决方法

六、oracle以date类型的字段不能进行实时抓取的问题使用场景

问题描述

使用联合主键的问题解决方法

七、oracle Date类型字段按日定时抓取数据使用场景

问题描述

问题解答方法

八、使用streamsets2.6.0.1版本中的Directory组件读取本地文件出现丢数据的情况使用场景

问题解决方法

九、使用jdbc组件向hive导数据时填写Hive元数据处理器注意时的问题使用场景

问题描述

问题解答方法

十、使用JDBC组件导数据时遇到数据库中的字段时中文的情况使用场景

问题描述

问题解答方法

 

 

文档下载:

Streamsets2.6.0导数据常见问题总结.docx

 

streamsets2.6.0.1版本使用需要的环境

保证此版本能够正常运行

每个问题都有描述使用场景与解决方法

 

streamsets2.6.0.1版本常见问题汇总一、执行任务时有表空间的问题

使用场景


以下场景适用于从Oracle或PostgreSQL或其他支持JDBC的数据库,以下错误主要在Oracle数据库中发现,原因在与Oracle中有表空间的概念

问题描述

Retries exhausted, giving up after as per  stage  configuration.  First  error:  java.sql.SQLException: ORA- 01652: unable to extend temp segment by 128 in tablespace TEMP

 

问题解答方法

这个是由于在oracle数据库中导数据时遇到了大表对数据进行了排序,导致oracle服务器端不能对表进行排序,大的表建议更换为单表消费,直接写SQL的形式。

 

二、单表消费oracle数据库表中有Binary_FLOAT字段

使用场景

以下场景适用于从Oracle或PostgreSQL或其他支持JDBC的数据库,以下错误主要在Oracle数据库中发现,原因在与Oracle中有BINARY_FLOAT类型的字段

问题描述

当出现以下错误时,说明JDBC Multitable Consumer读取的数据源中有BINARY_FLOAT字段,JDBC Multitable Consumer组件不支持读取BINARY_FLOAT类型的数据

 


问题解决方法

使用streamsets2.6.0.1中的JDBC Query Consumer组件,使用SQL把BINARY_FLOAT类型转化为to_number即可

 

三、读取oracle数据到hive出现null值

使用场景

以下场景适用于从Oracle或PostgreSQL或其他支持JDBC的数据库,以下错误主要在Oracle数据库中发现

问题描述


使用streamsets2.6.0.1读取Orace数据库时,发现oracle数据库中表中有ID字段,并且该字段有数据,把数据导入到Hive中出现

NULL值

 


 

 

问题解决方法

解决方式使用streamsets2.6.0.1中的JDBC Query Consumer组件,在SQL Query处写SQL,并使用oracle上的to_char函数来进行转换即可

 

 

四、读取oracle速度慢的问题

使用场景

以下场景适用于从Oracle或PostgreSQL或其他支持JDBC的数据库,以下错误主要在Oracle数据库中发现

问题描述

使用streamsets2.6.0.1版本,从oracle数据库中把T_PRESSUREDATA表中的数据导入到Hive中时,出现以下速度慢的问题, 目前这个表有46705131行数据,有主键,没有联合主键,使用全量的方式导数据,出现速度在39/S


 

 

 


 

问题解决方法

查看表中的字段中有一个F_YSKYLZ字段是CLOB类型,其中该字段的长度如下所示: 00--500长度的有:13812236

500--1000长度的有:6747902

8000--20000长度的有:763710

1000-3000长度的有:16247792


3000-8000长度的有:8668237

导数据刚开始的速度块是由于数据表该字段没有数据,大概在117000行数据时开始有数据,并且该字段的长度是随机的

 

书写的SQL如下:

select v.tab_count,count(v.

tab_count)  from  (select  (case  when  tan  <='500'  then  '50'  when  tan  >='500'  and  tan  <='1000'  then  '1000'  when tan

>='1000'  and  tan  <='3000'  then  '3000'  when  tan  >='3000'  and  tan  <='8000'  then  '8000'  when  tan  >='8000'  and ta

n <='20000' then '20000' when tan >='20000' and  tan  <='40000'  then  '20000'  else  '60000'  end)  as  tab_count from (select length(F_YSKYLZ) as tan from T_PRESSUREDATA where F_YSKYLZ is not null)a)v group by v.tab_count;

 

经测试如果把F_YSKYLZ表中的字段CLOB类型去掉速度会提升很多,大概在5.8W/S


 

 

 

 

五、导数据出现字段长度不够的情况

使用场景

以下场景适用于从Oracle或PostgreSQL或其他支持JDBC的数据库,以下错误主要在Oracle数据库中发现

问题描述

streamsets2.6.0.1版本导数据出现HIVE_METADATA_07-Invalld value 0 for precision in filed ID,mininum 1, maxinum 38提示

 

问题解决方法

出现这种情况使用streamsets2.6.0.1版本中的JDBC Query Consumer在SQL Query写SQL,使用oracle数据库中的to_number函数来解决或者使用streamsets2.6.0.1中的

Field Tyle Converter 组件对该字段进行转换为STRING即可


六、oracle以date类型的字段不能进行实时抓取的问题

使用场景

本示例适用于需要实时的读取oracle数据库某个表的数据,但是该表没有ID主键

问题描述

oracle以date类型的字段作为主键不能进行实时抓取,如果主键是number字段且是递增的就可以。原因是date的数据类型精确到日,在这天内可能有多个数据,可能丢数据,不过可以考虑联合主键的方式来使用,不过这种方式也有丢数据的可能性,原因在于联合主键也不能保证这条数据是唯一的

使用联合主键的问题解决方法

oracle中构造数据

 

streamsets2.6.0.1中使用JDBC Multitable Consumer组件配置联合主键


 

 

 

 

由于联合主键也不能确定唯一的记录,这种方法也有可能丢数据,详细请查看官网说明

https://streamsets.com/documentation/datacollector/latest/help/index.html#Origins/MultiTableJDBCConsumer.html

七、oracle Date类型字段按日定时抓取数据

使用场景

本示例适用于需要实时的读取oracle数据库某个表的数据,但是该表没有ID主键

问题描述

一张表中没有主键,但有以date形式的字段作为每天增量的日期,按照日期每天抓取一次,来达到增量的效果


问题解答方法

官网详细的介绍: https://streamsets.com/documentation/datacollector/latest/help/#Origins/JDBCConsumer.html

中搜索SQL Query for Incremental Mode关键字,可以看出可以在SQL中使用Date来作为增量的字段,其中${OFFSET}代表date类型的字段,要用单引号扩起来使用,详细如下配置:

 

 

后台代码会先获取初始化偏移量的值,然后把查询间隔时把获取最新的briday的值重新作为下一个的偏移列,此配置dateTime类型也支持

 

资料参考:

https://ask.streamsets.com/question/528/cant-jdbc-query-consumer-incremental-mode-work-with-datetime-type-offset-column/

 

 

八、使用streamsets2.6.0.1版本中的Directory组件读取本地文件出现丢数据的情况

使用场景

本实例适用于从本地读取带有目录的实时文件的,并把文件进行切割保存到oracle数据库中,也适用于读取Hive的数据

问题描述

使用streamsets2.6.0.1版本中的Directory组件读取刚从hadoop get下的hive数据,数据结构为如下,会出现读取刚下载下来的数据读不到的情况,出现读取数据丢失,本地的数据目录为:

 

# ll total 0

drwxr-xr-x 5 root root 66 Feb 27 22:01 statist_date=20180202

drwxr-xr-x 3 root root 26 Feb 27 22:02 statist_date=20180203

# ll total 0

drwxr-xr-x 2 root root 21 Feb 27 22:01 exception_p=1

drwxr-xr-x 2 root root 21 Feb 27 22:01 exception_p=3

drwxr-xr-x 2 root root 21 Feb 27 22:01 exception_p=5

# ll total 20

-rw-r--r-- 1 root root 18268 Feb 27 22:01 000000_0

# ll total 4

-rw-r--r-- 1 root root 2031 Feb 27 22:01 000000_0


************************

配置如下,


问题解决方法

官网说明:https://streamsets.com/documentation/datacollector/latest/help/index.html#datacollector/UserGuide/Origins

/Directory.html

解决方法,先把hive数据hadoop get到本地,使用linux mv命令移动到一个新的目录使streamsets2.6.0.1版本中的Directory组件监控新的目录即可

 

 

九、使用jdbc组件向hive导数据时填写Hive元数据处理器注意时的问题

使用场景

此场景是用于从支持 jdbc方式的数据库链接,把数据存放到hive中的情况

问题描述

在使用Hive元数据处理器组件时,在数据库表达式中使用default数据库报错,错误实例展示


 

 

问题解答方法

改变数据库的名称即可


 


十、使用JDBC组件导数据时遇到数据库中的字段时中文的情况

使用场景

此场景是用于从支持 jdbc方式的数据库链接,把数据存放到hive中的情况

问题描述

在表中存在中文的情况,在使用jdbc组件导数据时会遇到字段不能解析的情况


 

 

问题解答方法

这是由于表的设计不规范所导致的,修改表字段的名称即可


十一  An I/O error occured while sending to the backend 错误异常

问题描述



错误的详细信息

at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:357)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
at com.zaxxer.hikari.proxy.StatementProxy.executeBatch(StatementProxy.java:127)
at com.zaxxer.hikari.proxy.HikariPreparedStatementProxy.executeBatch(HikariPreparedStatementProxy.java)
at com.streamsets.pipeline.lib.jdbc.JdbcMultiRowRecordWriter.processBatch(JdbcMultiRowRecordWriter.java:329)
at com.streamsets.pipeline.lib.jdbc.JdbcMultiRowRecordWriter.processQueue(JdbcMultiRowRecordWriter.java:308)
at com.streamsets.pipeline.lib.jdbc.JdbcMultiRowRecordWriter.write(JdbcMultiRowRecordWriter.java:192)
at com.streamsets.pipeline.lib.jdbc.JdbcMultiRowRecordWriter.writeBatch(JdbcMultiRowRecordWriter.java:133)
at com.streamsets.pipeline.lib.jdbc.JdbcUtil.write(JdbcUtil.java:824)
at com.streamsets.pipeline.stage.destination.jdbc.JdbcTarget.write(JdbcTarget.java:208)
at com.streamsets.pipeline.api.base.configurablestage.DTarget.write(DTarget.java:34)
at com.streamsets.datacollector.runner.StageRuntime.lambda$execute$2(StageRuntime.java:249)
at com.streamsets.datacollector.runner.StageRuntime.execute(StageRuntime.java:195)
at com.streamsets.datacollector.runner.StageRuntime.execute(StageRuntime.java:257)
at com.streamsets.datacollector.runner.StagePipe.process(StagePipe.java:219)
at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunner.processPipe(ProductionPipelineRunner.java:801)
at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunner.lambda$executeRunner$3(ProductionPipelineRunner.java:846)
at com.streamsets.datacollector.runner.PipeRunner.executeBatch(PipeRunner.java:136)
at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunner.executeRunner(ProductionPipelineRunner.java:845)
at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunner.runSourceLessBatch(ProductionPipelineRunner.java:823)
at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunner.runPollSource(ProductionPipelineRunner.java:563)
at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunner.run(ProductionPipelineRunner.java:383)
at com.streamsets.datacollector.runner.Pipeline.run(Pipeline.java:512)
at com.streamsets.datacollector.execution.runner.common.ProductionPipeline.run(ProductionPipeline.java:112)
at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunnable.run(ProductionPipelineRunnable.java:74)
at com.streamsets.datacollector.execution.runner.standalone.StandaloneRunner.start(StandaloneRunner.java:756)
at com.streamsets.datacollector.execution.runner.common.AsyncRunner.lambda$start$3(AsyncRunner.java:152)
at com.streamsets.pipeline.lib.executor.SafeScheduledExecutorService$SafeCallable.lambda$call$0(SafeScheduledExecutorService.java:226)
at com.streamsets.datacollector.security.GroupsInScope.execute(GroupsInScope.java:33)
at com.streamsets.pipeline.lib.executor.SafeScheduledExecutorService$SafeCallable.call(SafeScheduledExecutorService.java:222)
at com.streamsets.pipeline.lib.executor.SafeScheduledExecutorService$SafeCallable.lambda$call$0(SafeScheduledExecutorService.java:226)
at com.streamsets.datacollector.security.GroupsInScope.execute(GroupsInScope.java:33)
at com.streamsets.pipeline.lib.executor.SafeScheduledExecutorService$SafeCallable.call(SafeScheduledExecutorService.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at com.streamsets.datacollector.metrics.MetricSafeScheduledExecutorService$MetricsTask.run(MetricSafeScheduledExecutorService.java:100)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

问题解答

1、这里是JDBC-Driver 一条SQL**参数数量达到了上限,幂增操作的参数=记录数(行)插入的字段数(列)*.

2、JDBC-Driver 支持的参数数量跟版本(x.y.z)和类型(xx数据库)有关.


选中批量处理进行对数据大小的约束即可,按照不同的数据量的大小进行不同的调制。

参考资料:https://blog.csdn.net/timo1160139211/article/details/78658891

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
您可以使用TensorFlow 2.6.0来训练多特征的时间序列数据预测模型。以下是一个基本的训练流程示例: 1. 数据准备:首先,您需要准备您的时间序列数据。确保您的数据包含多个特征,例如时间戳、气温、湿度等。将数据划分为训练集和测试集。 2. 特征工程:对于时间序列数据,您可能需要进行一些特征工程操作,例如平滑处理、差分运算等。根据您的问题和数据特点,选择适当的特征工程方法。 3. 数据预处理:对于每个特征,进行标准化或归一化等预处理操作,以确保它们在相似的数值范围内。 4. 构建模型:使用TensorFlow的Keras API构建您的时间序列预测模型。可以选择使用循环神经网络(RNN)或卷积神经网络(CNN)等模型架构,具体取决于您的数据和问题。 5. 编译模型:选择适当的损失函数和优化器,并将它们与模型一起编译。 6. 训练模型:使用训练集对模型进行训练。根据需要,可以使用批量训练或逐个样本训练的方法。 7. 评估模型:使用测试集评估模型的性能。常见的评估指标包括均方根误差(RMSE)、平均绝对误差(MAE)等。 8. 调参和优化:根据模型的表现进行调参和优化。可以尝试不同的模型架构、超参数或优化算法,以提高模型的性能。 9. 预测未来值:使用训练好的模型进行未来时间点的数值预测。 请注意,上述步骤只是一个基本的框架,具体实现方式取决于您的数据和问题。您可能需要根据实际情况进行一些调整和改进。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值