Spark将大量分区写入HDFS报错
2016-04-14 11:52
2121 查看
对大量的数据进行一系列的数据处理后
提示(省略无用信息):
该参数和
避免太高的并发度同时写一个文件。
所以在调用
因为减少了分区数,下次再读取这份数据进行处理时,减少了启动task的开销。
提高同时写的上限。
在
需要重启dataNode生效。
DataFrame此时有2W个分区(170W条数据,因此每个分区数量只有几百条),此时使用
parquet命令,将会往一个hdfs文件中同时写入了大量的碎文件。
提示(省略无用信息):
WARN TaskSetManager: Lost task: org.apache.spark.SparkException: Task failed while writing rows. WARN TaskSetManager: Lost task:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /user/xx/sample_2016/_temporary/0/_temporary/attempt_201604141035_0058_m_019029_0/part-r-19029-1b93e1fa-9284-4f2c-821a-c83795ad27c1.gz.parquet: File does not exist. Holder DFSClient_NONMAPREDUCE_1239207978_115 does not have any open files.
原因
提示为文件操作超租期,由于多个task操作写一个文件,其中某个task完成任务后删除了临时文件引起。该参数和
dfs.datanode.max.xcievers有关,默认为256。
dfs.datanode.max.xcievers表示每个datanode任一时刻可以打开的文件数量上限。
解决方法
有两个解决方法,一种是修改spark代码,一种是修改hdfs参数配置。避免太高的并发度同时写一个文件。
所以在调用
write.parquet前,先使用
repartition合并碎片分区。
因为减少了分区数,下次再读取这份数据进行处理时,减少了启动task的开销。
提高同时写的上限。
在
hdfs-site.xml中修改
dfs.datanode.max.xcievers,将其设置为4096
<property> <name>dfs.datanode.max.xcievers</name> <value>4096</value> </property>
需要重启dataNode生效。
相关文章推荐
- HDFS源码分析数据块汇报之损坏数据块检测checkReplicaCorrupt()
- hadoop
- Kafka+Storm+HDFS
- HDFS源码分析之数据块及副本状态BlockUCState、ReplicaState
- HDFS中数据节点数据块存储示例
- HDFS源码分析之数据块Block、副本Replica
- HDFS存储系统
- hadoop
- hbase的预分区
- 学习播
- hdfs中Missing Block 的文件处理方法
- HDFS源码分析数据块之CorruptReplicasMap
- HDFS源码分析数据块复制之PendingReplicationBlocks
- No FileSystem for scheme: hdfs,No FileSystem for scheme: file
- 分布式文件系统HDFS原理与操作
- HDFS源码分析EditLog之读取操作符
- HDFS API基本操作
- HDFS源码分析EditLog之获取编辑日志输入流
- HDFS异构存储
- Hadoop节点上负载过高的问题分析