赞
踩
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
Hadoop是一个能够对大量数据进行分布式处理的软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理 。
Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。
Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度 。
Hadoop 还是可伸缩的,能够处理 PB 级数据。
此外,Hadoop 依赖于社区服务,因此它的成本比较低,任何人都可以使用 。
Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。
它主要有以下几个优点 :
1.高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖 。
2.高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中 。
3.高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快 。
4.高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配 。
5.低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低 。
Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++ 。
Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心
HDFS
对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。
但是 HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。
这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;
DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 1.x版本的一个缺点(单点失败)。
在Hadoop 2.x版本可以存在两个NameNode,解决了单节点故障问题
NameNode
NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。
它负责管理文件系统名称空间和控制外部客户机的访问。
NameNode 决定是否将文件映射到 DataNode 上的复制块上。
对于最常见的 3 个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上
DataNode
DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。
Hadoop 集群包含一个 NameNode 和大量 DataNode。
DataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。
Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度
[root@server1 ~]# ls hadoop-3.2.1.tar.gz jdk-8u181-linux-x64.tar.gz [root@server1 ~]# mv hadoop-3.2.1.tar.gz jdk-8u181-linux-x64.tar.gz /home/hadoop/ [root@server1 ~]# su - hadoop Last login: Thu Jul 8 23:36:31 EDT 2021 on pts/0 [hadoop@server1 ~]$ ls hadoop-3.2.1.tar.gz jdk-8u181-linux-x64.tar.gz [hadoop@server1 ~]$ tar zxf jdk-8u181-linux-x64.tar.gz [hadoop@server1 ~]$ ls hadoop-3.2.1.tar.gz jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz [hadoop@server1 ~]$ ln -s jdk1.8.0_181/ java [hadoop@server1 ~]$ ls hadoop-3.2.1.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz [hadoop@server1 ~]$ ll total 532076 -rw-r--r-- 1 root root 359196911 Jul 8 23:35 hadoop-3.2.1.tar.gz lrwxrwxrwx 1 hadoop hadoop 13 Jul 8 23:39 java -> jdk1.8.0_181/ drwxr-xr-x 7 hadoop hadoop 245 Jul 7 2018 jdk1.8.0_181 -rw-r--r-- 1 root root 185646832 Jul 8 23:35 jdk-8u181-linux-x64.tar.gz [hadoop@server1 ~]$ tar zxf hadoop-3.2.1.tar.gz [hadoop@server1 ~]$ ln -s hadoop-3.2.1 hadoop
以下示例将未包装的 conf 目录复制为输入,然后查找并显示给定常规表达式的每个匹配项。输出已写入给定的输出目录。
[hadoop@server1 ~]$ cd hadoop [hadoop@server1 hadoop]$ cd etc/hadoop/ [hadoop@server1 hadoop]$ vim hadoop-env.sh export JAVA_HOME=/home/hadoop/java # Location of Hadoop. By default, Hadoop will attempt to determine # this location based upon its execution path. export HADOOP_HOME=/home/hadoop/hadoop [hadoop@server1 hadoop]$ mkdir input [hadoop@server1 hadoop]$ pwd /home/hadoop/hadoop [hadoop@server1 hadoop]$ cp etc/hadoop/*.xml input/ [hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+' ##使用系统给定的jar包做测试 [hadoop@server1 hadoop]$ ls input/ capacity-scheduler.xml hdfs-site.xml kms-site.xml core-site.xml httpfs-site.xml mapred-site.xml hadoop-policy.xml kms-acls.xml yarn-site.xml [hadoop@server1 hadoop]$ cd output/ [hadoop@server1 output]$ ls part-r-00000 _SUCCESS [hadoop@server1 output]$ cat * 1 dfsadmin [hadoop@server1 output]$
Hadoop 也可以在伪分布式模式下的单节点上运行,其中每个 Hadoop daemon 在单独的 Java 进程中运行。
[hadoop@server1 output]$ cd .. [hadoop@server1 hadoop]$ cd etc/hadoop/ [hadoop@server1 hadoop]$ vim core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> [hadoop@server1 hadoop]$ vim hdfs-site.xml <configuration> <property> <name>dfs.replication</name> <value>1</value> ##存储副本数,默认是三份,现在因为我们用一个节点做伪分布式,因此设置为1份 </property> </configuration>
默认情况下,hdfs会通过免密连接worker节点(数据存储节点)来启动相应的进程。在hadoop/etc/目录下会有workers的文件,文件中指定了worker节点
[hadoop@server1 hadoop]$ ssh-keygen ##本地免密
[hadoop@server1 hadoop]$ ssh-copy-id localhost
[hadoop@server1 hadoop]$ ll workers
-rw-r--r-- 1 hadoop hadoop 10 Sep 10 2019 workers
[hadoop@server1 hadoop]$ cat workers
localhost
[hadoop@server1 hadoop]$ ssh localhost
Last login: Fri Jul 9 00:53:18 2021 from localhost
[hadoop@server1 ~]$ logout
Connection to localhost closed.
[hadoop@server1 hadoop]$
[hadoop@server1 hadoop]$ bin/hdfs namenode -format ##格式化文件系统,产生的数据存储在/tmp/目录中 [hadoop@server1 hadoop]$ id uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop) [hadoop@server1 hadoop]$ sbin/start-dfs.sh ##启动NameNode进程和DataNode进程 Starting namenodes on [localhost] Starting datanodes Starting secondary namenodes [server1] [hadoop@server1 hadoop]$ cd [hadoop@server1 ~]$ vim .bash_profile [hadoop@server1 ~]$ tail -n4 .bash_profile PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/java/bin #设置环境变量 export PATH [hadoop@server1 ~]$ source .bash_profile [hadoop@server1 ~]$ jps ##显示当前系统开启的java进程 14419 DataNode #namenode节点上缓存的是整个分布式文件系统的元数据,datanode存储的是真正的数据,当NameNode挂掉后,SecondaryNameNode会接管。 14604 SecondaryNameNode 14828 Jps 14318 NameNode [hadoop@server1 ~]$ netstat -antlp
访问网页进行测试: http://172.25.15.1:9870
[hadoop@server1 ~]$ cd hadoop/
[hadoop@server1 hadoop]$ bin/hdfs
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop ##相当于创建用户在分布式文件系统中的家目录
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls
[hadoop@server1 hadoop]$ ls
bin etc include input lib libexec LICENSE.txt logs NOTICE.txt output README.txt sbin share
[hadoop@server1 hadoop]$ rm -fr output/
[hadoop@server1 hadoop]$ bin/hdfs dfs -put input ##将input目录中的内容上传到分布式文件存储系统中
启动分布式文件系统时要保证所有节点时间必须同步,而且解析要有,否则会报错。并且分布式文件系统中依然不能提前创建output目录,网页要保证之前没有output目录.
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount input output
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls
[hadoop@server1 hadoop]$ bin/hdfs dfs -cat output/* #词频统计,直接列出
[hadoop@server1 hadoop]$ bin/hdfs dfs -get output #下载下来
2021-05-11 05:23:58,659 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[hadoop@server1 hadoop]$ ls
bin etc include lib libexec LICENSE.txt logs NOTICE.txt output README.txt sbin share
[hadoop@server1 hadoop]$ cd output/
[hadoop@server1 output]$ cat * #查看所有
[hadoop@server1 output]$ ls
part-r-00000 _SUCCESS
[hadoop@server1 output]$ cd ..
[hadoop@server1 hadoop]$ rm -fr output/ ##删除本地存储,不会删除分布式存储系统中的存储
[hadoop@server1 hadoop]$ bin/hdfs dfs -rm -r output ##删除分布式存储系统中的存储
Deleted output
(1)在新开启的虚拟机上同样创建hadoop用户 (2)server1上的hdfs先停掉 (3)搭建nfs文件共享系统,server1为nfs服务器 (4)server2和server3挂载server1的hadoop目录到指定目录下从而实现数据同步 [hadoop@server1 hadoop]$ sbin/stop-dfs.sh Stopping namenodes on [localhost] Stopping datanodes Stopping secondary namenodes [server1] [hadoop@server1 hadoop]$ su - root Password: Last login: Thu Jul 8 23:05:33 EDT 2021 from foundation15.ilt.example.com on pts/0 [root@server1 ~]# yum install -y nfs-utils server2 server3 [root@server2 ~]# useradd hadoop [root@server2 ~]# echo westos | passwd --stdin hadoop Changing password for user hadoop. passwd: all authentication tokens updated successfully. [root@server2 ~]# yum install -y nfs-utils [root@server3 ~]# useradd hadoop [root@server3 ~]# echo westos | passwd --stdin hadoop Changing password for user hadoop. passwd: all authentication tokens updated successfully. [root@server3 ~]# yum install -y nfs-utils
[hadoop@server1 hadoop]$ pwd /home/hadoop/hadoop [hadoop@server1 hadoop]$ sbin/stop-dfs.sh Stopping namenodes on [localhost] Stopping datanodes Stopping secondary namenodes [server1] [hadoop@server1 hadoop]$ logout [root@server1 ~]# yum install -y nfs-utils [root@server1 ~]# vim /etc/exports /home/hadoop *(rw,anonuid=1000,anongid=1000) [root@server1 ~]# systemctl start nfs [root@server1 ~]# exportfs -r [root@server1 ~]# exportfs -rv exporting *:/home/hadoop [root@server1 ~]# showmount -e Export list for server1: /home/hadoop * [root@server1 ~]#
[root@server2 ~]# id uid=0(root) gid=0(root) groups=0(root) [root@server2 ~]# id hadoop uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop) [root@server2 ~]# mount 172.25.15.1:/home/hadoop/ /home/hadoop/ [root@server2 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/rhel-root 17811456 1166520 16644936 7% / devtmpfs 929012 0 929012 0% /dev tmpfs 941036 0 941036 0% /dev/shm tmpfs 941036 17008 924028 2% /run tmpfs 941036 0 941036 0% /sys/fs/cgroup /dev/vda1 1038336 148208 890128 15% /boot tmpfs 188208 0 188208 0% /run/user/0 172.25.15.1:/home/hadoop 17811456 3001600 14809856 17% /home/hadoop [root@server2 ~]#
[root@server3 ~]# id uid=0(root) gid=0(root) groups=0(root) [root@server3 ~]# id hadoop uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop) [root@server3 ~]# mount 172.25.15.1:/home/hadoop/ /home/hadoop/ [root@server3 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/rhel-root 17811456 1166520 16644936 7% / devtmpfs 929012 0 929012 0% /dev tmpfs 941036 0 941036 0% /dev/shm tmpfs 941036 17008 924028 2% /run tmpfs 941036 0 941036 0% /sys/fs/cgroup /dev/vda1 1038336 148208 890128 15% /boot tmpfs 188208 0 188208 0% /run/user/0 172.25.15.1:/home/hadoop 17811456 3001600 14809856 17% /home/hadoop [root@server3 ~]#
[hadoop@server1 ~]$ cd hadoop/etc/hadoop/ [hadoop@server1 hadoop]$ vim core-site.xml [hadoop@server1 hadoop]$ vim workers [hadoop@server1 hadoop]$ vim hdfs-site.xml [hadoop@server1 hadoop]$ cd .. [hadoop@server1 hadoop]$ cd .. [hadoop@server1 hadoop]$ bin/hdfs namenode -format [hadoop@server1 hadoop]$ ssh 172.25.15.2 The authenticity of host '172.25.15.2 (172.25.15.2)' can't be established. ECDSA key fingerprint is SHA256:OSdVXtO5BVPkuh1MYLNhhVkGDiLkFmrjDSo8ysMRRr0. ECDSA key fingerprint is MD5:f4:9e:26:78:0e:ef:5c:8e:cd:08:f5:5a:15:d1:0e:3c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.25.15.2' (ECDSA) to the list of known hosts. [hadoop@server2 ~]$ ssh 172.25.15.3 The authenticity of host '172.25.15.3 (172.25.15.3)' can't be established. ECDSA key fingerprint is SHA256:6N3DRBCV5LeHzl8RGj3iOtnqVL+xzKNRJc0J+jz/yqc. ECDSA key fingerprint is MD5:2d:df:2c:de:6a:e4:6b:bd:b9:49:da:a1:31:43:7b:57. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.25.15.3' (ECDSA) to the list of known hosts. [hadoop@server3 ~]$ ssh 172.25.15.1 Last login: Fri Jul 9 00:53:37 2021 from localhost
[hadoop@server1 ~]$ cd hadoop [hadoop@server1 hadoop]$ sbin/start-dfs.sh Starting namenodes on [server1] Starting datanodes Starting secondary namenodes [server1] [root@server2 ~]# su - hadoop Last login: Fri Jul 9 02:29:17 EDT 2021 from server1 on pts/1 [hadoop@server2 ~]$ cd hadoop [hadoop@server2 hadoop]$ jps 14178 Jps 14089 DataNode [hadoop@server2 hadoop]$ [root@server3 ~]# su - hadoop Last login: Fri Jul 9 02:29:40 EDT 2021 from server2 on pts/1 [hadoop@server3 ~]$ cd hadoop [hadoop@server3 hadoop]$ jps 14148 Jps 14056 DataNode [hadoop@server3 hadoop]$
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。