数据准备 HDFS是Hadoop/Spark批处理作业最常用的数据存储之一,目前阿里云的HDFS也已经开始公测。本文将演示在HDFS中创建一个文件,并在Spark应用中进行访问。
1、开通HDFS服务,并创建文件系统
2、设置权限组 1、创建权限组
2、设置权限组的规则eci-hdfs-3
3、为挂载点添加权限组
至此HDFS文件系统就准备完毕。
3、安装Apache Hadoop Client。 HDFS文件系统准备就绪后,就是存入文件。我们采用HDFS client的方式。
Apache Hadoop下载地址:官方链接。建议选用的Apache Hadoop版本不低于2.7.2,本文档中使用的Apache Hadoop版本为Apache Hadoop 2.7.2。
1、执行如下命令解压Apache Hadoop压缩包到指定文件夹。
tar -zxvf hadoop-2.7.2.tar.gz -C /usr/local/ 2、执行如下命令打开core-site.xml配置文件。
vim /usr/local/hadoop-2.7.2/etc/hadoop/core-site.xml 修改core-site.xml配置文件如下:
fs.defaultFS dfs://f-4b1fcae5dvexx.cn-hangzhou.dfs.aliyuncs.com:10290 fs.dfs.impl com.alibaba.dfs.DistributedFileSystem fs.AbstractFileSystem.dfs.impl com.alibaba.dfs.DFS io.file.buffer.size 8388608 alidfs.use.buffer.size.setting false dfs.usergroupservice.impl com.alibaba.dfs.security.LinuxUserGroupService.class dfs.connection.count 256 注:由于我们是on k8s,所以yarn相关的配置项不用配置,只用配置HDFS相关的几个配置项。修改后的core-site.xml文件后在面很多地方会用到。3、执行如下命令打开/etc/profile配置文件。
vim /etc/profile 添加环境变量
export HADOOP_HOME=/usr/local/hadoop-2.7.2 export HADOOP_CLASSPATH=/usr/local/hadoop-2.7.2/etc/hadoop:/usr/local/hadoop-2.7.2/share/hadoop/common/lib/:/usr/local/hadoop-2.7.2/share/hadoop/common/:/usr/local/hadoop-2.7.2/share/hadoop/hdfs:/usr/local/hadoop-2.7.2/share/hadoop/hdfs/lib/:/usr/local/hadoop-2.7.2/share/hadoop/hdfs/:/usr/local/hadoop-2.7.2/share/hadoop/yarn/lib/:/usr/local/hadoop-2.7.2/share/hadoop/yarn/:/usr/local/hadoop-2.7.2/share/hadoop/mapreduce/lib/:/usr/local/hadoop-2.7.2/share/hadoop/mapreduce/:/usr/local/hadoop-2.7.2/contrib/capacity-scheduler/*.jar export HADOOP_CONF_DIR=/usr/local/hadoop-2.7.2/etc/hadoop 执行如下命令使配置生效。
source /etc/profile 注:我们只需要一个HDFS client即可,不需要部署HDFS集群。
4、添加阿里云HDFS依赖
cp aliyun-sdk-dfs-1.0.3.jar /usr/local/hadoop-2.7.2/share/hadoop/hdfs 下载地址:此处下载文件存储HDFS的SDK。
4、上传数据 #创建数据目录 [root@liumi-hdfs ~]# $HADOOP_HOME/bin/hadoop fs -mkdir -p /pod/data #将本地准备的文件(一本小说文本)上传到hdfs [root@liumi-hdfs ~]# $HADOOP_HOME/bin/hadoop fs -put ./A-Game-of-Thrones.txt /pod/data/A-Game-of-Thrones.txt #查看,文件大小为30G [root@liumi-hdfs local]# $HADOOP_HOME/bin/hadoop fs -ls /pod/data Found 1 items -rwxrwxrwx 3 root root 33710040000 2019-11-10 13:02 /pod/data/A-Game-of-Thrones.txt 至此HDFS数据准备部分就已经ready。
在spark应用中读取HDFS的数据 1、开发应用 应用开发上跟传统的部署方式没有区别。
SparkConf conf = new SparkConf().setAppName(WordCount.class.getSimpleName()); JavaRDD lines = sc.textFile("dfs://f-4b1fcae5dvxxx.cn-hangzhou.dfs.aliyuncs.com:10290/pod/data/A-Game-of-Thrones.txt", 250); ... wordsCountResult.saveAsTextFile("dfs://f-4b1fcae5dvxxx.cn-hangzhou.dfs.aliyuncs.com:10290/pod/data/A-Game-of-Thrones-Result"); sc.close(); 2、将前面的core-site.xml放入应用项目的resources目录
fs.defaultFS dfs://f-4b1fcae5dvexx.cn-hangzhou.dfs.aliyuncs.com:10290 fs.dfs.impl com.alibaba.dfs.DistributedFileSystem fs.AbstractFileSystem.dfs.impl com.alibaba.dfs.DFS io.file.buffer.size 8388608 alidfs.use.buffer.size.setting false dfs.usergroupservice.impl com.alibaba.dfs.security.LinuxUserGroupService.class dfs.connection.count 256 3、打包的jar文件需要包含所有依赖 mvn assembly:assembly 附应用的pom.xml: 1 2 5 4.0.0 6 7 com.aliyun.liumi.spark 8 SparkExampleJava 9 1.0-SNAPSHOT 10 11 12 13 org.apache.spark 14 spark-core_2.12 15 2.4.3 16 17 18 19 com.aliyun.dfs 20 aliyun-sdk-dfs 21 1.0.3 22 23 24 25 26 27 28 29 org.apache.maven.plugins 30 maven-assembly-plugin 31 2.6 32 33 false 34 35 jar-with-dependencies 36 37 38 39 com.aliyun.liumi.spark.example.WordCount 40 41 42 43 44 45 make-assembly 46 package 47 48 assembly 49 50 51 52 53 54 55 4、编写Dockerfile # spark base image FROM registry.cn-hangzhou.aliyuncs.com/eci_open/spark:2.4.4 # 默认的kubernetes-client版本有问题,建议用最新的 RUN rm $SPARK_HOME/jars/kubernetes-client-*.jar ADD https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/4.4.2/kubernetes-client-4.4.2.jar $SPARK_HOME/jars # 拷贝本地的应用jar RUN mkdir -p /opt/spark/jars COPY SparkExampleJava-1.0-SNAPSHOT.jar /opt/spark/jars 5、构建应用镜像 docker build -t registry.cn-beijing.aliyuncs.com/liumi/spark:2.4.4-example -f Dockerfile . 6、推到阿里云ACR docker push registry.cn-beijing.aliyuncs.com/liumi/spark:2.4.4-example 至此,镜像都已经准备完毕。接下来就是在kubernetes集群中部署Spark应用了。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。