本文用于记录开发过程中遇到得一些坑,可能涉及到得大数据工具包括Hive、Presto、Spark、Flink、ES、Hadoop等,解决方案包括自己研究和网络搬运
- 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" )
-
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上限足够大
-
Spark streaming读iceberg表读到双倍的数据问题:上游表为了保证幂等性,①先delete目标分区数据,②再插入数据,③之后执行spark streaming读取该分区数据。①会生成一个delete快照,②会生成一个append快照。经过验证②生成的快照并没有应用delete快照,导致③会读到两份数据。
解决方案:②执行完毕sleep一段时间,这个时间取决于iceberg表配置得manifest的合并间隔 -
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;
-
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(),数据去重可以拿到数据关联完再进行 -
Hive查询数据出现数据显示错乱的问题
出现错乱的原因是查询的字段中有的数据包含换行符"\n",而再Hive中的表默认使用LINES TERMINATED BY '\t'进行行分隔符,且不可修改,否则会报错。这导致hive显示数据错误的将一个字段的数据分隔到多行里去。
解决方法是对可能出现换行符的字段提前进行清洗,将换行符替换成其它 如\t或空格 -
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