前面几篇主要是sparkRDD相关的基础,也使用过textFile来操作过本机的文档。实际应用中,操作普通文档的机会不多,更多的时候是操作kafka的流和Hadoop上文件。
下面我们就在本机搭建一个Hadoop环境。
1 安装配置Hadoop
首先下载Hadoop的压缩包,http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.3/hadoop-2.8.3.tar.gz
我这里使用的是2.8.3版本,下载好后解压到某文件夹。
Hadoop依赖于java,所以需要首先在电脑上装好java,配好java的环境变量。
配置Hadoop环境变量
hadoop的可执行文件在sbin目录和bin目录,我们需要将这两个目录配到环境变量Path里。
以mac为例,看环境变量配置,vi .bash_profile :
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home export HADOOP_HOME=/Users/wuwf/Downloads/hadoop-2.8.3 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
配置完毕后,source .bash_profile使环境变量生效。执行hadoop version
weifengdeMacBook-Pro:~ wuwf$ hadoop version Hadoop 2.8.3 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r b3fe56402d908019d99af1f1f4fc65cb1d1436a2 Compiled by jdu on 2017-12-05T03:43Z Compiled with protoc 2.5.0 From source with checksum 9ff4856d824e983fa510d3f843e3f19d This command was run using /Users/wuwf/Downloads/hadoop-2.8.3/share/hadoop/common/hadoop-common-2.8.3.jar
Hadoop的各个配置文件
各文件均在hadoop安装目录下etc/hadoop下
修改hadoop-env.sh
加入 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
后面是你的Java_HOME的路径。
修改core-site.xml
<configuration> <!--设置临时目录--> <property> <name>hadoop.tmp.dir</name> <value>/Users/wuwf/Hadoop/hadoop-2.8.3/data</value> </property> <!--设置文件系统--> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.1.55:9999</value> </property> </configuration>上面临时目录是本地的一个目录,下面的ip是本机的ip,注意用localhost时后面报错,需要直接填写自己的ip。
修改hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
只有本机一个节点,设置replication为1
添加mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
在目录下创建一个该文件,填入上面的内容
配置yarn-site.xml
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>192.168.1.55:9999</value> </property> </configuration>
启动Hadoop
先执行:hadoop namenode -format
然后启动hdfs:start-dfs.sh,如果mac电脑显示localhost port 22:Connect refused,需要在设置-共享-勾选远程登录,允许访问那个添加当前用户。
执行start-dfs.sh后会要求输入3次密码。
然后:start-yarn.sh
两个命令执行后,通过浏览器访问:localhost:50070
代表hadoop配置成功。
推送文件到hadoop中
执行如下命令
hdfs dfs -mkdir /wc
hdfs dfs -put a /wc/1.log
hdfs dfs -put a /wc/2.log
hdfs dfs -put a /wc/3.log
先在hdfs上创建一个目录,然后推送本机的文件a到hdfs上,并重新命名。
hdfs dfs -ls /wc 可以查看目录下的文件。
spark读取hadoop文件
import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SparkSession; import java.util.List; /** * @author wuweifeng wrote on 2018/4/27. */ public class Test { public static void main(String[] args) { SparkSession sparkSession = SparkSession.builder().appName("JavaWordCount").master("local").getOrCreate(); JavaSparkContext javaSparkContext = new JavaSparkContext(sparkSession.sparkContext()); JavaRDD<String> javaRDD = javaSparkContext.textFile("hdfs://192.168.1.55:9999/wc/1.log"); //取10%的数据,随机数种子自己设定,也可以不设定 JavaRDD<String> sample = javaRDD.sample(false, 0.1, 1234); long sampleDataSize = sample.count(); long rawDataSize = javaRDD.count(); System.out.println(rawDataSize + " and after the sampling: " + sampleDataSize); //取指定数量的随机数据 List<String> list = javaRDD.takeSample(false, 10); System.out.println(list); //取排序好的指定数量的数据 List<String> orderList = javaRDD.takeOrdered(10); System.out.println(orderList); } }
同样是使用textFile方法,和操作本地文件一样。