hadoop hive hbase 越学越薄系列

本文详细介绍了Hadoop集群的配置,包括环境变量设置、HDFS的原理与操作、MapReduce机制。接着深入讲解了Hive的安装、shell命令使用、分桶操作及其作用,以及HBase的存储结构和HRegion的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一部分 :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 ‘表名’                    //清空表


 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值