使用Hadoop、Spark等運行批處理作業時,可以選擇文件存儲HDFS作為存儲。本文以Spark為例,演示如何上傳文件到在HDFS中,并在Spark中進行訪問。
準備數據并上傳到HDFS
開通HDFS。具體操作,請參見開通文件存儲HDFS版服務。
創建文件系統。具體操作,請參見創建文件系統。
(可選)創建權限組,并設置規則。具體操作,請參見管理權限組。
創建掛載點。具體操作,請參見管理掛載點。
安裝Apache Hadoop。
下載Apache Hadoop。
Apache Hadoop下載地址請參見Hadoop下載,建議選用的Apache Hadoop版本不低于2.7.2,本文檔中使用的Apache Hadoop版本為Apache Hadoop 2.7.2。
解壓Apache Hadoop壓縮包到指定文件夾。
tar -zxvf hadoop-2.7.2.tar.gz -C /usr/local/
修改core-site.xml配置文件。
vim /usr/local/hadoop-2.7.2/etc/hadoop/core-site.xml
修改core-site.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.defaultFS</name> <value>dfs://f-4b1fcae5dv***.cn-hangzhou.dfs.aliyuncs.com:10290</value> <!-- 該地址填寫您的HDFS掛載點地址 --> </property> <property> <name>fs.dfs.impl</name> <value>com.alibaba.dfs.DistributedFileSystem</value> </property> <property> <name>fs.AbstractFileSystem.dfs.impl</name> <value>com.alibaba.dfs.DFS</value> </property> <property> <name>io.file.buffer.size</name> <value>8388608</value> </property> <property> <name>alidfs.use.buffer.size.setting</name> <value>false</value> <!-- 建議不開啟,開啟后會降低iosize,進而影響數據吞吐 --> </property> <property> <name>dfs.usergroupservice.impl</name> <value>com.alibaba.dfs.security.LinuxUserGroupService.class</value> </property> <property> <name>dfs.connection.count</name> <value>256</value> </property> </configuration>
說明配置時,只需配置HDFS相關的幾個配置項,修改后的core-site.xml文件在配置應用時將會用到。
修改/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依賴。
cp aliyun-sdk-dfs-1.0.3.jar /usr/local/hadoop-2.7.2/share/hadoop/hdfs
HDFS SDK的下載地址為HDFS SDK。只需部署HDFS Client,無需部署HDFS集群。
上傳數據到HDFS。
創建數據目錄。
$HADOOP_HOME/bin/hadoop fs -mkdir -p /pod/data
將本地文件上傳到HDFS。
以下命令使用本地準備的一本書作為示例,請根據實際替換。
$HADOOP_HOME/bin/hadoop fs -put ./A-Game-of-Thrones.txt /pod/data/A-Game-of-Thrones.txt
確認文件信息。
$HADOOP_HOME/bin/hadoop fs -ls /pod/data
在Spark應用中讀取HDFS的數據
開發應用。
SparkConf conf = new SparkConf().setAppName(WordCount.class.getSimpleName()); JavaRDD<String> lines = sc.textFile("dfs://f-4b1fcae5dv***.cn-hangzhou.dfs.aliyuncs.com:10290/pod/data/A-Game-of-Thrones.txt", 250); ... wordsCountResult.saveAsTextFile("dfs://f-4b1fcae5dv***.cn-hangzhou.dfs.aliyuncs.com:10290/pod/data/A-Game-of-Thrones-Result"); sc.close();
在應用中配置HDFS信息。
方式一:使用靜態配置文件
將core-site.xml放入到應用項目的resources目錄下。
方式二:提交應用時進行動態設置
以Spark為例,在提交應用時進行設置,示例如下:
hadoopConf: # HDFS "fs.defaultFS": "dfs://f-4b1fcae5dv***.cn-hangzhou.dfs.aliyuncs.com:10290" "fs.dfs.impl": "com.alibaba.dfs.DistributedFileSystem" "fs.AbstractFileSystem.dfs.impl": "com.alibaba.dfs.DFS"
打包JAR文件。
mvn assembly:assembly
打包的JAR文件中需包含所有依賴。應用的pom.xml如下:
1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.aliyun.liumi.spark</groupId> 8 <artifactId>SparkExampleJava</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <dependencies> 12 <dependency> 13 <groupId>org.apache.spark</groupId> 14 <artifactId>spark-core_2.12</artifactId> 15 <version>2.4.3</version> 16 </dependency> 17 18 <dependency> 19 <groupId>com.aliyun.dfs</groupId> 20 <artifactId>aliyun-sdk-dfs</artifactId> 21 <version>1.0.3</version> 22 </dependency> 23 24 </dependencies> 25 26 <build> 27 <plugins> 28 <plugin> 29 <groupId>org.apache.maven.plugins</groupId> 30 <artifactId>maven-assembly-plugin</artifactId> 31 <version>2.6</version> 32 <configuration> 33 <appendAssemblyId>false</appendAssemblyId> 34 <descriptorRefs> 35 <descriptorRef>jar-with-dependencies</descriptorRef> 36 </descriptorRefs> 37 <archive> 38 <manifest> 39 <mainClass>com.aliyun.liumi.spark.example.WordCount</mainClass> 40 </manifest> 41 </archive> 42 </configuration> 43 <executions> 44 <execution> 45 <id>make-assembly</id> 46 <phase>package</phase> 47 <goals> 48 <goal>assembly</goal> 49 </goals> 50 </execution> 51 </executions> 52 </plugin> 53 </plugins> 54 </build> 55</project>
編寫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
構建應用鏡像。
docker build -t registry.cn-beijing.aliyuncs.com/liumi/spark:2.4.4-example -f Dockerfile .
將鏡像推送到阿里云ACR。
docker push registry.cn-beijing.aliyuncs.com/liumi/spark:2.4.4-example
完成上述操作,即準備好Spark應用鏡像后,可以使用該鏡像在Kubernetes集群中部署Spark應用。