工作时间:24小时
联系人:王经理
电话:18602154110
发布日期:2019/3/14 18:30:30 访问次数:696
Hadoop是一款开源的大数据通用处理平台,其提供了分布式存储和分布式离线计算,适合大规模数据、流式数据(写一次,读多次),不适合低延时的访问、大量的小文件以及频繁修改的文件。
*Hadoop由HDFS、YARN、MapReduce组成。
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
Hadoop的特点:
Hadoop的使用场景:
Hadoop生态圈:
2.内部结构
2.1 HDFS
HDFS是分布式文件系统,存储海量的文件,其中HDFS中包含NameNode、DataNode、SecondaryNameNode组件等。
Block数据块
DataNode
NameNode
*NameNode不允许DataNode具有同一个Block的多个副本,所以创建的最大副本数量是当时DataNode的总数。
*DataNode会定期向NameNode发送心跳信息,一旦在一定时间内NameNode没有接收到DataNode发送的心跳则认为其已经宕机,因此不会再给它任何IO请求。
*如果DataNode失效造成副本数量下降并且低于预先设置的阈值或者动态增加副本数量,则NameNode会在合适的时机重新调度DataNode进行复制。
SecondaryNameNode
HDFS写入文件的流程
*当写入某个DataNode失败时,数据会继续写入其他的DataNode,NameNode会重新寻找DataNode继续复制,以保证数据的可靠性。
*每个Block都会有一个校验码并存放在独立的文件中,以便读的时候来验证数据的完整性。
*文件写入完毕后,向NameNode发送确认请求,此时文件才可见,如果发送确认请求之前NameNode宕机,那么文件将会丢失,HDFS客户端无法进行读取。
HDFS读取文件的流程
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
机架感知
分布式集群中通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群。
机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。
Hadoop默认没有开启机架感知功能,默认情况下每个Block都是随机分配DataNode,需要进行相关的配置,那么在NameNode启动时,会将机器与机架的对应信息保存在内存中,用于在HDFS Client申请写文件时,能够根据预先定义的机架关系合理的分配DataNode。
Hadoop机架感知默认对3个副本的存放策略为:
*使用此策略可以保证对文件的访问能够优先在本机架下找到,并且如果整个机架上发生了异常也可以在另外的机架上找到该Block的副本。
2.2 YARN
YARN是分布式资源调度框架(任务计算框架的资源调度框架),主要负责集群中的资源管理以及任务调度并且监控各个节点。
ResourceManager
NodeManager
ApplicationMaster
任务运行在YARN的流程
客户端提交任务请求到ResourceManager。
2.3 MapReduce
MapReduce是分布式离线并行计算框架,高吞吐量,高延时,原理是将分析的数据拆分成多份,通过多台节点并行处理,相对于Storm、Spark任务计算框架而言,MapReduce是最早出现的计算框架。
MapReduce、Storm、Spark任务计算框架对比:
MapReduce执行流程
MapReduce将程序划分为Map任务以及Reduce任务两部分。
Map任务处理流程
*处理的文件必须要在HDFS中。
Reduce任务处理流程
3.Hadoop的使用
3.1 安装
由于Hadoop使用Java语言进行编写,因此需要安装JDK。
从CDH中下载Hadoop 2.X并进行解压,CDH是Cloudrea公司对各种开源框架的整合与优化(较稳定)
etc目录
bin目录
sbin目录
3.2 Hadoop配置
1.配置环境
编辑etc/hadoop/hadoop-env.sh文件,修改JAVA_HOME配置项为本地JAVA的HOME目录,此文件是Hadoop启动时加载的环境变量。
编辑/etc/hosts文件,添加主机名与IP的映射关系。
2.配置Hadoop公共属性(core-site.xml)
- <configuration>
- <!-- Hadoop工作目录,用于存放Hadoop运行时产生的临时数据 -->
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/usr/hadoop/hadoop-2.9.0/data</value>
- </property>
- <!-- NameNode的通信地址,1.x默认9000,2.x可以使用8020 -->
- <property>
- <name>fs.default.name</name>
- <value>hdfs://192.168.1.80:8020</value>
- </property>
- </configuration>
3.配置HDFS(hdfs-site.xml)
- <configuration>
- <!--指定block的副本数量(将block复制到集群中备份数-1个节点的DataNode中)-->
- <property>
- <name>dfs.replication</name>
- <value>1</value>
- </property>
- <!-- 关闭HDFS的访问权限 -->
- <property>
- <name>dfs.permissions.enabled</name>
- <value>false</value>
- </property>
- </configuration>
4.配置YARN(yarn-site.xml)
- <configuration>
- <!-- 配置Reduce取数据的方式是shuffle(随机) -->
- <property>
- <name>yarn.nodemanager.aux-services</name>
- <value>mapreduce_shuffle</value>
- </property>
- </configuration>
5.配置MapReduce(mapred-site.xml)
- <configuration>
- <!-- 让MapReduce任务使用YARN进行调度 -->
- <property>
- <name>mapreduce.framework.name</name>
- <value>yarn</value>
- </property>
- </configuration>
6.配置SSH
由于在启动hdfs、yarn时都需要对用户的身份进行验证,因此可以配置SSH设置免密码登录。
- //生成秘钥
- ssh-keygen -t rsa
- //复制秘钥到本机
- ssh-copy-id 192.168.1.80
3.3 启动HDFS
1.格式化NameNode
2.启动HDFS,将会启动NameNode、DataNode、SecondaryNameNode三个进程,可以通过jps命令进行查看。
*若启动时出现错误,则可以进入logs目录查看相应的日志文件。
当HDFS启动完毕后,可以访问http://localhost:50070进入HDFS的可视化管理界面,可以在此页面中监控整个HDFS集群的状况并且进行文件的上传以及下载。
*进入HDFS监控页面下载文件时,会将请求重定向,重定向后的地址的主机名为NameNode的主机名,因此客户端本地的host文件中需要配置NameNode主机名与IP的映射关系。
3.4 启动YARN
启动YARN后,将会启动ResourceManager以及NodeManager进程,可以通过jps命令进行查看。
当YARN启动完毕后,可以访问http://localhost:8088进入YARN的可视化管理界面,可以在此页面中查看任务的执行情况以及资源的分配。
3.5 使用Shell命令操作HDFS
HDFS中的文件系统与Linux类似,由/代表根目录。
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
- hadoop fs -cat <src>:显示文件中的内容。
- hadoop fs -copyFromLocal <localsrc> <dst>:将本地中的文件上传到HDFS。
- hadoop fs -copyToLocal <src> <localdst>:将HDFS中的文件下载到本地。
- hadoop fs -count <path>:查询指定路径下文件的个数。
- hadoop fs -cp <src> <dst>:在HDFS内对文件进行复制。
- hadoop fs -get <src> <localdst>:将HDFS中的文件下载到本地。
- hadoop fs -ls <path>:显示指定目录下的内容。
- hadoop fs -mkdir <path>:创建目录。
- hadoop fs -moveFromLocal <localsrc> <dst>:将本地中的文件剪切到HDFS中。
- hadoop fs -moveToLocal <src> <localdst> :将HDFS中的文件剪切到本地中。
- hadoop fs -mv <src> <dst> :在HDFS内对文件进行移动。
- hadoop fs -put <localsrc> <dst>:将本地中的文件上传到HDFS。
- hadoop fs -rm <src>:删除HDFS中的文件。
3.6 JAVA中操作HDFS
- /**
- * @Auther: ZHUANGHAOTANG
- * @Date: 2018/11/6 11:49
- * @Description:
- */
- public class HDFSUtils {
- private static Logger logger = LoggerFactory.getLogger(HDFSUtils.class);
- /**
- * NameNode URL
- */
- private static final String NAMENODE_URL = "192.168.1.80:8020";
- /**
- * HDFS文件系统连接对象
- */
- private static FileSystem fs = null;
- static {
- Configuration conf = new Configuration();
- try {
- fs = FileSystem.get(URI.create(NAMENODE_URL), conf);
- } catch (IOException e) {
- logger.info("初始化HDFS连接失败:{}", e);
- }
- }
- /**
- * 创建目录
- */
- public static void mkdir(String dir) throws Exception {
- dir = NAMENODE_URL + dir;
- if (!fs.exists(new Path(dir))) {
- fs.mkdirs(new Path(dir));
- }
- }
- /**
- * 删除目录或文件
- */
- public static void delete(String dir) throws Exception {
- dir = NAMENODE_URL + dir;
- fs.delete(new Path(dir), true);
- }
- /**
- * 遍历指定路径下的目录和文件
- */
- public static List<String> listAll(String dir) throws Exception {
- List<String> names = new ArrayList<>();
- dir = NAMENODE_URL + dir;
- FileStatus[] files = fs.listStatus(new Path(dir));
- for (FileStatus file : files) {
- if (file.isFile()) { //文件
- names.add(file.getPath().toString());
- } else if (file.isDirectory()) { //目录
- names.add(file.getPath().toString());
- } else if (file.isSymlink()) { //软或硬链接
- names.add(file.getPath().toString());
- }
- }
- return names;
- }
- /**
- * 上传当前服务器的文件到HDFS中
- */
- public static void uploadLocalFileToHDFS(String localFile, String hdfsFile) throws Exception {
- hdfsFile = NAMENODE_URL + hdfsFile;
- Path src = new Path(localFile);
- Path dst = new Path(hdfsFile);
- fs.copyFromLocalFile(src, dst);
- }
- /**
- * 通过流上传文件
- */
- public static void uploadFile(String hdfsPath, InputStream inputStream) throws Exception {
- hdfsPath = NAMENODE_URL + hdfsPath;
- FSDataOutputStream os = fs.create(new Path(hdfsPath));
- BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
- byte[] data = new byte[1024];
- int len;
- while ((len = bufferedInputStream.read(data)) != -1) {
- if (len == data.length) {
- os.write(data);
- } else { //最后一次读取
- byte[] lastData = new byte[len];
- System.arraycopy(data, 0, lastData, 0, len);
- os.write(lastData);
- }
- }
- inputStream.close();
- bufferedInputStream.close();
- os.close();
- }
- /**
- * 从HDFS中下载文件
- */
- public static byte[] readFile(String hdfsFile) throws Exception {
- hdfsFile = NAMENODE_URL + hdfsFile;
- Path path = new Path(hdfsFile);
- if (fs.exists(path)) {
- FSDataInputStream is = fs.open(path);
- FileStatus stat = fs.getFileStatus(path);
- byte[] data = new byte[(int) stat.getLen()];
- is.readFully(0, data);
- is.close();
- return data;
- } else {
- throw new Exception("File Not Found In HDFS");
- }
- }
- }
3.7 执行一个MapReduce任务
Hadoop中提供了hadoop-mapreduce-examples-2.9.0.jar,其封装了一些任务计算方法,可以直接进行调用。
*使用hadoop jar命令执行JAR包。
1.创建一个文件,将此文件上传到HDFS中。
2.使用Hadoop提供的hadoop-mapreduce-examples-2.9.0.jar执行wordcount词频统计功能,然后在YARN管理页面中进行查看。
YARN管理页面中可以查看任务的执行进度:
3.当任务执行完毕后,可以查看任务的执行结果。
*任务的执行结果将会放到HDFS的文件中。
上一信息:大数据安全防护方法研究与建议
下一信息:主编及运维人员设置权限和实时管理功能。