大数据时代已经到来,越来越多的行业面临着大量数据需要存储以及分析的挑战。Hadoop,作为一个开源的分布式并行处理平台,以其高扩展、高效率、高可靠等优点,得到越来越广泛的应用。本课旨在培养学员理解Hadoop的架构设计以及掌握Hadoop的运用能力。
Hadoop大数据平台架构与实践
Hadoop是解决大数据的分布式集成架构。
当数据达到一定规模时,单机的存储和分析就变得非常困难,存储量和效率都无法达到用户的需求。
所以,为了解决大数据的存储和处理,Google提出了三大技术:
Hadoop是模仿Google三大技术的开源实现。相比于Google之前的解决方案,它有如下优势:
创作者以他儿子一个黄色的玩具小象命名
是一个开源的、分布式存储和分布式计算平台
搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务。
注:和传统的关系型数据库的区别是放弃事务特性,追求更高的扩展、和HDFS的区别就是habse提供数据的随机读写和实时访问,实现对表数据的读写功能
两种方式:
Linux 下下载安装JDK (centos)
//1、下载 : yum install java-1.7.0-openjdk //查看可升级下载的软件包 yum search java|grep jdk //2、配置环境变量: vim /etc/profile export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH //3、让配置生效 source /etc/profile //4、测试 java -version
注解: 1.Linux下用冒号 : 分割路径 2.$PATH / $JAVA_HOME / $JRE_HOME 是用来引用原来环境变量的值,在设置环境变量时不能把原来的值给覆盖掉 3.$CLASSPATH 中 当前目录 “.”不能丢 4.export 是把这4个变量导出为全局变量
//1、hadoop-env.sh 配置java 环境变量的地址 export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 //2、 core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <value>/hadoop</value> </property> </configuration> <property> <name>dfs.name.dir</name> <value>/hadoop/name</value> </property> <property> <name>fs.default.name</name> <value>hdfs://imooc:9000</value> </property> //3、hdfs-site.xml配置 <property> <name>dfs.data.dir</name> <value>/hadoop/data</value> </property> //4、mapred-site.xml配置 <property> <name>mapred.job.tracker</name> <value>imooc:9001</value> </property>
vim /etc/profile 添加hadoop的HADOOP_PATH export HADOOP_PATH="安装目录" PATH里面添加$HADOOP_HOME/bin:$PATH //让配置生效 source /etc/profile //测试是否安装成功 hadoop
//对namenode 进行格式化 $ hadoop namenode -format;
// 查看hadoop文件系统下下有哪些文件 hadoop fs -ls
HDFS的文件被分成块进行存储,HDFS块默认大小是64MB,块是整个文件存储处理的逻辑单元。
HDFS最终体系结构:由block、namenode、datanode、secondarynamenode、client组成。
为保证硬件上的容错,数据块有多份冗余。
hadoop namenode -format #格式化namenode hadoop fs -ls / #打印 / 目录文件列表 hadoop fs -mkdir input #创建目录 input hadoop fs -put hadoop-env.sh input/ #上传文件 hadoop-env.sh 到 input 目录下 hadoop fs -get input/abc.sh hadoop-envcomp.sh #从 input 目录中下载文件 hadoop fs -cat input/hadoop-env.sh #查看文件 input/hadoop-env.sh hadoop dfsadmin -report #dfs报告
eg:做统计的时候,把统计的文件拆分,然后分别统计每一个数据出现的次数,然后合并拆分项,就可以统计每一个数据出现的总次数。
MapReduce处理数据过程主要分成2个阶段:Map阶段和Reduce阶段。首先执行Map阶段,再执行Reduce阶段。Map和Reduce的处理逻辑由用户自定义实现,但要符合MapReduce框架的约定。
正式执行Map前,需要将输入数据进行”分片”。所谓分片,就是将输入数据切分为大小相等的数据块,每一块作为单个Map Worker的输入被处理,以便于多个Map Worker同时工作。分片完毕后,多个Map Worker就可以同时工作了。每个Map Worker在读入各自的数据后,进行计算处理,最终输出给Reduce。Map Worker在输出数据时,需要为每一条输出数据指定一个Key。这个Key值决定了这条数据将会被发送给哪一个Reduce Worker。Key值和Reduce Worker是多对一的关系,具有相同Key的数据会被发送给同一个Reduce Worker,单个Reduce Worker有可能会接收到多个Key值的数据。
在进入Reduce阶段之前,MapReduce框架会对数据按照Key值排序,使得具有相同Key的数据彼此相邻。如果用户指定了”合并操作”(Combiner),框架会调用Combiner,将具有相同Key的数据进行聚合。Combiner的逻辑可以由用户自定义实现。这部分的处理通常也叫做”洗牌”(Shuffle)。
接下来进入Reduce阶段。相同的Key的数据会到达同一个Reduce Worker。同一个Reduce Worker会接收来自多个Map Worker的数据。每个Reduce Worker会对Key相同的多个数据进行Reduce操作。最后,一个Key的多条数据经过Reduce的作用后,将变成了一个值。
//(1)启动hadoop start -all.sh //(2)rz把某某.java类放到根目录下/opt/根目录下边或者根目录下任意文件 cd /mkdir project_hadoop/ rz 类路径添加 //(3)cd 新创建的文件,创建file1和file2 mkdir input vi file1 vi file2 ls project_hadoop //(4)创建文件 hadoop fs -mkdir input_wordcount //(5)创建目录: hadoop fs -mkdir input //查看文件: hadoop fs -ls hadoop fs -ls input_wordcount //(6)把file1和file2文件放到input_wordcount 提交输入文件给hadoop hadoop fs -put 文件路径 提交后的路径 //例: hadoop fs -put input/input_wordcount/ //(7)查看文件 hadoop fs -ls input_wordcount fs -cat input_wordcount/file1 fs -cat input_wordcount/file2 //(8)编译java文件 javac -classpath /opt/hadoop-1.2.1/hadoop-core-1.2.1.jar:/opt/hadoop-1.2.1/lib/commons-cli-1.2.jar -d 编译后地址 编译文件 //(9)打包指令 jar -cvf 打包后文件名.jar 某某.class jar -cvf wordcount.jar *.class //(10)提交jar给hadoop执行 hadoop jar jar包路径 执行的主函数名(主类名,main方法所在类名) 输入目录名 输出目录名 //例: hadoop jar project_hadoop/wordcount.jar WordCount input_wordcount output_wordcount //(11)查看通过算法计算出单词个数的结果 fs -cat output_wordcount/part-r-00000