Spark也有数据本地化的概念(Data Locality),这和MapReduce的Local Task差不多,如果读取HDFS文件,Spark则会根据数据的存储位置,分配离数据存储最近的Executor去执行任务。
这么理解没错,我搭建的Spark集群情况是这样:
15台DataNode节点的HDFS集群,我在每个DataNode上都部署了一个Spark Worker,并且,启动Spark Application的时候,每个Worker都有一个Executor,这样理论上来说,只要读取HDFS文件,Spark都可以使用本地任务来读取 (NODE_LOCAL)。在$SPARK_HOME/conf/slaves文件中配置了每个Worker的hostname,之后在Master上,执行$SPARK_HOME/sbin/start-slaves.sh来启动Workers,启动之后集群如图显示:
进入spark-sql,从hive中扫描一张表,执行情况如下:
奇怪的是,所有读取HDFS文件的Task Locality Level全部是ANY,也就是说,没有一个使用NODE_LOCAL本地化任务,这样导致集群的网络消耗非常大(因为所有的数据都要经网络拷贝一遍),如图,后面那个峰值是执行任务的网络情况:
直接说原因和解决办法吧。
请注意最上面集群情况的图中,Worker Id和Address中都使用的IP地址作为Worker的标识,而HDFS集群中一般都以hostname作为slave的标识,这样,Spark从 HDFS中获取文件的保存位置对应的是hostname,而Spark自己的Worker标识为IP地址,两者不同,因此没有将任务的Locality Level标记为NODE_LOCAL,而是ANY。奇怪的是,我在Spark的slaves文件中都配置的是hostname,为何集群启动后都采用了 IP地址?最大的可能是/etc/hosts文件的配置。
解决办法是:没有采用slaves文件+start-slaves.sh的方式启动,而是每台Worker单独启动,
使用命令:$SPARK_HOME/sbin/start-slave.sh -h <hostname> <masterURI>,这样启动之后,Spark WEBUI中Worker Id和Address中都以hostname来显示了,如图:
再次进入spark-sql,执行同样的任务,所有的Task Locality Level都是NODE_LOCAL,没有网络传输,速度比之前快了好几倍。
这才是期望的结果,至于导致salves文件中配置的明明是hostname,为何Spark集群中解析成IP地址的原因,后续再查吧。
本文同步自我的大数据田地(关注Hadoop、Spark、Hive等大数据技术)。
相关推荐
`hdfs_video_jar`这个文件名暗示了压缩包内可能包含一个Java JAR文件,可能是一个自包含的应用程序,用于从HDFS读取MP4视频流并播放。这样的应用可能会使用以下技术: 1. Hadoop的`org.apache.hadoop.fs.FileSystem...
本文将深入探讨如何使用C#语言与HDFS进行交互,实现文件操作,特别是针对"ConsoleApplication1_hdfs_console_sld提取_"这个项目标题所涉及的场景。 首先,要进行HDFS操作,我们需要一个C#的HDFS客户端库。Apache ...
文件“hdfs_design.pdf”很可能是HDFS设计的详细解读,涵盖了HDFS的架构、数据复制策略、故障恢复机制、NameNode和DataNode的角色以及客户端API等内容。这部分内容将帮助你深入理解HDFS的内部工作原理,如Block和...
2. **下载文件**:`hadoop fs -get hdfs://namenode:port/path localfile`,从HDFS下载文件到本地。 3. **查看目录**:`hadoop fs -ls hdfs://namenode:port/path`,列出HDFS路径下的文件和目录。 4. **创建目录**...
- 上传本地文件到HDFS:`client.copy_from_local('local_path', '/hdfs_path')` 3. **Pandas转换文本文件到CSV**: - 首先,安装Pandas库:`pip install pandas` - 使用`pd.read_table()`读取HDFS上的文本文件,...
HDFS的文件读取流程主要包括以下步骤: 1. **客户端发起请求**:客户端向NameNode发起读取文件的请求。NameNode会返回文件的元数据信息,包括文件所在的具体DataNode的位置。 2. **检查文件存在性**:NameNode会...
ReadArbiKV是读取任务序列文件到一个map变量里面,可以启动调试模式进行变量查看; ReadAndWritePatterns是读取序列文件,并解析其key和value,然后可视化输出,所谓可视化输出是指不是乱码的输出,具体可以参考...
hdfs = HDFileSystem(host='your_hdfs_host', port=your_hdfs_port) # 读取Parquet文件 table = pq.read_table('hdfs:///path/to/your/file.parquet', filesystem=hdfs) # 将数据转换为DataFrame并保存到本地 ...
配置和使用`apache_hdfs_broker`需要遵循特定的步骤,这通常涉及修改Hadoop的配置文件(如`hdfs-site.xml`),设置Broker的相关参数,如地址、端口等。此外,可能还需要对应用进行相应的代码调整,以使用Broker提供...
2. 下载 HDFS 文件:使用 FileSystem.copyToLocalFile() 方法将 HDFS 文件下载到本地文件系统。 3. 创建 HDFS 目录:使用 FileSystem.mkdirs() 方法创建一个新的 HDFS 目录。 4. 删除 HDFS 文件或目录:使用 ...
SparkSession spark = SparkSession.builder().appName("SparkSQL_HDFS_Java").getOrCreate(); DataFrame df = spark.read().format("csv").option("header", "true").load("hdfs://namenode:port/path/to/file....
HDFS用户指南(Hdfs_user_guide)0.21_中文版,供大家学习参考。
HDFS优化了批量数据读写,而非低延迟随机访问,因此更适合离线批处理任务,如MapReduce等大数据处理框架。 ### 9. 名称空间管理 NameNode负责管理整个文件系统的命名空间,包括文件和目录的创建、删除和重命名等...
1. **NameNode(名称节点)**:作为HDFS集群的核心,NameNode负责管理文件系统的命名空间和文件的元数据,如文件路径、文件的所有者、权限信息、文件的块列表以及块所在的DataNode位置等。当NameNode关闭时,整个...
从hdfs上使用python获取parquet格式数据的方法(当然也可以先把文件拉到本地再读取也可以): 1、安装anaconda环境。 2、安装hdfs3。 conda install hdfs3 3、安装fastparquet。 conda install fastparquet 4、...
在这个例子中,`namenode-host`和`port`需要替换为实际的HDFS NameNode主机和端口,`path/to/local/file`是本地文件的路径,而`/hdfs/path/to/destination`是HDFS上的目标路径。 **2. 从HDFS下载文件** 下载HDFS上...
hdfs文件的查看 hdfs fs -cat /文件名
Spark 可以读取多种数据源,包括本地文件系统和 HDFS(Hadoop 分布式文件系统)。在 Spark Shell 中,可以使用内置函数读取文件,如 `sc.textFile()`,并进行简单的数据分析。实验中统计了 `/home/hadoop/test.txt`...