Spark在Hadoop的HDFS中读取和存储数据

本文的前提是已经安装了Spark和Hadoop,安装方法可以参考我之前的两篇文章Hadoop安装及配置 —— MacOS High SierraSpark 笔记|教程 —— 安装 (Standalone Ubuntu|Mac)

首先我们从本地系统复制一个样本txt文件(请自行准备)到Hadoop的HDFS中。启动Hadoop,然后进入Hadoop根目录,运行下面命令:

bin/hdfs dfs -copyFromLocal /localPATH/test.txt

或者下面命令也行,两者功能一样

bin/hadoop fs -put /localPATH/test.txt /yourPATHinHDFS

该txt文件会自动复制到你的HDFS中创建的文件夹中,请在http://localhost:50070页面中,点导航栏Utilities >> Browse the file system进入子页面查看。或者也可以在hadoop根目录输入bin/hadoop fs -ls /命令查看。

然后打开spark-shell,输入下面代码:

scala> val textFile = sc.textFile("hdfs://localhost:9000/yourPATHinHDFS/test.txt")
scala> textFile.collect

就会输出之前txt文件内容的string数组,读取数据成功。

注意:上面代码中的localhost:9000要根据你自己的IP地址和port(端口)决定,可以在Hadoop根目录的etc/hadoop/core-site.xml文件中查找。如果你按照我之前的Hadoop配置教程配置的,就用我的这个就可以。


有一个更加快捷的方法,就是不需要每次在hadoop读取数据输入路径都要加入HDFS的地址,就是让spark启动的时候继承Hadoop的cluster。这样spark可以连接Hadoop的ResourceManager并且读写HDFS。具体做法是,在spark根目录的conf/spark-env.sh文件中加入下面命令:

export HADOOP_CONF_DIR=/usr/local/hadoop-2.8.2/etc/hadoop

上面的路径换成你自己的Hadoop目录的含有configuration文件的路径,一般配置文件是在Hadoop根目录下的/etc/hadoop或者/etc/hadoop/conf里。这样spark启动时就会读取hdfs-site.xml,core-site.xml等的Hadoop配置信息,连接Hadoop。之后在spark根目录的sbin目录下,运行./start-all.sh。然后启动spark-shell,工作路径就是HDFS的路径,不需要在输入IP地址了。

scala> val textFile = sc.textFile("/yourPATHinHDFS/test.txt")
scala> textFile.collect



写入数据到HDFS十分简单,在配置好上面的信息之后,之下用下面代码把Spark RDD/DataSet 存储为text文件。

scala> textFile.saveAsTextFile("/yourPATHinHDFS/test.text")

注意上面的test.test不是你的文本文件名,而是文件夹名称,你要存储的文本文件会保存在这个路径里面。而你的spark把数据分成了多少个partition就会有多少个文本文件输出,可以手动把它们合并,也可以换成下面代码(加入coalesce(1))就会只输出一个文本文件,但是这样会比较消耗内存。

scala> textFile.coalesce(1).saveAsTextFile("/yourPATHinHDFS/test.text")



本文为 MYOAK 原创,转载时请注明出处及相应链接。

登录注册后参与评论