解决File has reached the limit on maximum number of blocks的问题

1. 絮絮叨叨

  • 最近在导入3000x的TPC-H的lineitem数据时,发现直接通过Hive的LOAD DATA LOCAL INPATH莫名其妙地失败

    hive> LOAD DATA LOCAL INPATH '/data1/tpch/tpch_tools/dbgen/lineitem.tbl' INTO TABLE tpch_3000x_orc.lineitem_text;
    Loading data to table tpch_3000x_orc.lineitem_text
    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask. org.apache.hadoop.hive.ql.metadata.HiveException: 
    	Unable to move source file:/data1/tpch/tpc-h_tools_v3.0.0/dbgen/lineitem.tbl to destination hdfs://.../da_lineitem_text
    
  • lineitem.tbl是一个大概2.3T的大文件,因为怀疑是文件太大无法上传

  • 通过查看其它数据的HDFS目录发现,通过LOAD DATA LOCAL INPATH向Hive表导入数据时,其实是直接将文件copy到对应的HDFS目录

  • 因此,想直接通过hdfs dfs -put直接将lineitem.tbl上传到对应的HDFS目录

  • 上传过程中,直接提示文件block数超过最大的block数,对应的配置项为dfs.namenode.fs-limits.max-blocks-per-file

    hive> dfs -put /data1/tpch/tpc-h_tools_v3.0.0/dbgen/lineitem.tbl hdfs:///.../da_lineitem_text/;
    put: File has reached the limit on maximum number of blocks (dfs.namenode.fs-limits.max-blocks-per-file): 10000 >= 10000
    Command -put /data1/tpch/tpc-h_tools_v3.0.0/dbgen/lineitem.tbl hdfs://.../da_lineitem_text/ failed with exit code = 1
    Query returned non-zero code: 1, cause: null
    

2. 使用split进行文件分割

2.1 确认HDFS配置

  • 看到报错信息后,首先想到的就是确认dfs.namenode.fs-limits.max-blocks-per-file的值

  • 命名如下:

     hdfs getconf -confKey dfs.namenode.fs-limits.max-blocks-per-file
    
  • 执行结果为1048576,根本不是报错信息中的说的10000

  • 在Hive CLI中,执行set命令也显示1048576

    set dfs.namenode.fs-limits.max-blocks-per-file;
    

2.2 运维建议使用小一点的数据集

  • 能力有限,只能求助HDFS的运维同事
  • 同事建议使用小一点的数据集,但自己又需要那么大的数据集
  • 自己的猜测:dfs.namenode.fs-limits.max-blocks-per-file在NameNode中的设置为10000,当前服务器的HDFS配置,可能并未与NameNode同步 (后续我会找运维同事进行确认的)

2.3 split按行拆分文件

  • 通过上网查阅资料,发现split命令可以实现文件的拆分

  • 而考虑到lineitem.tbl文件,每行代表一条记录,所以按照行数(每个文件20亿条数据)对其进行拆分

  • 同样地,因为拆分时间比较长,也是通过nohup提交后台作业

    nohup bash -c 'split -l 2000000000 lineitem.tbl /data7/lineitem' > split.log 2>&1 &
    
  • 拆分后的文件,使用/data7/lineitem作为前缀,从aa、ab、ac依次编号

  • split命令的使用,可以参考博客:Split Command in Linux with Examples

  • 当然,具体的使用,还是查看帮助文档来的更全面

    split --help
    
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值