这几天在用CDH 的BDR 做hive数据同步,来唠唠遇到过的报错
目录
问题3 : MetaException:/user/{db}/{table}/{file-000}.txt is not a directory or unable to create one
问题1、space quota不足
报错:java.io.IOExeption: Checksum mismatch between hdfs://distcpSourceNS/user/hive/warehouse/edmp_db.db/xxxx and hdfs://dsep- namservice1//user/hive/warehouse/edmp_db.db/xxxx
这个报错看不出是为啥校验和会不同,接着往下翻其他的报错,看到:
The DiskSpace quota of /user/hive/warehouse/edmp_db.db is exceeded: quota =300GB but diskspace consumed = 300.11GB at xxx
看到这就明白了,是因为space quota不足,导致数据写入不成功,使得校验和失败。修改此目录的space quota
hdfs dfsadmin -setSpacequota 500t /user/hive/warehouse/edmp_db.db
关于什么是quota :
参考文献:https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsQuotaAdminGuide.html
quota 有 name quota(用的name的数量)和space quota(用的空间的量),这两个完全独立。
name quota
name quota规定了此目录下文件和目录的最大个数,如果超出此限制,创建文件or目录会失败。对目录改名的话,这个name quota也会保留哦(不要妄想通过改名,去掉此限制,而且如果改名会违反quota的话,改名会失败的)。有个小tip:如果对当前目录设一个小于当前file + directory数量的quota,可以设置成功;如果将一个目录的quota设为1的话,这个目录下将不能放任何东西。
space quota
space quota就是这个目录可以占用的最大字节数。同样的,对目录改名,quota属性将保留。space quota为0时,文件依旧可以被创建,但是不会被分配block。目录不使用主机文件系统空间,也不计入space quota。用于保存文件元数据的主机文件系统空间也不计入配额中。
存储类型配额规定了存储类型(SSD, DISK, ARCHIVE) . 有了这个配额,你可以更加细粒度的控制集群中空间的使用。要用这个参数,首先得设置存储策略,使得数据可以存放在不同类型的存储设备上。如何设置存储策略见 HDFS Storage Policy Documentation
可以通过storage type quota + name quota + space quota来管理集群的存储。例如:
-
对于有设置存储策略的目录,管理员可以设置SSD存储配额小一些,其他磁盘存储配额大一些。HDFS会根据存储策略和总的space quota来存储文件。
-
没有设置存储策略的目录,建议不要设置storage type quotas,只设置space quota就好。
- 只有DISK不是主存储器的时候(HDFS 将存储分为了 DISK,SSD,ARCHIVE,PROVIDED 四种),才建议使用storage type quota
设置quota的命令:
-
hdfs dfsadmin -setQuota <N> <directory>...<directory>
设置<directory> 的 name quota 为 N,如果N不是一个正值,或者目录不存在或是个文件,或者目录超出新的quota,都会报错。下面的命令相同
-
hdfs dfsadmin -clrQuota <directory>...<directory>
清除<directory>的 name quota
-
hdfs dfsadmin -setSpaceQuota <N> <directory>...<directory>
设置<directory>的space quota 为 N ,(文件备份也算在空间配额中,比如一个 1G 的文件,若有两个副本,将一共消耗 3G 的配额)。N 可以写为:
-
50g ,表示 50 GB
-
3t , 表示 3TB
-
-
hdfs dfsadmin -clrSpaceQuota <directory>...<directory>
清除 space quota
-
hdfs dfsadmin -setSpaceQuota <N> -storageType <storagetype> <directory>...<directory>
设置 storage type quota, storageTypes 有 DISK,SSD,ARCHIVE,PROVIDED .
-
hdfs dfsadmin -clrSpaceQuota -storageType <storagetype> <directory>...<directory>
清除 storage type quota
查看quota的命令
查看quota 和 当前目录的 name数量、空间使用情况的命令:
-
hadoop fs -count -q [-h] [-v] [-t [comma-separated list of storagetypes]] <directory>...<directory>
-
-q 也显示name quota,以及剩余多少 name 数量
-
-h 方便“人” 看
-
-v 显示标题
-
-t 显示每个存储类型的quota 和剩余的额度。 如果指定storagetype,那就只显示那个存储类型的quota,否则显示所有类型的quota。
问题2:报错:java.lang.NullPointerException: summary file location is not present as a value of DsitcpResult
两个不同的复制计划,都报了这个错,发现是两个原因。
1、复制了view表:查看了复制的表,发现都是view,因此BDR没有侦测到需要备份的table(view是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。)
解决方法:在 advanced中 取消选择 “replicate HDFS file”
2、配置的表都不存在在此database中(如果是只有几张表不存在,它不会报错)。
这个是怎么排查出来的呢:
我们先kinit hive,然后用beeline连接hive server2,在hive库中
use eca_db;
show tables;
发现没有表。然后又在tn节点上,用
hdfs dfs -ls /user/hive/warehouse/eca/
查看此目录下是否有文件,发现有文件。出现这种情况,可能是因为这些表是外表,删除了表,但是hdfs文件其实还在。后来和源集群确认后,发现源集群只有文件,还没有元数据。(我们是从源集群同步hive表,源集群又是从另一个集群同步hive表,源集群只同步了hdfs文件,还没来得及同步元数据。)
问题3 : MetaException:/user/{db}/{table}/{file-000}.txt is not a directory or unable to create one
先kinit hive, beeline 连接 hive server2 ,然后 use xxx_db; show create table {table name};
检查发现是 external hive table 在 location上配置到了 file level, 导致 BDR 检查出错
解决方法:另外建立正确的table scheme,然后拷贝这个新建立的table