查看原文
其他

大数据处理 | HDFS文件系统配置及基本使用

Jackpop 平凡而诗意 2022-06-20

点击蓝字关注我


Spark是目前Apache三大主流开源分布式大数据处理框架之一,它具有低时延、速度快、通用性强、生态系统等优点,此外它不仅可以用于数据的批计算,还可以用于数据的流计算,这让它倍受欢迎。因此,我准备用两篇文章介绍一下Spark集群环境的搭建和基本使用,由于本文是基于HDFS文件存储系统,因此第一篇文章会详细介绍Hadoop集群的搭建与基本使用,第二篇文章会介绍Spark集群的搭建与基本使用。

—▼—

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上传文件的相对路径。

END


有趣的灵魂在等你

长按扫码可关注 

相关文章开发工具 | 你真的会用jupyter吗?效率工具 | 神器AutoHotkey使用教程实用资源 | 推荐6个高赞有趣的Github项目
文章好看就点这里

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存