我安装了3个节点hadoop和spark。我想从rdbms中获取数据到数据框中,并将这些数据写入HDFS中的镶木地板。 “dfs.replication”值为1。
当我尝试使用以下命令时,我看到所有HDFS块都位于我执行spark-shell的节点上。
scala> xfact.write.parquet("hdfs://sparknode01.localdomain:9000/xfact")
这是预期的行为还是应该在群集中分配所有块?
由于
答案 0 :(得分:3)
由于您将数据写入HDFS,因此不依赖于spark,而是依赖于HDFS。来自Hadoop : Definitive Guide
Hadoop的默认策略是将第一个副本放在与客户端相同的节点上(for 在集群外运行的客户端,虽然是系统,但随机选择一个节点 尽量不要选择太满或太忙的节点。
是的,这是预期的行为。
答案 1 :(得分:0)
就像@nik说的那样,我用多个客户做我的工作,它为我完成了:
这是python片段:
columns = xfact.columns
test = sqlContext.createDataFrame(xfact.rdd.map(lambda a: a),columns)
test.write.mode('overwrite').parquet('hdfs://sparknode01.localdomain:9000/xfact')