首页
关于
推荐
百度一下
腾讯视频
Search
1
你要的草莓熊来啦!——郑科院
1,247 阅读
2
郑州科技学院2023-2024学年第一学期期末统一考试 Python程序设计
1,174 阅读
3
第4章 实训2 删除年龄异常数据
1,006 阅读
4
Python程序设计教学大纲(董付国老师版)
978 阅读
5
郑州科技学院2022-2023年第二学期期末统一考试 管理学 课程试题
914 阅读
默认分类
登录
/
注册
Search
庞立智
累计撰写
71
篇文章
累计收到
289
条评论
首页
栏目
默认分类
页面
关于
推荐
百度一下
腾讯视频
搜索到
52
篇与
的结果
2024-05-31
利用Java API与HDFS进行交互
Hadoop采用Java语言开发的,提供了Java API与HDFS进行交互。上面介绍的Shell命令,在执行时实际上会被系统转换成Java API调用。Hadoop官方网站提供了完整的Hadoop API文档(http://hadoop.apache.org/docs/stable/api/),想要深入学习Hadoop编程,可以访问Hadoop官网查看各个API的功能和用法。本教程只介绍基础的HDFS编程。为了提高程序编写和调试效率,本教程采用Eclipse工具编写Java程序。现在要执行的任务是:假设在目录“hdfs://localhost:9000/user/hadoop”下面有几个文件,分别是file1.txt、file2.txt、file3.txt、file4.abc和file5.abc,这里需要从该目录中过滤出所有后缀名不为“.abc”的文件,对过滤之后的文件进行读取,并将这些文件的内容合并到文件“hdfs://localhost:9000/user/hadoop/merge.txt”中。 1. 在Eclipse中创建项目 启动Eclipse。当Eclipse启动以后,会弹出如下图所示界面,提示设置工作空间(workspace)。可以直接采用默认的设置“/home/hadoop/workspace”,点击“OK”按钮。可以看出,由于当前是采用hadoop用户登录了Linux系统,因此,默认的工作空间目录位于hadoop用户目录“/home/hadoop”下。Eclipse启动以后,会呈现如下图所示的界面。选择“File-->New-->Java Project”菜单,开始创建一个Java工程,会弹出如下图所示界面。在“Project name”后面输入工程名称“HDFSExample”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/workspace/HDFSExample”目录下。在“JRE”这个选项卡中,可以选择当前的Linux系统中已经安装好的JDK,比如jdk1.8.0_162。然后,点击界面底部的“Next>”按钮,进入下一步的设置。 2. 为项目添加需要用到的JAR包 需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了可以访问HDFS的Java API。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,会弹出如下图所示界面。在该界面中,上面的一排目录按钮(即“usr”、“local”、“hadoop”、“share”、“hadoop”和“common”),当点击某个目录按钮时,就会在下面列出该目录的内容。为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:(1)“/usr/local/hadoop/share/hadoop/common”目录下的所有JAR包,包括hadoop-common-3.1.3.jar、hadoop-common-3.1.3-tests.jar、haoop-nfs-3.1.3.jar和haoop-kms-3.1.3.jar,注意,不包括目录jdiff、lib、sources和webapps;(2)“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;(3)“/usr/local/hadoop/share/hadoop/hdfs”目录下的所有JAR包,注意,不包括目录jdiff、lib、sources和webapps;(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.1.3.jar、hadoop-common-3.1.3-tests.jar、haoop-nfs-3.1.3.jar和haoop-kms-3.1.3.jar添加到当前的Java工程中,可以在界面中点击目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容(如下图所示)。请在界面中用鼠标点击选中hadoop-common-3.1.3.jar、hadoop-common-3.1.3-tests.jar、haoop-nfs-3.1.3.jar和haoop-kms-3.1.3.jar(不要选中目录jdiff、lib、sources和webapps),然后点击界面右下角的“确定”按钮,就可以把这两个JAR包增加到当前Java工程中,出现的界面如下图所示。从这个界面中可以看出,hadoop-common-3.1.3.jar、hadoop-common-3.1.3-tests.jar、haoop-nfs-3.1.3.jar和haoop-kms-3.1.3.jar已经被添加到当前Java工程中。然后,按照类似的操作方法,可以再次点击“Add External JARs…”按钮,把剩余的其他JAR包都添加进来。需要注意的是,当需要选中某个目录下的所有JAR包时,可以使用“Ctrl+A”组合键进行全选操作。全部添加完毕以后,就可以点击界面右下角的“Finish”按钮,完成Java工程HDFSExample的创建。 3. 编写Java应用程序 下面编写一个Java应用程序。请在Eclipse工作界面左侧的“Package Explorer”面板中(如下图所示),找到刚才创建好的工程名称“HDFSExample”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New-->Class”菜单。选择“New-->Class”菜单以后会出现如下图所示界面。在该界面中,只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“MergeFile”,其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮,出现如下图所示界面。可以看出,Eclipse自动创建了一个名为“MergeFile.java”的源代码文件,请在该文件中输入以下代码:import java.io.IOException; import java.io.PrintStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; /** * 过滤掉文件名满足特定条件的文件 */ class MyPathFilter implements PathFilter { String reg = null; MyPathFilter(String reg) { this.reg = reg; } public boolean accept(Path path) { if (!(path.toString().matches(reg))) return true; return false; } } /*** * 利用FSDataOutputStream和FSDataInputStream合并HDFS中的文件 */ public class MergeFile { Path inputPath = null; //待合并的文件所在的目录的路径 Path outputPath = null; //输出文件的路径 public MergeFile(String input, String output) { this.inputPath = new Path(input); this.outputPath = new Path(output); } public void doMerge() throws IOException { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf); FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf); //下面过滤掉输入目录中后缀为.abc的文件 FileStatus[] sourceStatus = fsSource.listStatus(inputPath, new MyPathFilter(".*\\.abc")); FSDataOutputStream fsdos = fsDst.create(outputPath); PrintStream ps = new PrintStream(System.out); //下面分别读取过滤之后的每个文件的内容,并输出到同一个文件中 for (FileStatus sta : sourceStatus) { //下面打印后缀不为.abc的文件的路径、文件大小 System.out.print("路径:" + sta.getPath() + " 文件大小:" + sta.getLen() + " 权限:" + sta.getPermission() + " 内容:"); FSDataInputStream fsdis = fsSource.open(sta.getPath()); byte[] data = new byte[1024]; int read = -1; while ((read = fsdis.read(data)) > 0) { ps.write(data, 0, read); fsdos.write(data, 0, read); } fsdis.close(); } ps.close(); fsdos.close(); } public static void main(String[] args) throws IOException { MergeFile merge = new MergeFile( "hdfs://localhost:9000/user/hadoop/", "hdfs://localhost:9000/user/hadoop/merge.txt"); merge.doMerge(); } }4. 编译运行程序 在开始编译运行程序之前,请一定确保Hadoop已经启动运行,如果还没有启动,需要打开一个Linux终端,输入以下命令启动Hadoop:cd /usr/local/hadoop ./sbin/start-dfs.sh然后,要确保HDFS的“/user/hadoop”目录下已经存在file1.txt、file2.txt、file3.txt、file4.abc和file5.abc,每个文件里面有内容。这里,假设文件内容如下:file1.txt的内容是: this is file1.txtfile2.txt的内容是: this is file2.txtfile3.txt的内容是: this is file3.txtfile4.abc的内容是: this is file4.abcfile5.abc的内容是: this is file5.abc现在就可以编译运行上面编写的代码。可以直接点击Eclipse工作界面上部的运行程序的快捷按钮,当把鼠标移动到该按钮上时,在弹出的菜单中选择“Run As”,继续在弹出来的菜单中选择“Java Application”,如下图所示。然后,会弹出如下图所示界面。在该界面中,点击界面右下角的“OK”按钮,开始运行程序。程序运行结束后,会在底部的“Console”面板中显示运行结果信息(如下图所示)。同时,“Console”面板中还会显示一些类似“log4j:WARN…”的警告信息,可以不用理会。如果程序运行成功,这时,可以到HDFS中查看生成的merge.txt文件,比如,可以在Linux终端中执行如下命令:cd /usr/local/hadoop ./bin/hdfs dfs -ls /user/hadoop ./bin/hdfs dfs -cat /user/hadoop/merge.txt可以看到如下结果:this is file1.txtthis is file2.txtthis is file3.txt 5. 应用程序的部署 下面介绍如何把Java应用程序生成JAR包,部署到Hadoop平台上运行。首先,在Hadoop安装目录下新建一个名称为myapp的目录,用来存放我们自己编写的Hadoop应用程序,可以在Linux的终端中执行如下命令:cd /usr/local/hadoop mkdir myapp然后,请在Eclipse工作界面左侧的“Package Explorer”面板中,在工程名称“HDFSExample”上点击鼠标右键,在弹出的菜单中选择“Export”,如下图所示。然后,会弹出如下图所示界面。在该界面中,选择“Runnable JAR file”,然后,点击“Next>”按钮,弹出如下图所示界面。在该界面中,“Launch configuration”用于设置生成的JAR包被部署启动时运行的主类,需要在下拉列表中选择刚才配置的类“MergeFile-HDFSExample”。在“Export destination”中需要设置JAR包要输出保存到哪个目录,比如,这里设置为“/usr/local/hadoop/myapp/HDFSExample.jar”。在“Library handling”下面选择“Extract required libraries into generated JAR”。然后,点击“Finish”按钮,会出现如下图所示界面。可以忽略该界面的信息,直接点击界面右下角的“OK”按钮,启动打包过程。打包过程结束后,会出现一个警告信息界面,如下图所示。可以忽略该界面的信息,直接点击界面右下角的“OK”按钮。至此,已经顺利把HDFSExample工程打包生成了HDFSExample.jar。可以到Linux系统中查看一下生成的HDFSExample.jar文件,可以在Linux的终端中执行如下命令:cd /usr/local/hadoop/myapp ls可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个HDFSExample.jar文件。由于之前已经运行过一次程序,已经生成了merge.txt,因此,需要首先执行如下命令删除该文件:cd /usr/local/hadoop ./bin/hdfs dfs -rm /user/hadoop/merge.txt现在,就可以在Linux系统中,使用hadoop jar命令运行程序,命令如下:cd /usr/local/hadoop ./bin/hadoop jar ./myapp/HDFSExample.jar上面程序执行结束以后,可以到HDFS中查看生成的merge.txt文件,比如,可以在Linux终端中执行如下命令:cd /usr/local/hadoop ./bin/hdfs dfs -ls /user/hadoop ./bin/hdfs dfs -cat /user/hadoop/merge.txt可以看到如下结果:this is file1.txtthis is file2.txtthis is file3.txt附录:自己练习用的代码文件 1.写入文件 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Path; public class Chapter3 { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); byte[] buff = "Hello world".getBytes(); // 要写入的内容 String filename = "test"; //要写入的文件名 FSDataOutputStream os = fs.create(new Path(filename)); os.write(buff,0,buff.length); System.out.println("Create:"+ filename); os.close(); fs.close(); } catch (Exception e) { e.printStackTrace(); } } }2.判断文件是否存在 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class Chapter3 { public static void main(String[] args) { try { String filename = "test"; Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); if(fs.exists(new Path(filename))){ System.out.println("文件存在"); }else{ System.out.println("文件不存在"); } fs.close(); } catch (Exception e) { e.printStackTrace(); } } } 3.读取文件 import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FSDataInputStream; public class Chapter3 { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); Path file = new Path("test"); FSDataInputStream getIt = fs.open(file); BufferedReader d = new BufferedReader(new InputStreamReader(getIt)); String content = d.readLine(); //读取文件一行 System.out.println(content); d.close(); //关闭文件 fs.close(); //关闭hdfs } catch (Exception e) { e.printStackTrace(); } } }
2024年05月31日
111 阅读
0 评论
0 点赞
2024-05-17
Hadoop3.1.3安装教程_单机/伪分布式配置_Hadoop3.1.3/Ubuntu18.04(16.04)
环境 本教程使用 Ubuntu 18.04 64位 作为系统环境(或者Ubuntu 14.04,Ubuntu16.04 也行,32位、64位均可),请自行安装系统(可参考使用VirtualBox安装Ubuntu)。装好了 Ubuntu 系统之后,在安装 Hadoop 前还需要做一些必备工作。创建hadoop用户 如果你安装 Ubuntu 的时候不是用的 "hadoop" 用户,那么需要增加一个名为 hadoop 的用户。首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 :sudo useradd -m hadoop -s /bin/bashShell 命令这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。sudo命令: 本文中会大量使用到sudo命令。sudo是ubuntu中一种权限管理机制,管理员可以授权给一些普通用户去执行一些需要root权限执行的操作。当使用sudo命令时,就需要输入您当前用户的密码.密码:在Linux的终端中输入密码,终端是不会显示任何你当前输入的密码,也不会提示你已经输入了多少字符密码。而在windows系统中,输入密码一般都会以“*”表示你输入的密码字符输入法中英文切换: ubuntu中终端输入的命令一般都是使用英文输入。linux中英文的切换方式是使用键盘“shift”键来切换,也可以点击顶部菜单的输入法按钮进行切换。ubuntu自带的Sunpinyin中文输入法已经足够读者使用。Ubuntu终端复制粘贴快捷键: 在Ubuntu终端窗口中,复制粘贴的快捷键需要加上 shift,即粘贴是 ctrl+shift+v。接着使用如下命令设置密码,可简单设置为 hadoop,按提示输入两次密码:sudo passwd hadoopShell 命令可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题: sudo adduser hadoop sudoShell 命令最后注销当前用户(点击屏幕右上角的齿轮,选择注销),返回登陆界面。在登陆界面中选择刚创建的 hadoop 用户进行登陆。更新apt 用 hadoop 用户登录后,我们先更新一下 apt,后续我们使用 apt 安装软件,如果没更新可能有一些软件安装不了。按 ctrl+alt+t 打开终端窗口,执行如下命令:sudo apt-get updateShell 命令若出现如下 "Hash校验和不符" 的提示,可通过更改软件源来解决。若没有该问题,则不需要更改。从软件源下载某些软件的过程中,可能由于网络方面的原因出现没法下载的情况,那么建议更改软件源。在学习Hadoop过程中,即使出现“Hash校验和不符”的提示,也不会影响Hadoop的安装。Ubuntu更新软件源时遇到Hash校验和不符的问题首先点击左侧任务栏的【系统设置】(齿轮图标),选择【软件和更新】Ubuntu更新软件源点击 “下载自” 右侧的方框,选择【其他节点】Ubuntu更新软件源-选择服务器在列表中选中【mirrors.aliyun.com】,并点击右下角的【选择服务器】,会要求输入用户密码,输入即可。Ubuntu更新软件源-选择服务器接着点击关闭。Ubuntu更新软件源-关闭窗口此时会提示列表信息过时,点击【重新载入】,Ubuntu更新软件源-重新载入最后耐心等待更新缓存即可。更新完成会自动关闭【软件和更新】这个窗口。如果还是提示错误,请选择其他服务器节点如 mirrors.163.com 再次进行尝试。更新成功后,再次执行 sudo apt-get update 就正常了。后续需要更改一些配置文件,我比较喜欢用的是 vim(vi增强版,基本用法相同),建议安装一下(如果你实在还不会用 vi/vim 的,请将后面用到 vim 的地方改为 gedit,这样可以使用文本编辑器进行修改,并且每次文件更改完成后请关闭整个 gedit 程序,否则会占用终端):sudo apt-get install vimShell 命令安装软件时若需要确认,在提示处输入 y 即可。通过命令行安装软件 vim的常用模式有分为命令模式,插入模式,可视模式,正常模式。本教程中,只需要用到正常模式和插入模式。二者间的切换即可以帮助你完成本指南的学习。正常模式正常模式主要用来浏览文本内容。一开始打开vim都是正常模式。在任何模式下按下Esc键就可以返回正常模式插入编辑模式插入编辑模式则用来向文本中添加内容的。在正常模式下,输入i键即可进入插入编辑模式退出vim如果有利用vim修改任何的文本,一定要记得保存。Esc键退回到正常模式中,然后输入:wq即可保存文本并退出vim安装SSH、配置SSH无密码登陆集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:sudo apt-get install openssh-serverShell 命令安装后,可以使用如下命令登陆本机:ssh localhostShell 命令此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。SSH首次登陆提示 但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:exit # 退出刚才的 ssh localhost cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost ssh-keygen -t rsa # 会有提示,都按回车就可以 cat ./id_rsa.pub >> ./authorized_keys # 加入授权Shell 命令~的含义: 在 Linux 系统中,~ 代表的是用户的主文件夹,即 "/home/用户名" 这个目录,如你的用户名为 hadoop,则 ~ 就代表 "/home/hadoop/"。 此外,命令中的 # 后面的文字是注释,只需要输入前面命令即可。此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了。SSH无密码登录 安装Java环境手动安装,推荐采用本方式Hadoop3.1.3需要JDK版本在1.8及以上。需要按照下面步骤来自己手动安装JDK1.8。我们已经把JDK1.8的安装包jdk-8u162-linux-x64.tar.gz放在了百度云盘,可以点击这里到百度云盘下载JDK1.8安装包(提取码:ziyu)。请把压缩格式的文件jdk-8u162-linux-x64.tar.gz下载到本地电脑,假设保存在“/home/linziyu/Downloads/”目录下。在Linux命令行界面中,执行如下Shell命令(注意:当前登录用户名是hadoop):cd /usr/lib sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件 cd ~ #进入hadoop用户的主目录 cd Downloads #注意区分大小写字母,刚才已经通过FTP软件把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下 sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下Shell 命令上面使用了解压缩命令tar,如果对Linux命令不熟悉,可以参考常用的Linux命令用法。JDK文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下:cd /usr/lib/jvm lsShell 命令可以看到,在/usr/lib/jvm目录下有个jdk1.8.0_162目录。下面继续执行如下命令,设置环境变量:cd ~ vim ~/.bashrcShell 命令上面命令使用vim编辑器(查看vim编辑器使用方法)打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:source ~/.bashrcShell 命令这时,可以使用如下命令查看是否安装成功:java -versionShell 命令如果能够在屏幕上返回如下信息,则说明安装成功:hadoop@ubuntu:~$ java -versionjava version "1.8.0_162"Java(TM) SE Runtime Environment (build 1.8.0_162-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)至此,就成功安装了Java环境。下面就可以进入Hadoop的安装。安装 Hadoop3.1.3Hadoop安装文件,可以到Hadoop官网下载hadoop-3.1.3.tar.gz。也可以直接点击这里从百度云盘下载软件(提取码:lnwl),进入百度网盘后,进入“软件”目录,找到hadoop-3.1.3.tar.gz文件,下载到本地。我们选择将 Hadoop 安装至 /usr/local/ 中:sudo tar -zxf ~/下载/hadoop-3.1.3.tar.gz -C /usr/local # 解压到/usr/local中 cd /usr/local/ sudo mv ./hadoop-3.1.3/ ./hadoop # 将文件夹名改为hadoop sudo chown -R hadoop ./hadoop # 修改文件权限Shell 命令Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:cd /usr/local/hadoop ./bin/hadoop versionShell 命令相对路径与绝对路径: 请务必注意命令中的相对路径与绝对路径,本文后续出现的 ./bin/...,./etc/... 等包含 ./ 的路径,均为相对路径,以 /usr/local/hadoop 为当前目录。例如在 /usr/local/hadoop 目录中执行 ./bin/hadoop version 等同于执行 /usr/local/hadoop/bin/hadoop version。可以将相对路径改成绝对路径来执行,但如果你是在主文件夹 ~ 中执行 ./bin/hadoop version,执行的会是 /home/hadoop/bin/hadoop version,就不是我们所想要的了。Hadoop单机配置(非分布式) Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。cd /usr/local/hadoop mkdir ./input cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep ./input ./output 'dfs[a-z.]+' cat ./output/* # 查看运行结果Shell 命令执行成功后如下所示,输出了作业的相关信息,输出的结果是符合正则的单词 dfsadmin 出现了1次Hadoop单机模式运行grep的输出结果 注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。rm -r ./outputShell 命令 Hadoop伪分布式配置 Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。修改配置文件 core-site.xml (通过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml),将当中的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://localhost:9000</value> </property> </configuration>XML同样的,修改配置文件 hdfs-site.xml:<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>XMLHadoop配置文件说明: Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。配置完成后,执行 NameNode 的格式化:cd /usr/local/hadoop ./bin/hdfs namenode -formatShell 命令成功的话,会看到 "successfully formatted" 的提示,具体返回信息类似如下:2020-01-08 15:31:31,560 INFO namenode.NameNode: STARTUP_MSG: /**STARTUP_MSG: Starting NameNodeSTARTUP_MSG: host = hadoop/127.0.1.1STARTUP_MSG: args = [-format]STARTUP_MSG: version = 3.1.3*/......2020-01-08 15:31:35,677 INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.2020-01-08 15:31:35,700 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression2020-01-08 15:31:35,770 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 393 bytes saved in 0 seconds .2020-01-08 15:31:35,810 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 02020-01-08 15:31:35,816 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid = 0 when meet shutdown.2020-01-08 15:31:35,816 INFO namenode.NameNode: SHUTDOWN_MSG: /**SHUTDOWN_MSG: Shutting down NameNode at hadoop/127.0.1.1*/如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。接着开启 NameNode 和 DataNode 守护进程。cd /usr/local/hadoop ./sbin/start-dfs.sh #start-dfs.sh是个完整的可执行文件,中间没有空格Shell 命令若出现如下SSH提示,输入yes即可。启动Hadoop时的SSH提示启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable WARN 提示可以忽略,并不会影响正常使用。启动 Hadoop 时提示 Could not resolve hostname:如果启动 Hadoop 时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况,如下图所示:启动Hadoop时的异常提示 这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):export HADOOP_HOME=/usr/local/hadoop export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/nativeShell保存后,务必执行 source ~/.bashrc 使变量设置生效,然后再次执行 ./sbin/start-dfs.sh 启动 Hadoop。启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: "NameNode"、"DataNode" 和 "SecondaryNameNode"(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。通过jps查看启动的Hadoop进程 Hadoop无法正常启动的解决方法: 一般可以查看启动日志来排查原因,注意几点:启动时会提示形如 "DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.out",其中 DBLab-XMU 对应你的机器名,但其实启动日志信息是记录在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以应该查看这个后缀为 .log 的文件;每一次的启动日志都是追加在日志文件之后,所以得拉到最后面看,对比下记录的时间就知道了。一般出错的提示在最后面,通常是写着 Fatal、Error、Warning 或者 Java Exception 的地方。可以在网上搜索一下出错信息,看能否找到一些相关的解决方法。此外,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做):针对 DataNode 没法启动的解决方法cd /usr/local/hadoop ./sbin/stop-dfs.sh # 关闭 rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据 ./bin/hdfs namenode -format # 重新格式化 NameNode ./sbin/start-dfs.sh # 重启Shell 命令成功启动后,可以访问 Web 界面 http://localhost:9870 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。运行Hadoop伪分布式实例 上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:./bin/hdfs dfs -mkdir -p /user/hadoopShell 命令注意: 教材《大数据技术原理与应用》的命令是以"./bin/hadoop dfs"开头的Shell命令方式,实际上有三种shell命令方式。hadoop fshadoop dfshdfs dfshadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统hadoop dfs只能适用于HDFS文件系统hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:./bin/hdfs dfs -mkdir input ./bin/hdfs dfs -put ./etc/hadoop/*.xml inputShell 命令复制完成后,可以通过如下命令查看文件列表:./bin/hdfs dfs -ls inputShell 命令伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'Shell 命令查看运行结果的命令(查看的是位于 HDFS 中的输出结果): ./bin/hdfs dfs -cat output/*Shell 命令结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。Hadoop伪分布式运行grep结果我们也可以将运行结果取回到本地:rm -r ./output # 先删除本地的 output 文件夹(如果存在) ./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹拷贝到本机 cat ./output/*Shell 命令Hadoop 运行程序时,输出目录不能存在,否则会提示错误 "org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists" ,因此若要再次执行,需要执行如下命令删除 output 文件夹:./bin/hdfs dfs -rm -r output # 删除 output 文件夹Shell 命令运行程序时,输出目录不能存在: 运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:Configuration conf = new Configuration();Job job = new Job(conf);/ 删除输出目录 /Path outputPath = new Path(args[1]);outputPath.getFileSystem(conf).delete(outputPath, true);Java若要关闭 Hadoop,则运行./sbin/stop-dfs.shShell 命令注意: 下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh 就可以!安装Hadoop集群在平时的学习中,我们使用伪分布式就足够了。
2024年05月17日
156 阅读
0 评论
2 点赞
2024-04-26
此内容被密码保护
加密文章,请前往内页查看详情
2024年04月26日
94 阅读
0 评论
9 点赞
2024-04-11
分布式机器学习
分布式机器学习涉及将机器学习算法的训练过程分布到多个计算资源上,以加快训练速度并处理大规模数据集。这个过程中涉及多个核心概念和技术,以下是一些主要知识点:1. 分布式架构 参数服务器(Parameter Server):一种常用的分布式训练架构,其中模型参数在一个或多个参数服务器上维护,而工作节点负责计算梯度。环形All-reduce(Ring All-reduce):一种高效的数据汇总技术,用于在工作节点间同步更新模型参数,适用于大规模并行训练。 2. 数据和模型并行性 数据并行(Data Parallelism):每个节点拷贝完整模型,但只处理数据的一个子集,之后同步更新模型参数。模型并行(Model Parallelism):模型的不同部分分布在不同的节点上,每个节点只处理模型的一部分。 3. 同步与异步更新 同步SGD(Synchronous SGD):所有工作节点在更新模型参数前,必须等待所有其他节点完成计算,以保持参数同步。异步SGD(Asynchronous SGD):每个工作节点更新模型参数无需等待其他节点,可以减少等待时间,但可能导致更新冲突。 4. 优化策略和技巧 梯度累积(Gradient Accumulation):在执行参数更新前累积多个小批量(mini-batch)的梯度,用于平衡计算和通信开销。梯度压缩(Gradient Compression):减少在节点间传输的数据量,通过压缩梯度以加速通信。容错机制(Fault Tolerance):在分布式训练过程中,处理节点故障和网络问题的能力。 5. 框架和工具TensorFlow描述:由Google开发的开源机器学习库,支持分布式训练。特点:强大的计算图抽象。广泛的API支持,包括Python和C++。提供了tf.distribute.StrategyAPI来简化分布式训练。支持多种硬件,包括CPU、GPU和TPU。PyTorch描述:由Facebook开发的开源机器学习库,支持动态计算图。特点:动态计算图使得模型易于调试和理解。torch.distributed包提供了分布式训练的支持。拥有活跃的社区和丰富的库资源。支持GPU加速。Apache Spark MLlib描述:基于Apache Spark的大规模机器学习库。特点:设计用于大规模数据处理的分布式计算框架。提供了数据预处理、特征提取、模型评估等丰富的机器学习算法。可以在Hadoop生态系统中使用,支持多种数据源。Horovod描述:由Uber开源的分布式训练框架,以TensorFlow、Keras、PyTorch和Apache MXNet为后端。特点:通过简单的几行代码改动,就可以实现分布式训练。使用环形All-reduce算法高效地同步梯度。支持在多个GPU和多个节点上训练。Dask-ML描述:基于Dask的并行计算库,用于扩展Scikit-learn等Python科学计算库。特点:支持大规模数据集的并行计算。与Pandas、NumPy、Scikit-learn等库紧密集成。可以在单机多核或分布式集群上运行。Microsoft CNTK描述:微软认知工具包(Cognitive Toolkit)是一个深度学习框架,支持分布式训练。特点:高性能的深度学习框架。支持RNN、CNN和LSTM等模型。提供了丰富的例子和教程。H2O描述:一个开源的、分布式的机器学习平台。特点:提供自动化的机器学习(AutoML)功能。支持广泛的统计和机器学习算法。提供了易于使用的Web界面和REST API。这些框架各有特点,选择哪个框架取决于具体的应用场景、团队的技能和项目的需求。在进行分布式机器学习项目时,了解每个框架的优势和局限性对于构建高效、可扩展的解决方案至关重要。 6. 应用场景 大规模数据处理:分布式训练可以有效处理超出单个计算资源内存限制的大数据集。复杂模型训练:对于参数量巨大的深度学习模型,分布式训练可以加速训练过程。分布式机器学习是解决大规模数据分析和复杂模型训练的关键技术。了解上述知识点有助于在实际应用中设计和实施有效的分布式机器学习解决方案。要实现一个分布式机器学习示例,我们可以使用TensorFlow和它的tf.distribute.Strategy API来演示数据并行。下面的代码示例将演示如何使用tf.distribute.MirroredStrategy来在多个GPU上进行简单的模型训练。这种策略适用于单机多GPU环境,它会在所有可用的GPU上复制模型,并在每个步骤中同步更新模型的参数。首先,确保你的环境中安装了TensorFlow。如果未安装,可以通过运行pip install tensorflow来安装。import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.optimizers import Adam # 加载MNIST数据集 (train_images, train_labels), (test_images, test_labels) = mnist.load_data() # 数据预处理 train_images = train_images / 255.0 test_images = test_images / 255.0 # 定义一个简单的序贯模型 def create_model(): model = Sequential([ Flatten(input_shape=(28, 28)), Dense(128, activation='relu'), Dense(10) ]) model.compile(optimizer=Adam(), loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) return model # 使用MirroredStrategy进行分布式训练 strategy = tf.distribute.MirroredStrategy() print('Number of devices: {}'.format(strategy.num_replicas_in_sync)) # 创建和编译模型 with strategy.scope(): model = create_model() # 训练模型 model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels)) 在这个例子中,tf.distribute.MirroredStrategy 自动处理了数据的分发到各个GPU,模型的复制以及梯度的汇总和应用。这使得在多个GPU上进行模型训练变得非常简单。请注意,执行分布式训练需要有多个GPU。如果你在没有多个GPU的环境(例如,普通笔记本电脑)中运行上述代码,它仍然会工作,但实际上并不是在进行分布式训练。在有多个GPU的环境中,你会看到加速效果。此代码示例提供了一个基本的分布式训练的入门点。根据你的具体需求和环境配置,可能还需要进行一些调整。
2024年04月11日
161 阅读
0 评论
3 点赞
2024-04-07
第10章深度学习之神经网络主要知识点
深度学习是机器学习的一个分支,它利用深度神经网络来模拟人脑的处理方式,以解决复杂的模式识别和信号处理问题。深度神经网络包含多层处理单元,能够从大量数据中学习表示和特征。以下是深度学习中涉及的一些核心神经网络知识点:1. 基本概念 神经元:神经网络的基本单位,模拟生物神经元的功能。权重和偏置:神经元的参数,用于控制输入数据如何转换为输出。激活函数:引入非线性因素,使网络能够学习复杂的模式,常见的激活函数包括ReLU、Sigmoid和Tanh。 2. 网络结构 前馈神经网络(Feedforward Neural Networks):数据在这种网络中只向前传递。卷积神经网络(CNNs):特别适合图像处理,通过卷积层自动提取空间特征。循环神经网络(RNNs):适用于序列数据处理,如语言模型和时间序列分析,能够处理前后数据点之间的依赖关系。长短期记忆网络(LSTMs)和门控循环单元(GRUs):RNN的变体,解决了传统RNN在处理长序列数据时的梯度消失或爆炸问题。 3. 训练神经网络 损失函数:评估模型的预测值与实际值之间的差异,常见的有均方误差、交叉熵等。优化算法:用于最小化(或最大化)损失函数,以训练模型的参数,包括梯度下降、随机梯度下降(SGD)、Adam等。反向传播:一种高效计算梯度的技术,用于在网络中传播误差,并更新权重和偏置。 4. 正则化和避免过拟合 过拟合:模型在训练数据上表现很好,但在新数据上表现差。正则化技术:如L1和L2正则化、Dropout、批量归一化(Batch Normalization),用于减少过拟合,提高模型的泛化能力。 5. 深度学习框架 TensorFlow和Keras:Google开发的开源框架,支持灵活的研究和高效的生产部署。PyTorch:Facebook的开源框架,以其动态计算图和易用性受到广泛欢迎。 6. 应用领域 计算机视觉:图像分类、对象检测、图像生成等。自然语言处理:语言翻译、情感分析、文本生成等。声音处理:语音识别、音乐生成等。深度学习是一个快速发展的领域,不断有新的研究和技术出现。掌握上述基础知识点将有助于深入理解和应用深度学习。
2024年04月07日
229 阅读
2 评论
1 点赞
1
2
3
4
...
11