sqoop 使用笔记

    好久没有更新自己技术博客,现在开始工作了,把自己遇到的问题写到这里边来

    主要把自己的问题写出来,分享给大家

    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 来制定分区    就可以减少导入的数据量 这个时候不至于导致内存不足。

posted on 2017-05-25 22:15  搬砖中  阅读(790)  评论(0编辑  收藏  举报

导航