大数据开发遇坑大杂烩

7 篇文章 0 订阅
2 篇文章 0 订阅

本文用于记录开发过程中遇到得一些坑,可能涉及到得大数据工具包括Hive、Presto、Spark、Flink、ES、Hadoop等,解决方案包括自己研究和网络搬运

  1. PySpark中报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-11: ordinal not in range(128)
    在操作dataframe并调用show()时报错(非数据显示操作并不会报错),解决方案是在调用show()前添加
    reload(sys)
    sys.setdefaultencoding( "utf-8" )

  2. Spark并行度无法提高的问题:例如读取hive表某一个分区的数据写入ES或Doris,会发现即使申请了数十个worer,但只会有几个节点处理数据,stage中task并行度也很小。这是因为单个spark task处理128M得数据,根据读取文件的个数和大小拆分并行度。如果恰好读取的是一个500M的文件,那么并行度就会是4。为了提高并行度,有两种方式:

    第一种是利用repartition(N)改变并行度,好处是可以根据worker数设置,资源利用率好,缺点是需要shuffle(注意这里不能用coalesce,因为coalesce不会shuffle,只能用于减少分区)
    
    第二种是通过参数调整,好处是在map端改变并行度无需shuffle, 缺点是并行度不固定使部分worker闲置。
    具体参数如下:
    "mapreduce.input.fileinputformat.split.maxsize":"67108864" //单个map大小,基于想要分配给单个task的数据量设置
    "mapreduce.job.maps":"1000"  // 确保map上限足够大
  3. Spark streaming读iceberg表读到双倍的数据问题:上游表为了保证幂等性,①先delete目标分区数据,②再插入数据,③之后执行spark streaming读取该分区数据。①会生成一个delete快照,②会生成一个append快照。经过验证②生成的快照并没有应用delete快照,导致③会读到两份数据。
    解决方案:②执行完毕sleep一段时间,这个时间取决于iceberg表配置得manifest的合并间隔

  4. Presto查询报错: Query failed (#20191220_070151_03108_858gh): Corrupted statistics for column "[col_name] optional binary " in Parquet file。 原因是存储的parquet文件有部分是损坏的,而presto在0.216开始添加了一个文件完整性检测,这个默认是开启的,可以直接关掉 

    #全局关闭 :vim  catalog/hive.properties
    hive.parquet.fail-on-corrupted-statistics=false
    
    #在会话中关闭,在sql前添加配置,推荐此种方式 
    set session hive.parquet_fail_with_corrupted_statistics=false;

  5. Hive使用collect_set导致内部数据重排的问题

    HIVE_SQL= """
        SELECT collect_set(id) id_set, collect_set(word) word_set, log_date
        FROM test_table
        GROUP BY log_date
    """
    #执行sql并将结果传入下面的函数,发现打印出来的结果是错误的对应关系
    
    def collect_set_example(word_set, id_set):
        words = []
        for i in range(0, len(word_set)):
            if word_set[i] in content:
                print(word_set[i] + "--" + id_set[i])

    出现上面问题的原因是collect_set()会对集合内所有的元素进行去重和重排,导致多个集合相互关联到错误数据的情况
    解决的方法是使用collect_list(),数据去重可以拿到数据关联完再进行

  6. Hive查询数据出现数据显示错乱的问题

    出现错乱的原因是查询的字段中有的数据包含换行符"\n",而再Hive中的表默认使用LINES TERMINATED BY '\t'进行行分隔符,且不可修改,否则会报错。这导致hive显示数据错误的将一个字段的数据分隔到多行里去。
    解决方法是对可能出现换行符的字段提前进行清洗,将换行符替换成其它 如\t或空格

  7. Caused by: org.elasticsearch.hadoop.EsHadoopException: Could not write all entries for bulk operation [1/1000]. Error sample (first [5] error messages):org.elasticsearch.hadoop.rest.EsHadoopRemoteException: illegal_argument_exception: Document contains at least one immense term in field="content" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped.  Please correct the analyzer to not produce such terms. org.elasticsearch.hadoop.rest.EsHadoopRemoteException: max_bytes_length_exceeded_exception: max_bytes_length_exceeded_exception: bytes can be at most 32766 in length; got 40000
    原因:keyword类型的最大支持的长度为——32766个字节的UTF-8类型字符,而content插入了10000个中文字符
    解决:此对content进行了截取,限制字符数少于8000

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值