好久没有更新自己技术博客,现在开始工作了,把自己遇到的问题写到这里边来
主要把自己的问题写出来,分享给大家
sqoop 导入数据时候 有时候会遇到mysql 中有sql 中的关键字 这时候如果直接导出到hive 中会出现错误 例如下面的例子
这时候会出现错误 可以使用--query 来解决问题
例如 :
sqoop-import -D mapreduce.map.memory.mb=256 -D mapreduce.map.java.opts=-Xmx128m --connect ''--username '' --password '' --hive-import --hive-overwrite --hive-database databases_name --hive-table table_name --query 'select doctor_id,uid as uid1 from tb_doctor WHERE $CONDITIONS ' --where "1=1" --num-mappers 1 --split-by '' --driver com.mysql.jdbc.Driver --direct --target-dir '' -- --skip-tz-utc
当导入到mysql 中数据的时候 如果遇到主键自增的时候这个时候可以使用 --columns 加上列名
例如 --columns "type,name,user_id" 等
当sqoop 从mysql 中导入到hive 中数据库中 有时候mysql 中数据库比较大这个会出现oom 的现象 这个时候可以调节参数 例如第一个列子中这个 -D 用来指定的内存的参数 一般来调节三个参数 第一个是 -D mapreduce.map.memory.mb 用来调节整个maptask 的参数 ,-D mapreduce.map.java.opts=-Xmx128m 整个是用来调节java 中堆的内存大小 -Dmapreduce.task.io.sort.mb=64 用来制定环形缓冲区的大小 一般调节这三个参数 如果内存还不够 的话 这时候要调节yarn 中对于每一个容器的内存大小,然后相应调大maptask 的内存大小,和堆的大小和环形缓冲区的大小 大概的关系就是yarn 制定容器的大小 >maptask 制定的内存>堆内存的大小
这是为什么呢 我们知道sqoop 底层实际上 就是jdbc 和mapreduce 的封装 他只执行map的过程 所以在制定sqoop 的内存的参数的时候实际就是配置mapredcue 的参数 。所以在调节sqoop 的时候实际就是调节mapreduce 的参数。
当数据库表中数据比较大的时候这个时候会导致导出跑出异常 这个时候可以使用--query 制定导入一部分 然后到某一个分区 这个时候就可以解决这个问题 如下例子
sqoop-import -D mapreduce.map.memory.mb=6000 -D mapreduce.map.java.opts=-Xmx5120m -Dmapreduce.task.io.sort.mb=2400 --connect connection_name --username username --password password --hive-import --hive-overwrite --hive-database database_name --hive-table table_name --query 'select uid,username from table_name where type=8 and 1=1 and $CONDITIONS' --split-by tb_name .uid --hive-partition-key typedata --hive-partition-value 8 --num-mappers 4 --driver com.mysql.jdbc.Driver --direct --target-dir /user/hive/tb_msg_0 -- --skip-tz-utc
用--hive-partition-key 和--hive-partition-value 来制定分区 就可以减少导入的数据量 这个时候不至于导致内存不足。