大数据技术实践实验报告_第1页
大数据技术实践实验报告_第2页
大数据技术实践实验报告_第3页
大数据技术实践实验报告_第4页
大数据技术实践实验报告_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE课程名称:大数据技术实践实验项目: 大数据平台实验仪器: PC机 学院: 计算机学院专业: 计算机科学与技术班级姓名: *学号: *日期: 2019-5-9 指导教师: * 成绩: 实验目的1.熟练掌握大数据计算平台相关系统的安装部署2.理解大数据MapReduce计算模型,并掌握MapReduce程序开发3.掌握Hive的查询方法4.掌握Spark的基本操作实验内容1.Hadoop完全分布模式安装2.Hadoop开发插件安装3.MapReduce代码实现4.Hive安装部署5.Hive查询6.SparkStandalone模式安装7.SparkShell操作实验过程Hadoop开发插件安装实验步骤: 1.Eclipse开发工具以及Hadoop默认已经安装完毕,安装在/apps/目录下。2.在Linux本地创建/data/hadoop3目录,用于存放所需文件。切换目录到/data/hadoop3目录下,并使用wget命令,下载所需的插件hadoop-eclipse-plugin-2.6.0.jar。将插件hadoop-eclipse-plugin-2.6.0.jar,从/data/hadoop3目录下,拷贝到/apps/eclipse/plugins的插件目录下。进入ubuntu图形界面,双击eclipse图标,启动eclipse。5.在Eclipse窗口界面,依次点击Window=>OpenPerspective=>Other。弹出一个窗口。选择Map/Reduce,并点击OK,可以看到窗口中,有三个变化。(左侧项目浏览器、右上角操作布局切换、面板窗口)如果在windows下,则需要手动调出面板窗口Map/ReduceLocations面板,操作为,点击window=>showview=>Other。在弹出的窗口中,选择Map/ReduceLocations选项,并点击OK。这样便可以调出视图窗口Map/ReduceLocation。6.添加Hadoop配置,连接Hadoop集群。在这里添加Hadoop相关配置。Locationname,是为此配置起的一个名字。DFSMaster,是连接HDFS的主机名和端口号。点击Finish保存配置。7.另外还需保证Hadoop中的HDFS相关进程已经启动。在终端命令行输入jps查看进程状态。\o"viewplain"viewplain

\o"将代码复制到实验机"copyjps

若不存在hdfs相关的进程,如Namenode、Datanode、secondarynamenode,则需要先切换到HADOOP_HOME下的sbin目录,启动hadoop。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/hadoop/sbin

./start-all.sh

8.展开左侧项目浏览视图,可以看到HDFS目录结构。9.上图发现HDFS上,没有存放任何目录。那下面来创建一个目录,检测插件是否可用。右键myhadoop下的文件夹,在弹出的菜单中,点击Createnewdirectory。输入目录名称,点击OK则创建目录成功。右键文件夹,点击Refresh,可用刷新HDFS目录。到此Hadoop开发插件已经安装完毕!MapReduce代码实现实验步骤:1.切换目录到/apps/hadoop/sbin下,启动hadoop。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/hadoop/sbin

./start-all.sh

2.在linux上,创建一个目录/data/mapreduce1。\o"viewplain"viewplain

\o"将代码复制到实验机"copymkdir

-p

/data/mapreduce1

3.切换到/data/mapreduce1目录下,使用wget命令从网址1:60000/allfiles/mapreduce1/buyer_favorite1,下载文本文件buyer_favorite1。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/data/mapreduce1

wget

1:60000/allfiles/mapreduce1/buyer_favorite1

依然在/data/mapreduce1目录下,使用wget命令,从1:60000/allfiles/mapreduce1/hadoop2lib.tar.gz,下载项目用到的依赖包。\o"viewplain"viewplain

\o"将代码复制到实验机"copywget

1:60000/allfiles/mapreduce1/hadoop2lib.tar.gz

将hadoop2lib.tar.gz解压到当前目录下。\o"viewplain"viewplain

\o"将代码复制到实验机"copytar

-xzvf

hadoop2lib.tar.gz

4.将linux本地/data/mapreduce1/buyer_favorite1,上传到HDFS上的/mymapreduce1/in目录下。若HDFS目录不存在,需提前创建。\o"viewplain"viewplain

\o"将代码复制到实验机"copyhadoop

fs

-mkdir

-p

/mymapreduce1/in

hadoop

fs

-put

/data/mapreduce1/buyer_favorite1

/mymapreduce1/in

5.打开Eclipse,新建JavaProject项目。并将项目名设置为mapreduce1。6.在项目名mapreduce1下,新建package包。并将包命名为mapreduce。7.在创建的包mapreduce下,新建类。并将类命名为WordCount。8.添加项目所需依赖的jar包,右键单击项目名,新建一个目录hadoop2lib,用于存放项目所需的jar包。将linux上/data/mapreduce1目录下,hadoop2lib目录中的jar包,全部拷贝到eclipse中,mapreduce1项目的hadoop2lib目录下。选中hadoop2lib目录下所有的jar包,单击右键,选择BuildPath=>AddtoBuildPath9.编写Java代码,并描述其设计思路。下图描述了该mapreduce的执行过程大致思路是将hdfs上的文本作为输入,MapReduce通过InputFormat会将文本进行切片处理,并将每行的首字母相对于文本文件的首地址的偏移量作为输入键值对的key,文本内容作为输入键值对的value,经过在map函数处理,输出中间结果<word,1>的形式,并在reduce函数中完成对每个单词的词频统计。整个程序代码主要包括两部分:Mapper部分和Reducer部分。Mapper代码\o"viewplain"viewplain

\o"将代码复制到实验机"copypublic

static

class

doMapper

extends

Mapper<Object,

Text,

Text,

IntWritable>{

//第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型

public

static

final

IntWritable

one

=

new

IntWritable(1);

public

static

Text

word

=

new

Text();

@Override

protected

void

map(Object

key,

Text

value,

Context

context)

throws

IOException,

InterruptedException

//抛出异常

{

StringTokenizer

tokenizer

=

new

StringTokenizer(value.toString(),"\t");

//StringTokenizer是Java工具包中的一个类,用于将字符串进行拆分

word.set(tokenizer.nextToken());

//返回当前位置到下一个分隔符之间的字符串

context.write(word,

one);

//将word存到容器中,记一个数

}

在map函数里有三个参数,前面两个Objectkey,Textvalue就是输入的key和value,第三个参数Contextcontext是可以记录输入的key和value。例如context.write(word,one);此外context还会记录map运算的状态。map阶段采用Hadoop的默认的作业输入方式,把输入的value用StringTokenizer()方法截取出的买家id字段设置为key,设置value为1,然后直接输出<key,value>。Reducer代码\o"viewplain"viewplain

\o"将代码复制到实验机"copypublic

static

class

doReducer

extends

Reducer<Text,

IntWritable,

Text,

IntWritable>{

//参数同Map一样,依次表示是输入键类型,输入值类型,输出键类型,输出值类型

private

IntWritable

result

=

new

IntWritable();

@Override

protected

void

reduce(Text

key,

Iterable<IntWritable>

values,

Context

context)

throws

IOException,

InterruptedException

{

int

sum

=

0;

for

(IntWritable

value

:

values)

{

sum

+=

value.get();

}

//for循环遍历,将得到的values值累加

result.set(sum);

context.write(key,

result);

}

}

map输出的<key,value>先要经过shuffle过程把相同key值的所有value聚集起来形成<key,values>后交给reduce端。reduce端接收到<key,values>之后,将输入的key直接复制给输出的key,用for循环遍历values并求和,求和结果就是key值代表的单词出现的总次,将其设置为value,直接输出<key,value>。完整代码\o"viewplain"viewplain

\o"将代码复制到实验机"copypackage

mapreduce;

import

java.io.IOException;

import

java.util.StringTokenizer;

import

org.apache.hadoop.fs.Path;

import

org.apache.hadoop.io.IntWritable;

import

org.apache.hadoop.io.Text;

import

org.apache.hadoop.mapreduce.Job;

import

org.apache.hadoop.mapreduce.Mapper;

import

org.apache.hadoop.mapreduce.Reducer;

import

org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import

org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public

class

WordCount

{

public

static

void

main(String[]

args)

throws

IOException,

ClassNotFoundException,

InterruptedException

{

Job

job

=

Job.getInstance();

job.setJobName("WordCount");

job.setJarByClass(WordCount.class);

job.setMapperClass(doMapper.class);

job.setReducerClass(doReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

Path

in

=

new

Path("hdfs://localhost:9000/mymapreduce1/in/buyer_favorite1");

Path

out

=

new

Path("hdfs://localhost:9000/mymapreduce1/out");

FileInputFormat.addInputPath(job,

in);

FileOutputFormat.setOutputPath(job,

out);

System.exit(job.waitForCompletion(true)

?

0

:

1);

}

public

static

class

doMapper

extends

Mapper<Object,

Text,

Text,

IntWritable>{

public

static

final

IntWritable

one

=

new

IntWritable(1);

public

static

Text

word

=

new

Text();

@Override

protected

void

map(Object

key,

Text

value,

Context

context)

throws

IOException,

InterruptedException

{

StringTokenizer

tokenizer

=

new

StringTokenizer(value.toString(),

"\t");

word.set(tokenizer.nextToken());

context.write(word,

one);

}

}

public

static

class

doReducer

extends

Reducer<Text,

IntWritable,

Text,

IntWritable>{

private

IntWritable

result

=

new

IntWritable();

@Override

protected

void

reduce(Text

key,

Iterable<IntWritable>

values,

Context

context)

throws

IOException,

InterruptedException

{

int

sum

=

0;

for

(IntWritable

value

:

values)

{

sum

+=

value.get();

}

result.set(sum);

context.write(key,

result);

}

}

}

10.在WordCount类文件中,单击右键=>RunAs=>RunonHadoop选项,将MapReduce任务提交到Hadoop中。11.待执行完毕后,打开终端或使用hadoopeclipse插件,查看hdfs上,程序输出的实验结果。\o"viewplain"viewplain

\o"将代码复制到实验机"copyhadoop

fs

-ls

/mymapreduce1/out

hadoop

fs

-cat

/mymapreduce1/out/part-r-00000

4.Hive安装部署实验步骤:1.首先在Linux本地,新建/data/hive1目录,用于存放所需文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copymkdir

-p

/data/hive1

切换目录到/data/hive1下,使用wget命令,下载hive所需安装包hive-1.1.0-cdh5.4.5.tar.gz以及mysql-connector-java-5.1.26-bin.jar。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/data/hive1

wget

1:60000/allfiles/hive1/hive-1.1.0-cdh5.4.5.tar.gz

wget

1:60000/allfiles/hive1/mysql-connector-java-5.1.26-bin.jar

2.将/data/hive1目录下的hive-1.1.0-cdh5.4.5.tar.gz,解压缩到/apps目录下。\o"viewplain"viewplain

\o"将代码复制到实验机"copytar

-xzvf

hive-1.1.0-cdh5.4.5.tar.gz

-C

/apps/

再切换到/apps目录下,将/apps/hive-1.1.0-cdh5.4.5,重命名为hive。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps

mv

/apps/hive-1.1.0-cdh5.4.5/

/apps/hive

3.使用vim打开用户环境变量。\o"viewplain"viewplain

\o"将代码复制到实验机"copysudo

vim

~/.bashrc

将Hive的bin目录,添加到用户环境变量PATH中,然后保存退出。\o"viewplain"viewplain

\o"将代码复制到实验机"copy#hive

config

export

HIVE_HOME=/apps/hive

export

PATH=$HIVE_HOME/bin:$PATH

执行source命令,使Hive环境变量生效。\o"viewplain"viewplain

\o"将代码复制到实验机"copysource

~/.bashrc

4.由于Hive需要将元数据,存储到Mysql中。所以需要拷贝/data/hive1目录下的mysql-connector-java-5.1.26-bin.jar到hive的lib目录下。\o"viewplain"viewplain

\o"将代码复制到实验机"copycp

/data/hive1/mysql-connector-java-5.1.26-bin.jar

/apps/hive/lib/

5.下面配置Hive,切换到/apps/hive/conf目录下,并创建Hive的配置文件hive-site.xml。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/hive/conf

touch

hive-site.xml

使用vim打开hive-site.xml文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copyvim

hive-site.xml

并将下列配置项,添加到hive-site.xml文件中。\o"viewplain"viewplain

\o"将代码复制到实验机"copy<configuration>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExsit=true;characterEncoding=latin1</value>

</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>strongs</value>

</property>

</configuration>

由于Hive的元数据会存储在Mysql数据库中,所以需要在Hive的配置文件中,指定mysql的相关信息。javax.jdo.option.ConnectionURL:数据库链接字符串。javax.jdo.option.ConnectionDriverName:连接数据库的驱动包。javax.jdo.option.ConnectionUserName:数据库用户名。javax.jdo.option.ConnectionPassword:连接数据库的密码。此处的数据库的用户名及密码,需要设置为自身系统的数据库用户名及密码。6.另外,还需要告诉Hive,Hadoop的环境配置。所以我们需要修改hive-env.sh文件。首先我们将hive-env.sh.template重命名为hive-env.sh。\o"viewplain"viewplain

\o"将代码复制到实验机"copymv

/apps/hive/conf/hive-env.sh.template

/apps/hive/conf/hive-env.sh

使用vim打开hive-env.sh文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copyvim

hive-env.sh

追加Hadoop的路径,以及Hive配置文件的路径到文件中。\o"viewplain"viewplain

\o"将代码复制到实验机"copy#

Set

HADOOP_HOME

to

point

to

a

specific

hadoop

install

directory

#

HADOOP_HOME=${bin}/../../hadoop

HADOOP_HOME=/apps/hadoop

#

Hive

Configuration

Directory

can

be

controlled

by:

#

export

HIVE_CONF_DIR=

export

HIVE_CONF_DIR=/apps/hive/conf

7.下一步是配置Mysql,用于存储Hive的元数据。首先,需要保证Mysql已经启动。执行以下命令,查看Mysql的运行状态。\o"viewplain"viewplain

\o"将代码复制到实验机"copysudo

service

mysql

status

通过输出,可以看出Mysql未启动。所以需要执行启动命令。\o"viewplain"viewplain

\o"将代码复制到实验机"copysudo

service

mysql

start

如果未安装Mysql则需要执行安装命令。若我们的环境已安装Mysql,则无需执行此步。\o"viewplain"viewplain

\o"将代码复制到实验机"copysudo

apt-get

install

mysql-server

8.开启Mysql数据库。\o"viewplain"viewplain

\o"将代码复制到实验机"copymysql

-u

root

-p

此时会提示输入密码,此处密码为strongs创建名为hive的数据库,编码格式为latin1,用于存储元数据。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

database

hive

CHARACTER

SET

latin1;

查看数据库是否创建成功。\o"viewplain"viewplain

\o"将代码复制到实验机"copyshow

databases;

下面,输入exit退出Mysql。\o"viewplain"viewplain

\o"将代码复制到实验机"copyexit

9.执行测试。由于Hive对数据的处理,依赖MapReduce计算模型,所以需要保证Hadoop相关进程已经启动。输入jps,查看进程状态。若Hadoop相关进程未启动,则需启动Hadoop。\o"viewplain"viewplain

\o"将代码复制到实验机"copy/apps/hadoop/sbin/start-all.sh

启动Hadoop后,在终端命令行界面,直接输入hive便可启动Hive命令行模式。\o"viewplain"viewplain

\o"将代码复制到实验机"copyhive

输入HQL语句查询数据库,测试Hive是否可以正常使用。\o"viewplain"viewplain

\o"将代码复制到实验机"copyshow

databases;

至此Hive安装完毕。5.Hive基本操作实验步骤:一、实验环境准备1.首先在Linux本地新建/data/hive2目录。\o"viewplain"viewplain

\o"将代码复制到实验机"copymkdir

-p

/data/hive2

2.切换到/data/hive2目录下,使用wget命令,下载1:60000/allfiles/hive2中cat_group和goods文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/data/hive2

wget

1:60000/allfiles/hive2/cat_group

wget

1:60000/allfiles/hive2/goods

3.输入jps检查Hadoop相关进程,是否已经启动。若未启动,切换到/apps/hadoop/sbin目录下,启动Hadoop。\o"viewplain"viewplain

\o"将代码复制到实验机"copyjps

cd

/apps/hadoop/sbin

./start-all.sh

4.开启Hive,首先,需要保证Mysql启动。执行以下命令,查看Mysql的运行状态。\o"viewplain"viewplain

\o"将代码复制到实验机"copysudo

service

mysql

status

输出显示Mysql未启动。执行以下启动命令。\o"viewplain"viewplain

\o"将代码复制到实验机"copysudo

service

mysql

start

然后切换到/apps/hive/bin目录下,开启Hive。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/hive/bin

./hive

二、Hive数据仓库的操作1.在Hive中创建一个数据仓库,名为DB。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

database

DB;

2.以上简单创建了一个DB库,但是这条sql可以更进一步的优化,我们可以加上ifnotexists。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

database

if

not

exists

DB;

解析:在创建库时,应避免新建的库名与已有库名重复,如果库名重复将会报出以下错误(我在已有DB库的前提下,再次创建了DB库)。错误提示数据仓库DB已经存在,那么加入的ifnotexists就起了作用,如下(在已有DB库的前提下,再次创建DB库,提示成功不会报错)加入ifnotexists的意思是如果没有DB库就创建,如果已有就不再创建。3.查看数据仓库DB的信息及路径。\o"viewplain"viewplain

\o"将代码复制到实验机"copydescribe

database

DB;

4.删除名为DB的数据仓库。\o"viewplain"viewplain

\o"将代码复制到实验机"copydrop

database

if

exists

DB;

三、Hive数据表的操作Hive的数据表分为两种:内部表和外部表。Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据,生产中常使用外部表。下面详细介绍对表操作的命令及使用方法:即将创建的表,表名不能和已有表名重复,否则会报错,现在我们showtables一下,查看已存在的表。\o"viewplain"viewplain

\o"将代码复制到实验机"copyshow

tables;

现在库中没有表。1.创建一个名为cat的内部表,有两个字段为cat_id和cat_name,字符类型为string。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

cat(cat_id

string,cat_name

string);

查看是否创建成功。\o"viewplain"viewplain

\o"将代码复制到实验机"copyshow

tables;

下面我们再次创建一个与刚才表名相同的表,看一下报错。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

cat(cat_id

string,cat_name

string);

提示错误,该表已经存在!说明表与库一样,名称不能重复,解决方法是加入ifnotexists。2.创建一个外部表,表名为cat2,有两个字段为cat_id和cat_name,字符类型为string。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

external

table

if

not

exists

cat2(cat_id

string,cat_name

string);

查看是否创建成功。\o"viewplain"viewplain

\o"将代码复制到实验机"copyshow

tables;

外部表较内部表而言,只是在create后加了一个external。3.修改cat表的表结构。对cat表添加两个字段group_id和cat_code。\o"viewplain"viewplain

\o"将代码复制到实验机"copyalter

table

cat

add

columns(group_id

string,cat_code

string);

使用desc命令查看一下加完字段后的cat表结构。\o"viewplain"viewplain

\o"将代码复制到实验机"copydesc

cat;

4.修改cat2表的表名。把cat2表重命名为cat3。\o"viewplain"viewplain

\o"将代码复制到实验机"copyalter

table

cat2

rename

to

cat3;

这个命令可以让用户为表更名,数据所在的位置和分区名并不改变。5.删除名为cat3的表并查看。\o"viewplain"viewplain

\o"将代码复制到实验机"copydrop

table

cat3;

show

tables;

6.创建与已知表相同结构的表,创建一个与cat表结构相同的表,名为cat4,这里要用到like关键字。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

cat4

like

cat;

创建完成并查看结果。\o"viewplain"viewplain

\o"将代码复制到实验机"copyshow

tables;

四、Hive中数据的导入导出以下介绍四种常见的数据导入方式:1.从本地文件系统中导入数据到Hive表。首先,在Hive中创建一个cat_group表,包含group_id和group_name两个字段,字符类型为string,以“\t”为分隔符,并查看结果。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

cat_group(group_id

string,group_name

string)

row

format

delimited

fields

terminated

by

'\t'

stored

as

textfile;

show

tables;

[rowformatdelimited]关键字,是用来设置创建的表在加载数据的时候,支持的列分隔符。[storedastextfile]关键字,是用来设置加载数据的数据类型,默认是TEXTFILE,如果文件数据是纯文本,就是使用[storedastextfile],然后从本地直接拷贝到HDFS上,Hive直接可以识别数据。然后,将Linux本地/data/hive2目录下的cat_group文件导入到Hive中的cat_group表中。\o"viewplain"viewplain

\o"将代码复制到实验机"copyload

data

local

inpath

'/data/hive2/cat_group'

into

table

cat_group;

通过select语句查看cat_group表中是否成功导入数据,由于数据量大,使用limit关键字限制输出10条记录。\o"viewplain"viewplain

\o"将代码复制到实验机"copyselect

*

from

cat_group

limit

10;

导入成功。2.将HDFS上的数据导入到Hive中。首先,另外开启一个操作窗口,在HDFS上创建/myhive2目录。\o"viewplain"viewplain

\o"将代码复制到实验机"copyhadoop

fs

-mkdir

/myhive2

然后,将本地/data/hive2/下的cat_group表上传到HDFS的/myhive2上,并查看是否创建成功。\o"viewplain"viewplain

\o"将代码复制到实验机"copyhadoop

fs

-put

/data/hive2/cat_group

/myhive2

hadoop

fs

-ls

/myhive2

接着,在Hive中创建名为cat_group1的表,创表语句如下。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

cat_group1(group_id

string,group_name

string)

row

format

delimited

fields

terminated

by

'\t'

stored

as

textfile;

最后,将HDFS下/myhive2中的表cat_group导入到Hive中的cat_group1表中,并查看结果。\o"viewplain"viewplain

\o"将代码复制到实验机"copyload

data

inpath

'/myhive2/cat_group'

into

table

cat_group1;

select

*

from

cat_group1

limit

10;

导入成功。提示:HDFS中数据导入到Hive中与本地数据导入到hive中的区别是loaddata后少了local。3.从别的表中查询出相应的数据并导入到Hive中。首先在Hive中创建一个名为cat_group2的表。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

cat_group2(group_id

string,group_name

string)

row

format

delimited

fields

terminated

by

'\t'

stored

as

textfile;

用下面两种方式将cat_group1表中的数据导入到cat_group2表中。\o"viewplain"viewplain

\o"将代码复制到实验机"copyinsert

into

table

cat_group2

select

*

from

cat_group1;

或\o"viewplain"viewplain

\o"将代码复制到实验机"copyinsert

overwrite

table

cat_group2

select

*

from

cat_group1;

(insertoverwrite会覆盖数据)。导入完成后,用select语句查询cat_group2表。\o"viewplain"viewplain

\o"将代码复制到实验机"copyselect

*

from

cat_group2

limit

10;

4.在创建表的时候从别的表中查询出相应数据并插入到所创建的表中。Hive中创建表cat_group3并直接从cat_group2中获得数据。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

cat_group3

as

select

*

from

cat_group2;

创建并导入完成,用select语句查询实验结果。\o"viewplain"viewplain

\o"将代码复制到实验机"copyselect

*

from

cat_group3

limit

10;

五、三种常见的数据导出方式1.导出到本地文件系统。首先,在Linux本地新建/data/hive2/out目录。\o"viewplain"viewplain

\o"将代码复制到实验机"copymkdir

-p

/data/hive2/out

并将Hive中的cat_group表导出到本地文件系统/data/hive2/out中。注意:方法和导入数据到Hive不一样,不能用insertinto来将数据导出。\o"viewplain"viewplain

\o"将代码复制到实验机"copyinsert

overwrite

local

directory

'/data/hive2/out'

select

*

from

cat_group;

导出完成后,在Linux本地切换到/data/hive2/out目录,通过cat命令查询导出文件的内容。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/data/hive2/out

ls

cat

000000_0

通过上图可以看到导出的数据,字段之间没有分割开,所以我们使用下面的方式,将输出字段以“\t”键分割。\o"viewplain"viewplain

\o"将代码复制到实验机"copyinsert

overwrite

local

directory

'/data/hive2/out'

select

group_id,concat('\t',group_name)

from

cat_group;

通过cat命令查询/data/hive2/out目录下的导出文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/data/hive2/out/

cat

000000_0

2.Hive中数据导出到HDFS中在HDFS上创建/myhive2/out目录。\o"viewplain"viewplain

\o"将代码复制到实验机"copyhadoop

fs

-mkdir

-p

/myhive2/out

并将Hive中的表cat_group中的数据导入到HDFS的/myhive2/out目录里。\o"viewplain"viewplain

\o"将代码复制到实验机"copyinsert

overwrite

directory

'/myhive2/out'

select

group_id,concat('\t',group_name)

from

cat_group;

导入完成后,在HDFS上的/myhive2/out目录下查看结果。\o"viewplain"viewplain

\o"将代码复制到实验机"copyhadoop

fs

-ls

/myhive2/out

3.导出到Hive的另一个表中。将Hive中表cat_group中的数据导入到cat_group4中(两表字段及字符类型相同)。首先在Hive中创建一个表cat_group4,有group_id和group_name两个字段,字符类型为string,以‘\t’为分隔符。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

cat_group4(group_id

string,group_name

string)

row

format

delimited

fields

terminated

by

'\t'

stored

as

textfile;

然后将cat_group中的数据导入到cat_group4中。\o"viewplain"viewplain

\o"将代码复制到实验机"copyinsert

into

table

cat_group4

select

*

from

cat_group;

导入完成后,查看cat_group4表中数据。\o"viewplain"viewplain

\o"将代码复制到实验机"copyselect

*

from

cat_group4

limit

10;

六,Hive分区表的操作创建分区Hive中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash分区,混合分区等)。分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说,在表的数据文件中实际并不保存分区列的信息与数据。1.创建表分区,在Hive中创建一个分区表goods,包含goods_id和goods_status两个字段,字符类型为string,分区为cat_id,字符类型为string,以“\t“为分隔符。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

goods(goods_id

string,goods_status

string)

partitioned

by

(cat_id

string)

row

format

delimited

fields

terminated

by

'\t';

查看表goods表结构。\o"viewplain"viewplain

\o"将代码复制到实验机"copydesc

goods;

这样一个分区表就建好了。2.向分区表插入数据,将本地/data/hive2下的表goods中数据,插入到分区表goods中。首先,在Hive中创建一个非分区表goods_1表,用于存储本地/data/hive2下的表goods中数据。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

goods_1(goods_id

string,goods_status

string,cat_id

string)

row

format

delimited

fields

terminated

by

'\t';

将本地/data/hive2下的表goods中数据导入到Hive中的goods_1表中。\o"viewplain"viewplain

\o"将代码复制到实验机"copyload

data

local

inpath

'/data/hive2/goods'

into

table

goods_1;

再将表goods_1中的数据导入到分区表goods中。\o"viewplain"viewplain

\o"将代码复制到实验机"copyinsert

into

table

goods

partition(cat_id='52052')

select

goods_id,goods_status

from

goods_1

where

cat_id='52052';

插入数据完成后,用select语句查看实验结果。\o"viewplain"viewplain

\o"将代码复制到实验机"copyselect

*

from

goods

limit

10;

4.查看表goods中的分区。\o"viewplain"viewplain

\o"将代码复制到实验机"copyshow

partitions

goods;

5.修改表分区,将分区表goods中的分区列cat_id=52052改为cat_id=52051,并查看修改后的分区名。\o"viewplain"viewplain

\o"将代码复制到实验机"copyalter

table

goods

partition(cat_id=52052)

rename

to

partition(cat_id=52051);

show

partitions

goods;

6.删除表分区。在删除goods分区表之前,先将goods表备份出一个goods_2表。\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

goods_2(goods_id

string,goods_status

string)

partitioned

by

(cat_id

string)

row

format

delimited

fields

terminated

by

'\t';

insert

into

table

goods_2

partition(cat_id='52052')

select

goods_id,goods_status

from

goods_1

where

cat_id='52052';

删除goods表中的cat_id分区。\o"viewplain"viewplain

\o"将代码复制到实验机"copyalter

table

goods

drop

if

exists

partition

(cat_id='52051');

七,Hive桶的操作1.桶的定义及用途Hive还可以把表或分区,组织成桶。将表或分区组织成桶有以下几个目的:(1)是为使取样更高效。在处理大规模的数据集时,在开发、测试阶段将所有的数据全部处理一遍可能不太现实,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。(2)是为了获得更好的查询处理效率。桶为表提供了额外的结构,Hive在处理某些查询时利用这个结构,能够有效地提高查询效率。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用Map端连接(Map-sidejoin)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。在建立桶之前,需要设置hive.enforce.bucketing属性为true,使得Hive能识别桶。2.创建桶创建一个名为goods_t的表,包含两个字段goods_id和goods_status,字符类型都为string,按cat_idstring做分区,按goods_status列聚类和goods_id列排序,划分成两个桶\o"viewplain"viewplain

\o"将代码复制到实验机"copycreate

table

goods_t(goods_id

string,goods_status

string)

partitioned

by

(cat_id

string)

clustered

by(goods_status)

sorted

by

(goods_id)

into

2

buckets;

设置环境变量sethive.enforce.bucketing=ture\o"viewplain"viewplain

\o"将代码复制到实验机"copyset

hive.enforce.bucketing=true;

3.向goods_t表中插入goods_2表中的数据。\o"viewplain"viewplain

\o"将代码复制到实验机"copyfrom

goods_2

insert

overwrite

table

goods_t

partition(cat_id='52063')

select

goods_id,goods_status;

查看结果\o"viewplain"viewplain

\o"将代码复制到实验机"copyselect

*

from

goods_t

tablesample(bucket

1

out

of

2

on

goods_id);

tablesample是抽样语句,语法如下:tablesample(bucketxoutofy)y必须是table中BUCKET总数的倍数或者因子。实验截图:5.25.36.SparkStandalone模式安装实验步骤:1.Spark的运行依赖jdk,Hadoop,Scala。在这里默认已安装jdk以及Hadoop伪分布模式。2.在Linux上,创建目录/data/spark2,用于存储spark安装所需的文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copymkdir

-p

/data/spark2

切换目录到/data/spark2下,使用wget命令,下载所需的Spark的安装包spark-1.6.0-bin-hadoop2.6.tgz及scala安装包scala2.10.4.tgz。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/data/spark2/

wget

1:60000/allfiles/spark2/scala-2.10.4.tgz

wget

1:60000/allfiles/spark2/spark-1.6.0-bin-hadoop2.6.tgz

此处建议使用scala-2.10.4版本。官网中指出,若使用scala2.11.x,则需要重新编译spark,并且编译时,需要指定scala版本的类型。关于spark版本,没有严格要求。所以我们使用spark1.6版本。3.安装Scala。切换目录到/data/spark2下,将目录下的scala-2.10.4.tgz解压缩到/apps目录下,并将解压后的目录名改为/apps/scala。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/data/spark2/

tar

-xzvf

/data/spark2/scala-2.10.4.tgz

-C

/apps/

cd

/apps

mv

/apps/scala-2.10.4/

/apps/scala

使用vim打开用户环境变量~/.bashrc。\o"viewplain"viewplain

\o"将代码复制到实验机"copyvim

~/.bashrc

将scala的bin目录,追加的用户环境变量中。\o"viewplain"viewplain

\o"将代码复制到实验机"copy#scala

export

SCALA_HOME=/apps/scala

export

PATH=$SCALA_HOME/bin:$PATH

执行source命令,使系统环境变量生效。\o"viewplain"viewplain

\o"将代码复制到实验机"copysource

~/.bashrc

4.切换目录到/data/spark2下,将Spark的安装包spark-1.6.0-bin-hadoop2.6.tgz,解压缩到/apps目录下,并将解压后的目录名,重命名为spark。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/data/spark2

tar

-xzvf

/data/spark2/spark-1.6.0-bin-hadoop2.6.tgz

-C

/apps/

cd

/apps/

mv

/apps/spark-1.6.0-bin-hadoop2.6/

/apps/spark

使用vim打开用户环境变量~/.bashrc。\o"viewplain"viewplain

\o"将代码复制到实验机"copyvim

~/.bashrc

将spark的bin目录,追加到用户环境变量中。\o"viewplain"viewplain

\o"将代码复制到实验机"copy#spark

export

SPARK_HOME=/apps/spark

export

PATH=$SPARK_HOME/bin:$PATH

执行source命令,使用户环境变量生效。\o"viewplain"viewplain

\o"将代码复制到实验机"copysource

~/.bashrc

5.切换目录到/apps/spark/conf下,将conf目录下的配置文件slaves.template重命名为slaves。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/spark/conf

mv

slaves.template

slaves

在slaves中,存储了所有worker节点的的ip或主机名。使用文本编辑器vim打开slaves文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copyvim

slaves

将所有worker节点的ip添加进去。由于目前只有一台节点,所以是。\o"viewplain"viewplain

\o"将代码复制到实验机"copy

6.将/apps/spark/conf/spark-env.sh.template文件,重命名为/apps/spark/conf/spark-env.sh。\o"viewplain"viewplain

\o"将代码复制到实验机"copymv

/apps/spark/conf/spark-env.sh.template

/apps/spark/conf/spark-env.sh

使用vim,打开/apps/spark/conf/spark-env.sh文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copyvim

/apps/spark/conf/spark-env.sh

添加如下配置:\o"viewplain"viewplain

\o"将代码复制到实验机"copyHADOOP_CONF_DIR=/apps/hadoop/etc/hadoop

JAVA_HOME=/apps/java

SPARK_MASTER_IP=

SPARK_MASTER_PORT=7077

SPARK_MASTER_WEBUI_PORT=8080

SPARK_WORKER_CORES=1

SPARK_WORKER_MEMORY=1g

SPARK_WORKER_PORT=7078

SPARK_WORKER_WEBUI_PORT=8081

SPARK_EXECUTOR_INSTANCES=1

此处需要配置JAVA_HOME以及HADOOP配置文件所在的目录HADOOP_CONF_DIR。SPARK_MASTER_IP、SPARK_MASTER_PORT、SPARK_MASTER_WEBUI_PORT,分别指spark集群中,master节点的ip地址、端口号、提供的web接口的端口。SPARK_WORKER_CORES、SPARK_WORKER_MEMORY:worker节点的内核数、内存大小。此处可用根据自己机器情况调整配置项参数。7.启动Hadoop,首先需要保证Hadoop相关进程为启动状态。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/hadoop/sbin

./start-all.sh

切换目录到/apps/spark/sbin目录下,启动Spark。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/spark/sbin

./start-all.sh

执行jps,查看进程变化。8.执行测试在HDFS上,创建/myspark2目录,并将Linux上/apps/spark/README.md文件,上传到HDFS。\o"viewplain"viewplain

\o"将代码复制到实验机"copyhadoop

fs

-mkdir

/myspark2

hadoop

fs

-put

/apps/spark/README.md

/myspark2/

切换目录到/apps/spark/bin目录下,使用SparkShell客户端,访问服务端,验证安装完的Spark是否可用,进入命令行模式。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/spark/bin

./spark-shell

--master

spark://localhost:7077

在SparkShell中,使用scala加载HDFS上的README.md文件,并转变为rdd。\o"viewplain"viewplain

\o"将代码复制到实验机"copyvar

mytxt

=

sc.textFile("hdfs://localhost:9000/myspark2/README.md");

统计文件的行数。\o"viewplain"viewplain

\o"将代码复制到实验机"copymytxt.count();

可用看到输出为:\o"viewplain"viewplain

\o"将代码复制到实验机"copyres3:

Long

=

95

表明安装正确。9.在刚才执行统计过程中,由于Log4j的日志输出级别为info级别,所以会在屏幕上输出很多的log,很难定位程序的输出结果。输入exit,退出spark-shell,并切换目录到/apps/spark/sbin目录下,停止Spark。\o"viewplain"viewplain

\o"将代码复制到实验机"copyexit

cd

/apps/spark/sbin

./stop-all.sh

再切换目录到/apps/spark/conf目录下,将目录下perties.template重命名为perties。\o"viewplain"viewplain

\o"将代码复制到实验机"copycd

/apps/spark/conf

mv

/apps/spark/conf/perties.template

/apps/spark/conf/perties

使用vim打开perties文件。\o"viewplain"viewplain

\o"将代码复制到实验机"copyvim

perties

更改log4j的日志级别为WARN级别,修改log4j.rootCategor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论