Spark简介
Spark是由加州伯克利大学AMP实验室于2009年开发并于2013年加入Apache的开源大数据并行计算框架,它凭借自身独有的优势迅速成为Apache三大分布式计算框架之一,对比于常用的hadoop,它具有低时延、速度快、通用性强等优点。此外,Spark具有完善的生态系统,在资源调度方面它拥有Mesos和YARN,在存储方面它支持本地文件系统、HDFS、Amazon S3、HBase等,在数据仓库方面它拥有Hive SQL、Spark SQL,在接口方面它拥有mlib、GraphX等。
除了运算和生态方面的优势,Spark在数据处理方式方面同时支持批计算和流计算,虽然Spark在流计算方面不如storm、flink能够支持毫秒级别,但是对于大多数对实时性要求不高的在线计算已经足够使用。
基于上述众多优点使得Spark成为一个非常热门和受欢迎的大数据处理框架,目前在很多大型公司被广泛使用。
Spark不仅可以支持集群模式,还可以支持单机模式,但是我认为之所以使用大数据处理框架,它的主要优势就体现在多机并行方面,随着数据集的增加和节点数量的增加,它的对比于传统并行模式和其他大数据处理框架的优势更加明显。单机Spark配置相对集群配置相对简单一些,也节省很多步骤,因此,本文就讲解一下集群Spark配置方式,本文的配置是建立在已经配制好JDK的基础上,所以不再详细介绍JDK的安装和配置。
Hadoop集群环境搭建
Spark可以读取多种数据源的数据,例如Amazon s3、HBase、HDFS、本地文件系统,由于数据存放在某一个节点路径下,在Spark集群的其他节点无法直接读取相应路径下的数据,而HBase、Amazon s3这些存储服务在很多场景下很难满足,例如学校实验室。因此本文就以HDFS为例来进行讲解。
Hadoop主要包括两个部门,HDFS文件存储系统用于存储数据源,MapReduce用于从文件存储系统读取数据并进行分布式处理,由于本文只用到文件存储系统HDFS,用不到MapReduce,所以本文就配置一下集群Hadoop,讲解HDFS的使用,不深入研究MapReduce的使用。
准备工作
首先要保证集群中不同节点能够互相通信,然后为每个节点配置对应的hostname,后面会用到,
$ vim /etc/hosts 10.110.113.132 master 10.110.113.133 slave0 10.110.113.134 slave1 10.110.113.135 slave2
上述master和slave是每个节点的hostname,可以作为IP的地带,通过ping的方式可以测试hostname是否正常通信,可以在master节点上测试是否连接到不同的slave节点,
$ ping slave0
或者
$ ping 10.110.113.133
注:hostname的配置可以通过sudo vim /etc/hostname
修改文件进行配置。
ssh无密码登陆集群机器
由于集群配置hadoop涉及多台机器,当在master节点启动或者关闭集群hadoop时需要输入所有slave节点的密码,这样显然太麻烦,因此需要配置无密码登陆,这样后续启动时就不需要输入密码,
首先,如果节点没有安装ssh需要安装ssh,
$ sudo apt-get install ssh
然后,在每个节点上输入下面命令,测试是否能够正常登陆每个节点
$ ssh localhost
为了保证master节点能够无密码登陆所有slave节点,需要首先生成master节点的公钥,
$ ssh-keygen -t rsa
一直点击确定即可,然后会在home
路径下生成两个文件,id_rsa和id_rsa.pub,这时需要把id_rsa.pub的内容追加到authorized_keys后面,然后把master节点id_rsa.pub拷贝到所有slave节点并追加到所有slave节点authorized_keys的后面,
首先在master节点执行操作,
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
然后把master节点生成的id_rsa.pub拷贝到所有slave节点,
$ scp ~/.ssh/id_rsa.pub user_name@slave0:/home/user_name/ $ scp ~/.ssh/id_rsa.pub user_name@slave1:/home/user_name/ $ scp ~/.ssh/id_rsa.pub user_name@slave2:/home/user_name/
上述user_name
是slave节点的用户名,然后把id_rsa.pub追加到每个slave节点authorized_keys的后面,
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
然后可以在master节点上通过下方命令测试是否能够正常登陆每个slave节点,
$ ssh slave0 $ ssh slave1 $ ssh slave2
注意:上述都是假设master和每个slave节点的用户名user_name
一样的前提下,如果不一样需要修改~/.ssh/config
文件。
安装Hadoop
打开下面链接进入到下载页面,点击下载binary文件,把hadoop-3.2.1.tar.gz文件下载到home路径下,
https://hadoop.apache.org/releases.html
然后解压下载的文件到指定目录,同时需要修改对应目录的拥有者,因为hadoop在启动后会记录日志文件,如果不修改拥有者则没有权限写入文件,无法正常启动,
$ sudo tar -zxvf ~/下载/hadoop-3.2.1.tar.gz -C /usr/local $ cd /usr/local/ $ sudo mv ./hadoop-3.2.1/ ./hadoop $ sudo chown -R user_name ./hadoop
然后,把hadoop路径加入到环境变量里,如果需要长期有效,需要修改~/.bashrc
,
export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
然后保存退出,执行下面命令让环境变量生效,
$ source ~/.bashrc
集群配置
首先进入到Hadoop配置文件所在目录,
$ cd /usr/local/hadoop/etc/hadoop
然后修改slave节点配置文件,
$ vim slaves slave0 slave1 slave2
注意:上述slave0~2不是IP地址,是前面配置的hostname。
首先配置core-site.xml,
<configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> </configuration>
上述内容只需要修改<value>hdfs://master:9000</value>
这一句即可,其他的不需要修改,需要根据自己定义的master节点的hostname进行修改,例如你的master节点的hostname是hadoop,那么就需要修改成<value>hdfs://hadoop:9000</value>
,端口默认为9000,
然后配置hdfs-site.xml,
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
这里dfs.replication
默认值是3,它的含义是数据副本备份的数量,如果slave节点数量小于这个数的话则会报错,所以为了防止报错可以把这个值改为1,当然如果slave节点大于等于3的话也可以不修改。
如果需要使用MapReduce还需要配置mapred-site.xml,因为本文只使用HDFS而不使用MapReduce,因此就不配置mapred-site.xml了。
另外,如果需要yarn资源调度的话,需要修改yarn-site.xml,yarn是一个资源调度和分配工具,Spark本身自带资源管理器,也可以与yarn、Mesos结合使用,本文就使用Spark自带的资源管理器。
最后,需要在hadoop中配置JAVA环境,
$ vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh export JAVA_HOME=/path/to/java
上述/path/to/java需要替换成自己JAVA安装的路径。
slave节点配置
上述全部操作都是在master节点进行的,下面需要配置slave节点。配置slave节点比较容易,只需要把文件打包复制到各个slave节点,解压即可,
$ tar -zcf ~/hadoop.tar.gz /usr/local/hadoop $ scp ~/hadoop.tar.gz slave0:~/ $ scp ~/hadoop.tar.gz slave1:~/ $ scp ~/hadoop.tar.gz slave2:~/
然后在各个slave节点上都执行下面相同操作,
$ sudo rm -rf /usr/local/hadoop $ sudo tar -zxvf ~/hadoop.tar.gz -C /usr/local $ sudo chown -R user_name /usr/local/hadoop
启动Hadoop集群
通过上述的配置,master节点和slave节点的Hadoop都配置好了,下面需要做的就是启动集群上每个节点的Hadoop,
$ cd /usr/local/hadoop $ ./bin/hdfs namenode -format $ ./sbin/start-all.sh
注意:./bin/hdfs namenode -format
这一句命令很重要,不能缺少。如果前面没有配置ssh免密登陆,执行./sbin/start-all.sh
时会让输入密码。
然后在每个节点上执行下面命令,会在master节点上看到多了一个NameNode
,slave节点上会多出DataNode
,
$ jps
HDFS基本使用
HDFS的使用和Linux命令非常相似,例如上传数据用put
,创建目录用mkdir
,查看目录内容用ls
,删除目录用rm
,但是也有不同之处,下面就来看一下简单的示例,
创建目录
$ ./bin/hdfs dfs -mkdir -p /hello
上传文件到HDFS
首先先新建一个本地文件,
$ vim ~/test.txt hello world hello world hello world
然后使用下面命令进行上传,
$ ./bin/hdfs dfs -put ~/test.txt /hello
查看目录和文件内容
$ ./bin/hdfs dfs -ls /hello /hello/test.txt $ ./bin/hdfs dfs -cat /hello/test.txt hello world hello world hello world
然后我们就可以用Spark访问hdfs文件系统的文件,
text_file = sc.textFile("hdfs://master:9000/hello/text.txt")
文件的路径分为两部分,一部分是前面core-site.xml中配置的hostname:port,一部分是HDFS上传文件的相对路径。