第一部分 :Hadoop配置 (需要jdk)
1.环境变量部分
关闭防火墙
chkconfig iptables off //修改完毕后,需要重启
环境变量 JAVA_HOME 和 HADOOP_HOME 和 各自的bin
/etc/profile //修改完毕后,记得执行 source /etc/profile
vi reset.sh 创建ip生成脚本 并运行
me=$(cat /etc/udev/rules.d/70-persistent-net.rules |grep -oP '(?<=NAME=").*(?=")'|tail -1)
mac=$(cat /etc/udev/rules.d/70-persistent-net.rules |grep -oP '(?<=ATTR{address}==").*?(?=",)'|tail -1)
sed -i s/DEVICE.*/DEVICE=${name}/ /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i s/HWADDR=.*/HWADDR=${mac}/ /etc/sysconfig/network-scripts/ifcfg-eth0
service network restart
运行以下命令关闭safe mode:
hadoop dfsadmin -safemode leave
修改hostname
/etc/sysconfig/network
修改主机名映射
/etc/hosts
2.hadoop文件中的配置文件
hadoop-env.sh、mapred-env.sh、yarn-env.sh文件中的JDK路径:
export JAVA_HOME="/opt/modules/jdk1.7.0_67"
配置core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:8020</value> //fs.defaultFS为NameNode的地址
</property>
<property>
<name>hadoop.tmp.dir</name> //hadoop.tmp.dir为hadoop临时目录的地址(不存在需要先创建)
<value>/opt/modules/app/hadoop-2.5.0/data/tmp</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop03:50090</value> //指定secondaryNameNode
</property>
</configuration>
配置slaves 指定HDFS上的DataNode
[hadoop@bigdata-senior01 hadoop-2.5.0]$ vim etc/hadoop/slaves
bigdata-senior01.chybinmy.com
bigdata-senior02.chybinmy.com
bigdata-senior03.chybinmy.com
配置yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name> //resourcemanager服务器指向hadoop02
<value>hadoop02</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name> //启用日志聚集功能
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name> //日志在HDFS上保存时间
<value>106800</value>
</property>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value> //设置mapreduce任务运行在yarn上
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value> // 设置mapreduce的历史服务
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value> //设置历史服务器的web页面地址和端口号
</property>
</configuration>
3.免密登录 scp命令可执行
ssh-keygen -t rsa
yum -y install openssh-server openssh-clients
[hadoop@hadoop01]$ ssh-copy-id hadoop01
[hadoop@hadoop02]$ ssh-copy-id hadoop02
[hadoop@hadoop03]$ ssh-copy-id hadoop03
4.格式NameNode
/opt/modules/app/hadoop-2.5.0/bin/hdfs namenode –format
5.启动集群命令 网页50070
start-dfs.sh //hdfs
start-yarn.sh //yarn
mr-jobhistory-daemon.sh start historyserver //历史服务
第二部分 HDFS
1.简说原理
hdfs的存: namenode收到数据 根据128M分割成若干块 并寻找存活的三个(假如要拷贝三分)datanode之一进行一块
传输并由这个节点依次传向下一个节点 当收到所有节点发出成功信号后 namenode会关闭这次流操作 一次写入数据结束
hdfs的取:hdfs的取相对简答 在namenode发出请求后 在datenode里会发送文件的所有块的储存位置 然后namenode收到信息后会按顺序下载
hdfs的故障检测:
2.hadoop的shell命令操作
在shell里 文件操作为 hadoop fs -命令 /地址
3.java api操作HDFS
System.setProperty("HADOOP_USER_NAME", "root") ; 设定用户为root
同大多数的api操作一样 需要设置conf
conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.47.140:8020");
fileSystem = FileSystem.get(conf);
//从本地下载到hdfs
fileSystem.copyFromLocalFile(new Path("d:/mylog.log"), new Path("/mylog.log.copy"));
//从hdfs下载到本地
fileSystem.copyToLocalFile(true, new Path("/mylog.log.copy"), new Path("d:/zz.log"), true); 第一个参数表示是否删除源文件,即:剪切+粘贴
最后一个参数表示是否使用本地文件系统,不使用的话会使用io
//创建文件夹 可以是多层
fileSystem.mkdirs(new Path("/djhot/cls"));
//true表示递归
fileSystem.delete(new Path("/djhot"),true);
//列出所有文件信息 返回文件迭代对象
fileSystem.listFiles(new Path("/wordcount"), true);//true表示递归
//列出指定目录下的文件夹或文件 并不会递归
fileSystem.listStatus(new Path("/wordcount"));
//文件上传
FSDataOutputStream outputStream = fileSystem.create(new Path("/liushishi.love"), true);//有就覆盖
FileInputStream inputStream = new FileInputStream("D:/liushishi.love");
IOUtils.copy(inputStream, outputStream);
//下载文件 inputStream.seek(12);设置位置
FSDataInputStream inputStream = fs.open(new Path("/liushishi.love"));
FileOutputStream outputStream = new FileOutputStream("D:/liushishi.love2");
IOUtils.copy(inputStream, outputStream);
IOUtils.copy(inputStream, System.out);//控制台输出
4.namenode和secondnamenode管理机制
首先我们要先了解两个概念 Edits 和 Fsimage Edits是文件操作的日志 而Fsimage是文件属性内容的映射
checkpoint(时间和空间)
①、连续两次的检查点最大时间间隔,默认是3600秒,可以通过配置“fs.checkpoint.period”进行修改
②、Edits日志文件的最大值,如果超过这个值就会进行合并即使不到1小时也会进行合并。可以通过“fs.checkpoint.size”来配置,默认是64M;
总结:nn中的edits不会超过checkpoint的容量 一旦触发就会被 sn收走在与以前的fsimage合并 并发送给nn
nn和sn中的数据只差一次的 edits
第三部分 map(分)reduce(合)
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
log4j.rootLogger = debug,stdout
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
public static void main(String[] args) throws Exception {
System.setProperty("hadoop.home.dir", "e:/hadoop-2.8.3");
if (args == null || args.length == 0) {
return;
}
//该对象会默认读取环境中的 hadoop 配置。当然,也可以通过 set 重新进行配置
Configuration conf = new Configuration();
//job 是 yarn 中任务的抽象。
Job job = Job.getInstance(conf);
/*job.setJar("/home/hadoop/wc.jar");*/
//指定本程序的jar包所在的本地路径
job.setJarByClass(WordcountDriver.class);
//指定本业务job要使用的mapper/Reducer业务类
job.setMapperClass(WordcountMapper.class);
job.setReducerClass(WordcountReducer.class);
//指定mapper输出数据的kv类型。需要和 Mapper 中泛型的类型保持一致
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//指定最终输出的数据的kv类型。这里也是 Reduce 的 key,value类型。
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//指定job的输入原始文件所在目录
FileInputFormat.setInputPaths(job, new Path(args[0]));
//指定job的输出结果所在目录
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//将job中配置的相关参数,以及job所用的java类所在的jar包,提交给yarn去运行
/*job.submit();*/
boolean res = job.waitForCompletion(true);
System.exit(res?0:1);
}
mapreduce的shuffle过程
1-2.map前的数据<偏移量,一行数据>
3.自己写的map方法 <数据,1>
4-6.map中的shuffle
7-9.reduce的shuffle
10.自己写的reduce
11.文件写入HDFS
maptask和reducetask
maptask是根据文件数和分块的数量(默认128M)
reducetask是由分区数决定的 每个reducetask生成一个输出文件
第四部分 hive(将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能)
1.Hive安装
1、到下载地址http://apache.fayea.com/hive/,下载apache-hive-1.2.1-bin.tar.gz,解压
tar -xzvf apache-hive-1.2.1-bin.tar.gz
2、配置环境变量,
vi /etc/profile
export HIVE_HOME=/home/liqqc/app/apache-hive-1.2.1-bin
export PATH=$PATH:$HIVE_HOME/bin
3、配置hive参数
拷贝模板配置
cp hive-default.xml.template hive-default.xml
cp hive-env.sh.template hive-env.sh
创建hive-site.xml
touch hive-site.xml
配置hive-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_141
export HIVE_HOME=/home/liqqc/appapache-hive-1.2.1-bin
export HADOOP_HOME=/home/liqqc/app/hadoop-2.7.1
配置hive-site.xml
创建临时文件:在apache-hive-1.2.1-bin文件夹下创建tmp文件夹
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore </description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/opt/modules/hive/tmp</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/opt/modules/hive/tmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/opt/modules/hive/tmp</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
### beeline连接hive的thrift服务,用户名密码设置
<property>
<name>hive.server2.thrift.client.user</name>
<value>root</value>
<description>Username to use against thrift client</description>
</property>
<property>
<name>hive.server2.thrift.client.password</name>
<value>root</value>
<description>Password to use against thrift client</description>
</property>
</configuration>
4、上传mysql驱动jar
下载mysql驱动文件mysql-connector-java-5.1.7-bin.jar,并上传到到/apache-hive-2.1.1-bin/lib目录下。
5、初始化hive
命令:schematool -initSchema -dbType mysql
最后显示schemaTool completed,没有报错就成功了。
6、启动hive
输入命令:hive or 界面版 ./hiveserver2 ./beeline
2.shell命令
show databases; //数据库
create database myhive; //创建数据库
use myhive; //使用数据库 默认根目录
show tables; //表
create table emp(id int,name string)
partitioned by(school string)
row format delimited fields terminated by ','; //建表后在hdfs上生成/user/hive/warehouse/myhive.db/emp文件夹 需要我们在这个文件夹下上传数据文件
create external table emp(id int,name string) //创建外部表
partitioned by(school string) //分区
row format delimited fields terminated by ','//指定逗号分割
stored as textfile//文本存储方式
location '/company';
//数据data的上传
load data local inpath '/root/sz.data' into table emp partition(school='hfut');(也可以用hadoo直接上传)
//如果是hdfs的文件则是 hdfs://namenode:9000/sz.data
//添加分区
alter table stu add partition (school='Tokyo'); 会创建新文件夹.
//保存查询结果到本地
insert overwrite local directory '/root/insertDir/test' select * from t5;
3.分桶 需要先创建分桶对象 然后从另一张表里查数据放入分桶表中 自动分桶生成n个文件
clustered by (id) sorted by (id) into 4 buckets //集群
insert into buck select id,name from tp distribute by (id) sort by (id); //分发
insert into buck select id ,name from tp cluster by (id); 效果相同
4.分桶的作用
select a.id,a.name,b.addr from a join b on a.id = b.id;
如果a表和b表已经是分桶表,而且分桶的字段是id字段,那么做这个操作的时候就不需要全表查找了,而是桶内查找。
5.join 操作
join on
left outer join on
full outer join on
semi join on == exist in
6.自定义函数 以及transform
create temporary function tolower as 'com.scu.hive.UpperToLowerCase';
create TABLE u_data_new as
SELECT
TRANSFORM (movieid, rate, timestring,uid)
USING 'python weekday_mapper.py'
AS (movieid, rate, weekday,uid)
FROM t_rating;
第五部分 hbase
(由{row key, column, version} 唯一确定一个值的稀疏表
HRegion是Hbase中分布式存储和负载均衡的最小单元
HRegion由一个或者多个Store组成,每个store保存一个columns family)
create 'user1','info1','info2' //创建表 列族1 列族2
list //查看所有表
describe ‘表名’ //描述表
disable ‘表名’ drop ‘表名’ //删除表
exists 'user1' //查看表是否存在
put 'user1','1234','info1:name','zhangsan //追加数据 已存在则覆盖
scan 'user1' //扫描表
count ‘表名’ //查看多少行
get 'user1','1234','info1' //由rowkey 和 列族的列 唯一确定一个值
get 'user1', '1234bbb', {COLUMN => 'info1:username',TIMESTAMP => 1538014481194} //时间戳
get 'user','1234',{COLUMN=>'info1:name',VERSIONS=>3} //最近三条
delete ‘表名’ ,‘rowkey’ , ‘列族:列’ //删除信息
truncate ‘表名’ //清空表