数据分布式存储 3.1 教学目标 1. 能力目标 (1)能够根据项目实际,恰当选用Hadoop、Ceph和HBase产品。 (2)能够根据工程实际,基于Hadoop、Ceph和HBase设计存储系统。 (3)能够基于项目需求,开发访问Hadoop、Ceph和HBase存储系统的应用程序。 (4)能够基于现有存储系统的限制,进行最大限度的数据分布式存储方案的改进。 2. 素质目标 (1)能够准确撰写Hadoop、Ceph和HBase存储系统的设计文档。 (2)能够翔实撰写Hadoop、Ceph和HBase存储系统的搭建文档。 3.2 Hadoop 分布式存储 3.2.1 Hadoop3.1.1伪分布式集群环境搭建 1. 设置基础环境 以root身份分别在3台计算机上,编辑网络配置文件,设置主机名称,执行如下的命令。 #vim /etc/sysconfig/network 打开文件后,将名字节点的hostname改为master,将2个数据节点的hostname改 为slave1和slave2,将所有节点的networking设置为yes。 然后,在主节点设置主机名,执行如下的命令。 #hostnamectl set-hostname master 类似地,在2个数据节点设置主机名,分别执行如下的命令。 #hostnamectl set-hostname slave1 #hostnamectl set-hostname slave2 3 34 最后,分别在3台机器上执行su命令,以使主机名生效。 2. 添加全部节点IP 与主机名的映射 先获取管理员权限(默认后面的命令都已获取该权限),执行如下的命令。 #sudo su 接着修改主机名映射文件,以设置IP地址和机器名称的对应关系,编辑主机名映射 文件,执行如下的命令。 #vi /etc/hosts 打开文件后,在末尾追加master、slave1和slave2与IP地址的对应关系,如下所示。 192.168.50.194 master 192.168.50.190 slave1 192.168.50.191 slave2 上面的映射表明主节点的主机名为master,2个数据节点的主机名分别为slave1和 slave2。 3. 在3 台机器上安装JDK Hadoop3.1.1需要安装jdk-8u181-linux-x64.rpm。首先查看版本是否满足需求,如 果不满足,则应先卸载,再安装jdk-8u181-linux-x64.rpm。 (1)检验系统原版本,执行如下的命令。 #java -version 进一步查看JDK信息,执行如下的命令。 #rpm -qa | grep java (2)卸载OpenJDK,执行如下的命令。 #rpm -e --nodeps java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64 #rpm -e --nodeps nuxwdog-client-java-1.0.3-5.el7.x86_64 #rpm -e --nodeps javassist-3.26.1-10.el7.noarch #rpm -e --nodeps pki-base-java-10.4.1-10.el7.noarch #rpm -e --nodeps tzdata-java-2017b-1.el7.noarch #rpm -e --nodeps python-javapackages-3.5.1-11.el7.noarch #rpm -e --nodeps javamail-1.4.6-8.el7.noarch #rpm -e --nodeps javapackages-tools-3.5.1-11.el7.noarch #rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64 (3)安装JDK。 在Oracle官网下载jdk-8u181-linux-x64.rpm 到Windows桌面环境中,用WinSCP 软件将jdk-8u181-linux-x64.rpm 上传到3台虚拟机的/usr/local/目录下,如图3-1所示。 35 图3-1 用WinSCP把JDK包从宿主机复制到虚拟机 然后,分别在3台虚拟机中执行以下的命令。 #cd /usr/local #rpm -ivh jdk-8u181-linux-x64.rpm 安装成功后,JDK默认安装在/usr/java中。查看安装是否成功,执行以下的命令。 #java -version (4)配置环境变量。 Linux是一个多用户的操作系统。每个用户登录系统后,都有一个专用的运行环境。 通常每个用户默认的环境都是相同的,这个默认环境实际上由一组环境变量所定义。用 户可以对自己的运行环境进行定制,其方法是修改相应的系统环境变量。常在/etc/ profile文件中修改环境变量,本书中对环境变量的修改对所有用户都起作用。 在Hadoop集群的3台虚拟机上修改系统环境变量文件,执行如下的命令。 #vi /etc/profile 打开profile文件后,向文件末尾追加以下内容。 JAVA_HOME=/usr/java/jdk1.8.0_181-amd64 JRE_HOME=/usr/java/jdk1.8.0_181-amd64/jre PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib 保存文件后,为使得修改生效,执行如下的命令。 #source /etc/profile 36 为了验证输出工作目录是否正确,执行如下的命令。 #echo $PATH 为每一个运行bashshell的用户执行此文件。当bashshell被打开时,该文件被读 取。修改.bashrc文件,执行以下的命令。 #vim ~/.bashrc 打开文件后,向文件末尾追加如下的内容。 export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin 保存后退出,为使修改生效,执行如下的命令。 #source ~/.bashrc 为验证输出工作目录是否正确,执行如下的命令。 #echo $JAVA_HOME 4. SSH 设置免密登录 设置自身免密登录,执行如下的命令。 #yum install openssh-server 若上面的安装提示不成功,需要先创建一个目录。 (1)在3个节点依次执行如下的命令。 #cd ~/.ssh/ #rm -rf * #ssh-keygen -t rsa (2)在本机进行免密登录测试,执行如下的命令。 #ssh master //在master 上执行 #ssh slave1 //在slave1 上执行 #ssh slave2 //在slave2 上执行 (3)传送免密登录密钥到其他节点,使得节点间免密登录。 在master节点执行如下的命令。 cd ~/.ssh/ mv id_rsa.pub id_rsa_189.pub scp id_rsa_189.pub slave1:~/.ssh/ scp id_rsa_189.pub slave2:~/.ssh/ 37 在slave1节点执行如下的命令。 cd ~/.ssh/ mv id_rsa.pub id_rsa_190.pub scp id_rsa_190.pub master:~/.ssh/ scp id_rsa_190.pub slave2:~/.ssh/ 在slave2节点执行如下的命令。 cd ~/.ssh/ mv id_rsa.pub id_rsa_191.pub scp id_rsa_191.pub master:~/.ssh/ scp id_rsa_191.pub slave1:~/.ssh/ 在3个节点执行如下的命令。 cat id_rsa_189.pub >>authorized_keys cat id_rsa_190.pub >>authorized_keys cat id_rsa_191.pub >>authorized_keys (4)在master节点登录其他2个节点,执行如下的命令。 #ssh slave1 #exit #ssh slave2 #exit 上面master节点分别免密登录slave1和slave2节点进行测试,执行exit指令退出 相应的数据节点。 (5)在slave1和slave2节点登录master节点,执行如下的命令。 #ssh master 测试成功后执行exit指令退出master节点登录。 5. 在3 个节点安装Hadoop 在Hadoop官网下载Hadoop3.1.1,选择binary格式,文件为hadoop-3.1.1.tar.gz,在 Windows桌面环境中使用WinSCP将其上传到每个虚拟机节点的/usr/local/后,执行如 下的命令。 #cd /usr/local #tar -zxvf /usr/local/hadoop-3.1.1.tar.gz -C /usr/local #cd /usr/local #mv ./hadoop-3.1.1 ./hadoop #将文件夹名改为hadoop 在系统环境配置文件中添加Hadoop相关环境,即在~/.bashrc文件的JAVA_ HOME末尾追加,打开文件,执行如下的命令。 38 #vim ~/.bashrc 打开文件后,下载3-3-1-5-Hadoop安装bashrc文件,更新当前.bashrc内容。同样需 要执行source~/.bashrc,以使修改生效,再执行HDFS观察是否出现命令帮助提示,执 行如下的命令。 #source ~/.bashrc #hdfs 6. Hadoop 配置 首先,在master节点配置/usr/local/hadoop/etc/hadoop/下的6 个相关配置文件 hadoop-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、workers。 (1)修改hadoop-env.sh,配置Hadoop运行中使用的变量,执行如下的命令。 #cd /usr/local/hadoop/etc/hadoop/ #vim hadoop-env.sh 打开文件后,下载3-3-1-6-Hadoop配置env文件,更新当前hadoop-env.sh内容。 (2)修改core-site.xml文件,配置文件系统,执行如下的命令。 #vim core-site.xml 打开文件后,下载3-3-1-6-Hadoop配置core-site文件,更新当前core-site.xml内容。 (3)修改hdfs-site.xml文件,配置文件系统和相关协议的访问地址,执行如下的 命令。 #vim hdfs-site.xml 打开文件后,下载3-3-1-6-Hadoop 配置hdfs-site文件,更新当前hdfs-site.xml 内容。 (4)修改yarn-site.xml,配置YARN 资源管理器的有关参数,执行如下的命令。 #vim yarn-site.xml 打开文件后,下载3-3-1-6-Hadoop配置yarn-site文件,更新当前yarn-site.xml内容。 (5)修改mapred-site.xml,配置MapReduce的有关参数,执行如下的命令。 #vim mapred-site.xml 打开文件后,下载3-3-1-6-Hadoop配置mapred-site文件,更新当前mapred-site.xml 内容。 (6)修改workers,设置数据节点,执行如下的命令。 #vim workers 打开文件后,向文件末尾追加如下的配置。 slave1 slave2 39 (7)保证3个节点配置一致,将master节点的配置文件复制到集群其他节点,在 master机器上执行如下的命令。 #scp hadoop-env.sh root@slave1:/usr/local/hadoop/etc/hadoop/ #scp core-site.xml root@slave1:/usr/local/hadoop/etc/hadoop/ #scp hdfs-site.xml root@slave1:/usr/local/hadoop/etc/hadoop/ #scp mapred-site.xml root@slave1:/usr/local/hadoop/etc/hadoop/ #scp yarn-site.xml root@slave1:/usr/local/hadoop/etc/hadoop/ #scp workers root@slave1:/usr/local/hadoop/etc/hadoop/ #scp hadoop-env.sh root@slave2:/usr/local/hadoop/etc/hadoop/ #scp core-site.xml root@slave2:/usr/local/hadoop/etc/hadoop/ #scp hdfs-site.xml root@slave2:/usr/local/hadoop/etc/hadoop/ #scp mapred-site.xml root@slave2:/usr/local/hadoop/etc/hadoop/ #scp yarn-site.xml root@slave2:/usr/local/hadoop/etc/hadoop/ #scp workers root@slave2:/usr/local/hadoop/etc/hadoop/ (8)在3个节点上分别创建Hadoop配置对应的目录,执行如下的命令。 mkdir /usr/hadoop mkdir /usr/hadoop/tmp mkdir /usr/local/hadoop/hdfs mkdir /usr/local/hadoop/hdfs/name mkdir /usr/local/hadoop/hdfs/data 7. 启动Hadoop (1)格式化namenode。 第一次启动需在master节点进行格式化操作,执行如下的命令。 #hdfs namenode -format 如果提示信息中出现“/usr/local/hadoop/hdfs/name has been successfully formatted.”,表示格式化成功。 (2)启动集群服务。 在master节点启动集群,执行如下的命令。 #cd /usr/local/hadoop #sbin/start-all.sh 验证集群启动是否成功,在3 个节点分别执行jps,查看启动服务情况。首先在 master节点执行jps命令。 显示结果如下。 13780 NameNode 14443 ResourceManager 14875 Jps 40 14175 SecondaryNameNode 出现上面4个服务进程信息表示master节点作为名字节点、资源管理器、备用名字 节点启动成功。 在slave1节点上执行jps命令,显示结果如下。 13880 NodeManager 14202 Jps 13755 DataNode 出现上面3个服务进程信息表示slave1节点作为数据节点、节点管理器启动成功。 在slave2节点上执行jps,与slave1节点类似,不再累述。 8. 用Web 浏览器查看集群服务 在浏览器中访问master:50070,Hadoop集群的概览如图3-2所示,Hadoop集群信 息如图3-3所示。 图3-2 Hadoop集群的概览 至此,完成整个安装以及配置过程。 9. 关闭集群服务 在master节点上执行如下的命令。 #sbin/stop-all.sh 10. 重新格式化 当启动Hadoop失败或者首次格式化失败,需要重新格式化。如果执行格式化后, slave1或slave2节点中的Datanode无法启动,可尝试关闭Hadoop集群,删除master节 点中/usr/local/hadoop/hdfs/name/目录以及slave1或slave2节点中/usr/local/hadoop/ 41 图3-3 Hadoop集群数据节点信息 /目录下的所有文件,再到master节点执行格式化,使Namenode和Datanode ID 一致。 11.WordCount运行详解 ce编程模型。 e采用“分而治之”的思想,把对大规模数据集的操作,分发给一个主节点 管理下的各个数据节点共同完成,然后通过整合各个数据节点的中间结果,得到最终结 educe是“任务的分解与结果的汇总”。 p中用于执行MapReduce任务的机器角色有两个,一个是JobTracker,另 er。JobTracker用于调度工作,TaskTracker用于执行工作。一个 p集群中只有一个JobTracker。 在分布式计算中,MapReduce框架负责处理并行编程中分布式存储、工作调度、负载 容错处理以及网络通信等复杂问题,把处理过程高度抽象为map() 和 map() 负责把任务分解成多个任务,reduce() 负责把分解后多任务处 e来处理的数据集(或任务)必须可以分解成许多小的数据集,而且所有 小数据集可以完全并行地进行处理。 hdfs/data 中的Cluster (1)MapRedu MapReduc 果。简而言之,MapR 在Hadoo 一个是TaskTrackHadoo 均衡、容错均衡、 reduce() 两个函数, 理的结果汇总。 用MapReduc 42 (2)MapReduce处理过程。 如图3-4所示,在Hadoop中每个MapReduce任务都被初始化为一个Job,每个Job 分为map阶段和reduce阶段。这两个阶段分别用map()函数和reduce()函数来实现。 map()函数接收一个形式的输入,然后同样产生一个形式的 中间输出,reduce()函数接收一个如形式的输入,然后对这个 value集合进行处理,每个reduce()产生0或1个输出,reduce()的输出也是 形式。 图3-4 MapReduce处理大数据的过程 (3)运行WordCount程序。 单词计数以最简单的样例体现MapReduce 思想,称为MapReduce 版的Hello World,该程序的完整代码可以在Hadoop安装包的examples目录下找到。单词计数的 主要功能是统计某文本文件中每个单词出现的次数。 为实现单词计数,在master节点执行如下的命令。 #hadoop fs -chmod -R 777 / #hadoop fs -mkdir /input #hadoop fs -ls / #hadoop fs -put LICENSE.txt /input # hadoop jar share/hadoop/mapreduce/hadoop - mapreduce - examples - 3. 1. 1. jar wordcount /input /output 查看结果文件和运行结果,执行如下的命令。 #hadoop fs -ls /output 命令执行结果显示如下。 Found 2 items -rw-r--r-- 1 root supergroup 0 2020-11-11 17:02 /output/_SUCCESS -rw-r--r-- 1 root supergroup 34795 2020-11-11 17:02 /output/part-r-00000 上面的输出信息表示单词计数成功并存储在output目录,查看单词计数统计结果, 执行如下的命令。 43 #hadoop fs -cat /output/part-r-00000 命令执行结果显示如下。 ...... 'Your' 2 'You' 4 'as 1 'commercial' 3 'control' 2 12. WordCount 源码分析 (1)特别数据类型介绍。 Hadoop提供的数据类型都实现了WritableComparable接口,以便用这些类型定义 的数据可以被序列化进行网络传输和文件存储,以及进行大小比较,具体数据类型如下。 BooleanWritable:标准布尔型数值。 ByteWritable:单字节数值。 DoubleWritable:双字节数。 FloatWritable:浮点数。 IntWritable:整型数。 LongWritable:长整型数。 Text:使用UTF8格式存储的文本。 NullWritable:当中的key或value为空时使用。 (2)各阶段说明。 .JobConf具体配置项如下所列。 setInputFormat:设置map的输入格式,默认为TextInputFormat,key为LongWritable, value为Text。 setNumMapTasks:设置map任务的个数,此设置通常不起作用,map任务的个数取 决于输入的数据所能分成的inputsplit的个数。 setMapperClass:设置Mapper,默认为IdentityMapper。 setMapRunnerClass:设置MapRunner,maptask是由MapRunner运行的,默认为 MapRunnable,其功能为顺次读取inputsplit的全部record,依次调用Mapper的map() 函数。 setMapOutputKeyClass和setMapOutputValueClass:设置Mapper 输出对keyvalue 的格式。 setOutputKeyClass和setOutputValueClass:设置Reducer输出对key-value的格式。 setPartitionerClass和setNumReduceTasks:设置Partitioner,默认为HashPartitioner,其 根据key的Hash值来决定进入哪个partition,每个partition被一个ReduceTask处理,所以 partition的个数等于ReduceTask的个数。 setReducerClass:设置Reducer,默认为IdentityReducer。 t。 一个路径、 b运行前此路径不应 oop会通过 leInputFormat的 也可以是目录 InputPath()方法。 即写入目录。运行作业 ap()和reduce() educe()函数的输 extInputFormat。 inclas 为 ava进程,其 ob相关的文件。 ubmitJob()函数。 obID 、检测此Job b.l配置文件和 xm 直到任 Job rogres 。在创建 nputsplits。其为 44setOutputFormat:设置任务的输出格式,默认为TextOutputFormaFileInputFormat.addInputPath:设置输入文件的路径(可以是一个文件、 一个通配符),可以被调用多次添加多个路径。 FileOutputFormat.setOutputPath:设置输出文件的路径,在Jo 该存在。 JobConf对象制定作业执行规范,构造函数的参数为作业所在的类,Had 该类来查找包含该类的JAR文件。 构造JobConf对象后,指定输入和输出数据的路径。本书通过Fi 静态方法addInputPath()来定义输入数据的路径,路径可以是单个文件, (即目录下的所有文件)或符合特定模式的一组文件,可以多次调用add 同理,FileOutputFormat.setOutputPath()指定输出路径, 前,如果写入目录不应该存在,Hadoop会拒绝并报错。这样设计主要是防止数据丢失, 因为Hadoop运行时间长。 FileOutputFormat.setOutputPath()和conf.setMapperClass()指定m 类型。 接着,setOutputKeyClass和setOutputValueClass指定map()和r 出类型,这两个函数的输出类型往往相同。如果不同,map()函数的输出类型通过 setMapOutputKeyClass和setMapOutputValueClass指定。 输入的类型用InputFormat设置,本例中没有指定,使用默认的T 最后JobClient.runJob()会提交作业并等待完成,将结果写到控制台。 .MapReduce的处理过程主要涉及以下4个部分。 客户端Client:用于提交MapReduce任务Job。 JobTracker:协调整个Job的运行。它是一个Java进程,其maJobTracker。 TaskTracker:运行此Job的task,处理inputsplit。它是一个Jmainclass为TaskTracker。 HDFS:Hadoop分布式文件系统,在各个进程间共享JJobClient.runJob()创建一个新的JobClient实例,调用其sJobClient实例的作用依次为向JobTracker请求一个新的J 的output配置、计算此Job的inputsplits和将Job运行所需的资源复制到 JobTracker的文件系统中的文件夹中(包括JobJar文件、joinputsplits)、通知JobTracker此Job已经可以运行。 提交任务后,runJob每隔一秒钟轮询一次Job的进度,将进度返回到命令行, 务运行完毕。当JobTracker收到submitJob调用的时候,将此任务放到一个队列中, 调度器将从队列中获取任务并初始化任务。 初始化首先创建一个对象来封装Job运行的tasks、status以及ptask之前,Job调度器首先从共享文件系统中获得JobClient计算出的i 每个inputsplit创建一个maptask。每个task被分配一个ID。 TaskTracke 告知JobTracke 在JobTracke 级选择一个Job, TaskTracke 对待maptastask之间选择, TaskTrackeJacache中将Jo 的工作目录,将Ja TaskRunne 通信来报告运行进度。 . 的map() 存memor 同一个par 盘flus ma .ReducJobTracke 系。Reduc 出。Reducmaptas 将所有的maReduceHDFS 。 . (3)新的Wor 下载3-3-1-14 执行的具体实现 。 45r周期性地向JobTracker发送heartbeat。在heartbeat中,TaskTracker r其已经准备运行一个新的task,JobTracker将分配给其一个task。 r为TaskTracker选择一个task之前,JobTracker必须首先按照优先 在最高优先级的Job中选择一个task。 r有固定数量的位置来运行maptask或者reducetask。默认的调度器 k优先于reducetask。当选择reducetask的时候,JobTracker不是在多个 而是直接取下一个,因为reducetask没有数据本地化的概念。 r被分配了一个task后便运行此task。首先,TaskTracker将此Job的 r从共享文件系统中复制到TaskTracker的文件系统中。TaskTracker从distributed b运行所需要的文件复制到本地磁盘。其次,其为每个task创建一个本地 r解压缩到文件目录中。最后,其创建一个TaskRunner来运行task。 r创建一个新的JVM来运行task。被创建的childJVM和TaskTracker Map的过程:MapRunnable从输入split中逐个读取记录,然后依次调用Mapper 函数,将结果输出。map()的输出不是直接写入硬盘,而是将其写入缓 ybuffer。当buffer中数据到达一定规模,一个背景线程将数据开始写 入硬盘。在写入硬盘之前,内存中的数据通过partitioner分成多个partition。在 tition中,背景线程会将数据按照key在内存中排序。每次从内存向硬 h数据,都生成一个新的spill文件。当此task结束之前,所有的spill文件 被合并为一个被分区而且排好序的文件。Reducer可以通过HTTP协议请求 p的输出文件,tracker.http.threads可以设置HTTP服务线程数。 e的过程:当maptask结束后,其通知TaskTracker,TaskTracker通知 r。对于一个Job,JobTracker知道TaskTracer和map输出的对应关 er中一个线程周期性地向JobTracker请求map输出的位置,直到其 取得了所有的map输出。reducetask需要其对应的partition的所有的map输 etask中的复制是当每个maptask结束时开始复制输出,因为不同的 k完成时间不同。Reducetask中有多个copy线程,可以并行复制map 输出。当很多map输出复制到reducetask后,一个背景线程将其合并为一个大 的排好序的文件。当所有的map输出都复制到Reducetask后,进入sort过程, p输出合并为大的排好序的文件。最后进入Reduce过程,调用 r的reduce()函数,处理排好序的输出的每个key,最后的结果写入 任务结束:当JobTracker获得最后一个task的运行成功的报告后,将Job的状态 改为成功。当JobClient从JobTracker轮询的时候,发现此Job已经成功结束,则 向用户打印消息,从runJob()函数中返回。 dCount分析 MapReduce-WordCount源程序及分析文件,分析map、reduce和任务 13. WordCount 处理过程 WordCount详细的执行步骤如下。 (1)将文件拆分成splits,并将文件按行分割形成对。以文件内容 “HeloWorldByeWorldHeloHadoopByeHadoop”为例,如图3-5所示。这一步由 MapReduce框架自动完成,其中偏移量(即key值)包括了回车所占的字符数(Windows 和Linux环境会不同)。 图3-5 分割过程 (2)将分割好的对交给map()方法处理,生成新的对, 如图3-6所示。 图3-6 映射过程 (3)得到map()方法输出的对后,Mapper会将它们按照key值进行排 序,并执行Combine过程,将key值相同的value值累加,得到Mapper的最终输出结果, 如图3-7所示。 (4)Reducer先对从Mapper接收的数据进行排序,再交由用户自定义的reduce()方 法进行处理,得到新的对,并作为WordCount的输出结果,如图3-8所示。 3.2.2 Eclipse访问Hadop 1. 基础准备 (1)从官网下载hado-cis-lgn2.2.ar。 opelpepui-7.jtps:k.pceog/hdcisPuI 打开网页h//wiiaah.raop/Elpelgn,进入下载页面,如图39所示。 46 47 图3-7 Map排序与Combine过程 图3-8 Reduce排序与输出结果 图3-9 下载hadoop-eclipse-plugin-2.7.2.jar页面 (2)如前面3.2.1节所述,启动Hadoop集群。 (3)在名字节点安装Eclipse,执行如下的命令。 #cd /usr/local 48 #tar -zxvf eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz #ln -s eclipse/eclipse /usr/bin/eclipse #vi /usr/share/applications/eclipse.desktop 打开文件后,下载3-3-2-1-eclipse-desktop文件,作为eclipse.desktop文件的内容。 (4)将/usr/share/applications下的eclipse.desktop文件复制到桌面。 (5)启动Eclipse。 如图3-10所示,依次单击应用程序→编程→Eclipse4.4.2,设置并确认“/home/189/ workspace”空间后,单击OK按钮后则成功启动Eclipse,如图3-11所示。 图3-10 Eclipse启动图标 图3-11 Eclipse4.4.2开发环境界面 2 . 安装Hadoop 插件 如图3-12所示,Winows桌面环境下借助WinSCP将haop-cipeplgi-7. ddoels-un2.2. jar复制到虚拟机Master主机的eclipse/dropins目录中。 图3-12 用WinSCP将hdo-cis-lgn2.2.ar复制到/s/elpe/dois目录的界面 aopelpepui-7.jurcisrpn (1)配置DFSLocation。重启Eclipse,依次选择Window→showview→other→ MapReduceTools/Map/ReduceLocations,弹出如图3-13所示的对话框,单击图3-13右 下角箭头所指图标,新建位置,进入如图3-14所示的对话框,在Map/ReduceMaster组的 Hosr50.to t和Pt编辑框中分别输入192.189和9001,在DFSMar组的Pt中输 o168.ser 入9000,单击Finish按钮后出现如图3-15所示的Map/ReduceLocations记录。 图3-13 Map/ReduceLocations操作界面 (2)新建Map/Reduce项目。在Eclipse中依次选择File→New→Other. →Map/ ReduceProject→Next,输入项目名TestWordCount后,浏览并选择Hadoop路径/usr/ local/hadoop,单击Finish按钮,则项目TestWordCount创建成功,此时项目浏览界面如 图3-16所示。 (3)添加并编写WordCountjava源文件,其项目浏览界面如图317所示。 . 49 50 图3-14 NewHadoopLocation对话框 图3-15 Map/ReduceLocations界面 图3-16 新建Map/Reduce项目成功后的项目浏览界面 51 图3-17 添加WordCount源文件后的项目浏览界面 下载3-3-2-2-eclipse-WordCount源程序文件,作为WordCount.java的内容。 (4)配置运行参数。在master节点中新建一个HDFS格式的tmp目录,执行如下的 命令。 #hadoop fs -mkdir /tmp 修改目录权限,执行如下的命令。 #hadoop fs -chmod -R 777 /tmp (5)在Eclipse本地开发环境中新建一个文件input01,其文件内容如下。 hello world hello china hello jiangsu hello suzhou (6)配置RunConfigurations。在Eclipse中依次单击Run→RunConfigurations,以 配置输入/输出参数,如图3-18所示。 图3-18 运行配置对话框 52 (7)单击Run按钮,启动应用程序。 配置参数完成后,单击图3-18的Run按钮,启动应用程序,运行结果如图3-19所示。 图3-19 运行结果界面 3.2.3 自训任务和案例实践思考 1. 自训任务 在虚拟机上部署Hadoop3.1.1伪分布式集群,要求如下。 (1)3个节点,即1个名字节点和2个数据节点。 (2)主机名由2部分构成,名字节点和数据节点的主机名前半部分分别为master或 slave,后半部分为个人学号的后3位。 (3)部署完成后打开网页http://masterXXX:50070,XXX为个人学号的后3位,观 察集群状态。 (4)运行Hadoop3.1.1自带的WordCount单词个数统计样例包。 (5)新建EclipseMap/Reduce项目,求解n 个数的最大值。 (6)以Word文档提交完整的部署过程文档。运行结果截屏为证,体现个人主机 特征。 (7)图示给出求解最大值的具体过程。 2. 案例实践思考 根据水务云平台的解决方案,给出基于Hadoop生态环境的存储系统架构设计方案。 3.3 Ceph 分布式存储 3.3.1 Ceph整体架构 1. Ceph 整体架构 Ceph架构基于去中心化和高可靠性、高度自动化、高可扩展性的设计思路,其整体架 构如图3-20所示。