遇见hive之记忆篇--运用sqoop对数据的同步的常见错误,及hive的存储格式分析(压缩格式)

前面所记载的差不多都涵盖到了,但是总是觉得有很多知识点没有记到,在这里梳理一遍

1、sqoop的导入,这次测试完全分布式对sqoop的快速导入的测试


尝试了cdh分布式下的hive的配置,及sqoop的配置,才发现和伪分布式的单节点的部署一模一样,并没有其他要注意的东西,就那个,这里就不详细写了,主要记记,常用sqoop的语句,和其他hive调优需要注意的地方

前面测试导入到hdfs中使用--direct会报错,解决方案如下

bin/sqoop import \

--connect jdbc:mysql://make.hadoop.com:3306/test \
--username root \
--password 123456 \
--table tohdfs \
--direct \
--delete-target-dir \
--target-dir /sqoop_mysql_2 \
--num-mappers 1

使用--direct    会报这样的错

java.io.IOException: Cannot run program "mysqldump": java.io.IOException: error=2, No such file or directory  
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)  
    at java.lang.Runtime.exec(Runtime.java:593)  
    at java.lang.Runtime.exec(Runtime.java:466)  
    at org.apache.sqoop.mapreduce.MySQLDumpMapper.map(MySQLDumpMapper.java:403)  
    at org.apache.sqoop.mapreduce.MySQLDumpMapper.map(MySQLDumpMapper.java:47)  
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)  
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)  
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)  
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)  
    at java.security.AccessController.doPrivileged(Native Method)  
    at javax.security.auth.Subject.doAs(Subject.java:396)  
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)  
    at org.apache.hadoop.mapred.Child.main(Child.java:249)  
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory  
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)  
    at java.lang.ProcessImpl.start(ProcessImpl.java:65)  
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)  
    ... 12 more  

解决方法:把部署mysql节点上的   /usr/bin/mysqldump   复制到其他节点,即可解决问题


bin/sqoop import \
--connect jdbc:mysql://make.hadoop.com:3306/test \         mysql数据库下的对应的库
--username root \
--password 123456 \
--table tohdfs \                 库下面对应的表
--direct \
--delete-target-dir \          防止目录重复、冲突,append模式下无法使用
--hive-import \                  模式
--hive-database sqoop_test \            hive下的数据库
--hive-table stu_info \                       hive下的表
--num-mappers 1 \                           mapper的数量

--fields-terminated-by '\t'

接下来测试从mysql 导出到hive中是否会有问题


明明sqoop2这个数据库在,hive中是存在的,但是导入的时候,前面MapReduce的部分都没有问题,就最后load数据的时候报错,经过各种尝试,发现

==>把对应hive的hive-site.xml 文件放到sqoop的工作目录,再次导入,完美解决这个问题


2、常见hive参数调优的方式

1、大表拆小表:
临时表、分区表、外部表


2、sql语句
优化sql:复杂的sql-》子查询+join  -》简化,拆分成多个简单的语句
join、filter:一般都是先过滤再join

3、合理设置map和reduce的个数
怎么设置map的个数: 一个分片就是一个块,一个maptask
源码里面有FileInputFormat类splitsize方法
Math.max(min_size,Math.min(max_size,block_size));
min_size默认参数值是0M
max_size默认参数值是Long类型的最大值
block_size  ---> 128M  
设置max_size和min_size
FileInputFormat.setMaxInputSplitSize(job,size)
FileInputFormat.setMinInputSplitSize(job,size)

reduce数量:默认的是一个
在hive:set mapreduce.job.reduces=3
在mr中:job.setNumReduceTask=3

4、开启并行执行
开关(但是并行执行必须满足,一条sql中的不同job没有上下依赖关系):
hive.exec.parallel
设置同时运行的线程数,默认是8个

hive.exec.parallel.thread.number=8

                 hive.exec.parallel=true



5、jvm重用
mapreduce.job.jvm.numtasks 默认是1个,一般可以设置为3或5 ,节省资源,不宜太大,做大不超过9个

6、推测执行
比如:运行十个map和十个reduce任务 --》九个都执行完毕了,有一个reduce还没结束

mapreduce会重新开启一个跟这个一模一样的任务,两个相同的任务去完成同样一件事情,谁先完成那么另一个就会被kill掉

                hive.maperd.reduce.tasks.speculative.execution=true

                mapreduce.map.speculative=true

                mapreduce.reduce.speculative=true

 
缺点:会消耗资源,一般不建议开启,有可能数据重复写入,造成异常

7、hive本地模式
hive.exec.mode.local.auto  默认是不开启的
测试的时候,可以设置这个参数为true,在本地直接运行mr,加快速度
限制:job的输入数据不能大于128M,map个数不能超过4个,reduce的个数不能超过一个

        8、数据倾斜

                    根据实际情况进行处理

                     1、产生倾斜的主要语句:join、group by、distinct
            在MR中由于某个key值分布不均匀,导致某个reduce运行速度严重缓慢。影响了整个job的运行
             2、如何判断数据倾斜:
            任务卡住,运行时间长,不一定是数据倾斜的原因:
            通常通过时间判断:
1)如果在任务中每个reduce任务运行时间都很长,那么可能是reduce数目设置过少造成的 2)如果大部分的reduce任务在几分钟之内完成了,而某一个reduce可能半小时后还没完成,可能是倾斜
3)可能是某个节点造成的问题(某台机器配置比较差)可以考虑推测执行,如果说推测执行的新任务也很慢,就有可能是倾斜的原因
如果说推测执行的新任务在短时间内就完成了,可能是节点造成的某个任务运行缓慢
              3、解决方法有很多:
         -1.考虑分区的阶段,自定义实现分区的规划来避免产生倾斜
在key中加入随机数的侧率,打乱分区
00 1    reduce1
01 2    reduce2
02 3    reduce3
03 3    reduce1
04 3    reduce2

-2.选择不同join方式做优化
join: map join、 reduce join、 Smb join(sort merge bucket)
-1.map join适合小表join大表的场景
-2.reduce join适合大表join大表
-3.smb join 适合大表join大表,桶与桶之间的join
分区与分区的join,建少了join的范围

两张表之间的join,他们的桶数的关系要么相等,要么就是成因数,倍数关系

3、压缩格式测试,具体测试过程就不写了,我们一般会选择perquet、orc格式


做下对比:存储类型的数据大小
file_source    37.6M
file_text      27.48 MB
file_parquet   16.14 MB

file_orc       4.4 MB                    压缩比最高

后面遇到什么问题,再来补充吧,当做自己的难点记录


版权声明:本文为maketubu7原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。