Skip to content

Latest commit

 

History

History
136 lines (96 loc) · 5 KB

9-项目中遇到的问题.md

File metadata and controls

136 lines (96 loc) · 5 KB

[TOC]

1.Sqoop抽取数据格式问题

查看Oracle中CISS_SERVICE_WORKORDER表的数据条数

select count(1) as cnt from CISS_SERVICE_WORKORDER;

采集CISS_SERVICE_WORKORDER的数据到HDFS上

sqoop import \
--connect jdbc:oracle:thin:@oracle.bigdata.cn:1521:helowin \
--username ciss \
--password 123456 \
--table CISS4.CISS_SERVICE_WORKORDER \
--delete-target-dir \
--target-dir /test/full_imp/ciss4.ciss_service_workorder \
--fields-terminated-by "\001" \
-m 1

Hive中建表查看数据条数

启动Hive容器:
docker start hive
使用DBeaver EE连接并创建测试表:
create external table test_text(
line string
)
location '/test/full_imp/ciss4.ciss_service_workorder';
统计行数:
select count(*) from test_text;

Sqoop采集完成后导致HDFS数据与Oracle数据量不符

原因:

  • sqoop以文本格式导入数据时,默认的换行符是特殊字符
  • Oracle中的数据列中如果出现了\n、\r、\t等特殊字符,就会被划分为多行

解决方案:

  • 方案一:删除或者替换数据中的换行符
    • --hive-drop-import-delims:删除换行符
    • --hive-delims-replacement char:替换换行符
    • 不建议使用:侵入了原始数据
  • 方案二:使用特殊文件格式:AVRO格式
sqoop import \
-Dmapreduce.job.user.classpath.first=true \
--connect jdbc:oracle:thin:@oracle.bigdata.cn:1521:helowin \
--username ciss \
--password 123456 \
--table CISS4.CISS_SERVICE_WORKORDER \
--delete-target-dir \
--target-dir /test/full_imp/ciss4.ciss_service_workorder \
--as-avrodatafile \ #使用AVRO格式存储数据
--fields-terminated-by "\001" \
-m 1
数据格式 介绍
TextFile Hive默认的文件格式,最简单的数据格式,便于查看和编辑,耗费存储空间,I/O性能较低
SequenceFile 含有键值对的二进制文件,优化磁盘利用率和I/O,并行操作数据,查询效率高,但存储空间消耗最大
AvroFile 特殊的二进制文件,设计的主要目标是为了满足schema evolution,Schema和数据保存在一起
OrcFile 列式存储,Schema存储在footer中,不支持schema evolution,高度压缩比并包含索引,查询速度非常快
ParquetFile 列式存储,与Orc类似,压缩比不如Orc,但是查询性能接近,支持的工具更多,通用性更强

因为开发采用的是SparkSQL(数据文件+Schema),所以在Ingest这一层使用AVRO格式存储数据

2.测试Sqoop使用AVRO格式导入数据

  1. 上传表对应的avsc文件,文件在sqoop的home目录下,java_code目录中

    wps1

  2. 以ciss_service_workorder为例,CISS4_CISS_SERVICE_WORKORDER.avsc文件到hdfs上

  • 上传到hdfs的/data/dw/ods/avsc目录下
  1. 创建avro格式的工单表

    (1) hive引擎

    create external table if not exists one_make_ods.ciss_service_workorder comment '派工单'partitioned by (dt string)row format serde 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'stored as avro location '/data/dw/ods/one_make/incr_imp/ciss4.ciss_service_workorder'TBLPROPERTIES ('avro.schema.url'='hdfs:///data/dw/ods/avsc/CISS4_CISS_SERVICE_WORKORDER.avsc');

    (2) sparksql引擎

    create external table if not exists one_make_ods.ciss_service_workorder comment '派工单'partitioned by (dt string)row format serde 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'stored as inputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'location '/data/dw/ods/one_make/incr_imp/ciss4.ciss_service_workorder'TBLPROPERTIES ('avro.schema.url'='hdfs:///data/dw/ods/avsc/CISS4_CISS_SERVICE_WORKORDER.avsc');
  2. 查看建表情况

    show create table one_make_ods.ciss_service_workorder;

  3. 导入分区数据到工单表

    alter table one_make_ods.ciss_service_workorder add if not exists partition (dt='20210101') location '/data/dw/ods/one_make/incr_imp/ciss4.ciss_service_workorder/20210101'
  4. 特殊问题

    • 因oracle表特殊字段类型,导致sqoop导数据任务失败
    • oracle字段类型为: clob或date等特殊类型
    • 解决方案:在sqoop命令中添加参数,指定特殊类型字段列(SERIAL_NUM)的数据类型为string
      • —map-column-java SERIAL_NUM=String

3.Sqoop在抽取Oracle数据时MR没反应

刚开始在运行Sqoop任务时,查看yarn界面发现MR任务创建了但是一直没反应没动静,查看Application Status 发现是:

YarnApplicationState: ACCEPTED: waiting for AM container to be allocated, launched and register with RM.

这种情况的话,进入Hadoop容器查看各个进程是否都在,如果少了某个进程的话就重启Hadoop

我遇到的是nodemanager挂掉了导致的

Snipaste_2023-01-03_22-52-39

stop-all.sh
start-all.sh