目录
大数据环境搭建及基本使用
环境搭建:Ubuntu18.04三台虚拟机大数据
1.Hadoop hdfs使用
2.Hadoop mapreduce使用
3.Hive使用
4.Hbase使用
5.Kafka使用
记录一下自己搭建三台虚拟机的过程
环境总体概述
主节点 |
IP地址 |
软件 |
进程 |
master |
192.168.190.130 |
MySQL 5.7.29 |
namenode(hadoop) |
JDK 1.8.0_241 |
resourcemanager(yarn) |
||
Hadoop 2.10.1 |
QuorumPeerMain(zookeeper) |
||
Zookeeper 3.5.7 |
HMaster,HRegionServer(hbase) |
||
Hbase 2.2.4 |
Master(spark) |
||
Spark 2.4.5 |
|||
Hive 2.3.7 |
|||
Sqoop 1.4.7 |
|||
Kafka 2.1.0 2.11 |
|||
slave1 |
192.168.190.131 |
JDK 1.8.0_241 |
datanode(hadoop) |
Hadoop 2.10.1 |
nodemanager(yarn) |
||
Zookeeper 3.5.7 |
QuorumPeerMain(zookeeper) |
||
Hbase 2.2.4 |
HRegionServer(hbase) |
||
Spark 2.4.5 |
Worker(spark) |
||
slave2 |
192.168.190.132 |
JDK 1.8.0_241 |
datanode、secondarynamenode(hadoop) |
Hadoop 2.10.1 |
nodemanager(yarn) |
||
Zookeeper 3.5.7 |
QuorumPeerMain(zookeeper) |
||
Hbase 2.2.4 |
HRegionServer(hbase) |
||
Spark 2.4.5 |
Worker(spark) |
虚拟机配置
配置:存储为单个文件、内存4G、cpu2*2、硬盘50G、网络自定义NAT模式vmnet8(根基自己电脑配置酌情,比如我的电脑16G内存,分给master 4G,slave1和slave2分别2G)配置截图如下图
vim /etc/netplan/01-network-manager-all.yaml(文件名有可能不是这个,去你自己机器找) |
network: # dxy add ethernets: ens33: # 网卡名根据自己电脑来。ifconfig查看自己的网卡名。没有命令使用sudo apt install net-tools安装一下 addresses: - 192.168.190.130/24 # 静态地址 gateway4: 192.168.190.2 #网关 nameservers: addresses: - 8.8.8.8 search: [] optional: true #dxy add end version: 2 renderer: NetworkManager |
使得配置生效
sudo netplan apply |
查看是否修改成功
ifconfig |
配置集群中其他机器地址及域名:
sudo vim /etc/hosts
127.0.0.1 localhost 127.0.1.1 localhost.localdomain localhost 192.168.190.130 master 192.168.190.131 slave1 192.168.190.132 slave2 |
配置本机名
vim /etc/hostname
master |
重启
1)JDK 1.8。Hadoop是Java编写的程序,Hadoop的编译及MapReduce都需要使用JDK。因此,在安装Hadoop前,必须安装JDK。
2)SSH(安装外壳协议),推荐安装OpenSSH.Hadoop需要通过SSH来启动Slave列表中各台机器的守护进程,因此SSH也是必须安装的,即使是安装伪分布版本(因为Hadoop并没有区分集群式和伪分布式)。对于伪分布式,Hadoop会采用与集群相同处理方式,即按次序启动文件conf/slaves中记载的主机上的进程,只不过在伪分布式中Slave为localhost(即本身),所以对于伪分布式Hadoop,SSH也是一样必须的。
查看防火墙状态
sudo ufw status |
未安装ufw的话
sudo apt-get install ufw |
返回:stats:inactive表示已经关闭
若未关闭,关闭防火墙
sudo ufw disable |
目前在官网下载jdk1.8的jdk和mysql包的时候需要登陆,借用别人账号
密码:Java123456 |
解压压缩包
tar -zxvf jdk-8u144-linux-x64.tar.gz -C /home/hadoop/bigdata/ |
设置软连接
ln -s jdk-xxxx jdk |
配置环境变量
vim ~/.bashrc
export JAVA_HOME=/home/hadoop/bigdata/jdk export PATH=$JAVA_HOME/bin:$PATH |
使得环境变量生效
source ~/.bashrc |
查看是否成功
Java -version |
sudo apt-get install openssh-server |
设置开机后设置静态IP地址:
vim /etc/netplan/01-network-manager-all.yaml slave1为192.168.190.131/24 slave2为192.168.190.131/24 |
生效
sudo netplan apply |
配置本机名
vim /etc/hostname slave1 # 在slave1虚拟机中添加
slave2 #在slave2虚拟机中添加 |
重启
此时三者应该可以互相ping通
在master下尝试 ping slave1、ping slave2
在slave1下尝试 ping master、ping slave2
在slave2下尝试 ping master、ping slave1
如有ping不通查看防火墙是否关闭,配置文件是否没修改好
在三台机器上分别使用命令
ssh localhost |
输入密码登录后
exit |
这样三台机器上都增加了~/.ssh文件
cd ~/.ssh |
在三台机器上分别执行下句生成本机公钥
ssh-keygen -t rsa -P ‘’ |
ls可以看到id_rsa和id_rsa.pub
在三台机器上分别执行,将公钥添加到认证公钥文件中
cat id_rsa.pub >> authorized_keys |
使得master可以ssh免密登录slave1,slave2
在master机器上,复制了一份自己公钥命名为tmp
cp authorized_keys tmp |
在master机器上将自己的公钥发送给slave1、slave2
scp tmp hadoop@slave1:/home/hadoop/.ssh/ scp tmp hadoop@slave2:/home/hadoop/.ssh/ |
在slave1,slave2将master公钥添加进其中
cat tmp >> authorized_keys |
验证
在master是否可以免密远程登录
ssh slave1 ssh slave2 |
Hadoop安装
先在master节点安装hadoop,然后发给slave1、slave2
下载jdk 和 hadoop 解压放到 ~/bigdata目录下
tar -zxvf hadoop-xxx.tar.gz -C ~/bigdata/ |
创建软连接
ln -s hadoop-xxx hadoop |
配置环境变量
vim ~/.bashrc export HADOOP_HOME=/home/hadoop/bigdata/hadoop export PATH=$HADOOP_HOME/bin:$PATH #保存退出后 source ~/.bash_profile |
进入到解压后的hadoop目录 修改配置文件
配置文件作用
修改hadoop-env.sh
cd etc/hadoop vim hadoop-env.sh #找到下面内容添加java home export_JAVA_HOME=/home/hadoop/bigdata/jdk |
修改 core-site.xml 在
<configuration>
<property> <name>hadoop.tmp.dirname> <value>/home/hadoop/bigdata/hadoop/data/tmpvalue> <description>Abase for other temporary directories.description> property>
<property> <name>fs.defaultFSname> <value>hdfs://master:9000value> property> configuration> |
修改hdfs-site.xml
<configuration> <property> <name>dfs.replicationname> <value>2value> property>
<property> <name>dfs.namenode.secondary.http-addressname> <value>slave2:50090value> property> configuration> |
修改 mapred-site.xml
默认没有这个从模板文件复制
<configuration> <property> <name>mapreduce.framework.namename> <value>yarnvalue> property> configuration> |
修改yarn-site.xml
<configuration>
<property> <name>yarn.nodemanager.aux-servicesname> <value>mapreduce_shufflevalue> property>
<property> <name>yarn.resourcemanager.hostnamename> <value>mastervalue> property> configuration> |
指定datanode节点
slave1 slave2 |
查看hadoop是否安装成功
hadoop version |
发送给slave1,slave2
scp -r /home/hadoop/bigdata/hadoop-xxx hadoop@slave1:/home/hadoop/bigdata/ scp -r /home/hadoop/bigdata/hadoop-xxx hadoop@slave2:/home/hadoop/bigdata/ |
在slave1,slave2分别创建软连接
ln -s hadoop-xxx hadoop |
来到hadoop的bin目录,格式化namenode
hdfs namenode -format |
启动hadoop
来到hadoop的sbin目录
start-all.sh |
查看进程
Slave1
Slave2
Zookeeper安装
先在master安装,再发送到slave1,slave2
下载Zookeeper的安装包并解压
tar -zxvf zookeeper-3.5.7-bin.tar.gz -C ~/bigdata/ |
创建软连接
ln -s zookeeper-xxx zookeeper |
配置环境变量
# zookeeper export ZOOKEEPER_HOME=/home/hadoop/bigdata/zookeeper export PATH=$ZOOKEEPER_HOME/bin:$PATH |
进入到conf目录下
# 心跳间隔 tickTime=2000 # 初始容忍心跳数 initLimit=10 # 等待最大容忍心跳数 syncLimit=5 # 本地保存数据的目录 dataDir=/home/hadoop/bigdata/zookeeper/zookeeperdir/zookeeper-data # 日志存放位置 dataLogDir=/home/hadoop/bigdata/zookeeper/zookeeperdir/logs # 客户端默认端口 clientPort=2181
# dxy add 2888端口号是zookeeper服务之间通信的端口(心跳端口),而3888是zookeeper与其他应用程序通信的端口(数据端口) server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888 |
创建目录
mkdir -p /home/hadoop/bigdata/zookeeper/zookeeperdir/logs mkdir -p /home/hadoop/bigdata/zookeeper/zookeeperdir/zookeeper-data |
到zookeeper-data目录下 新建 myid 文件
vim myid |
添加1
发送给slave1,slave2
scp -r /home/hadoop/bigdata/zookeeper-xxx hadoop@slave1:/home/hadoop/bigdata/ scp -r /home/hadoop/bigdata/zookeeper-xxx hadoop@slave2:/home/hadoop/bigdata/ |
|
在slave1,slave2分别创建软连接
ln -s zookeeper-xxx zookeeper |
在slave1,slave2修改myid
vim myid # slave1为2 vim myid # slave2 为 3 |
在master、slave1、slave2分别启动(若只启动master ./zkServer.sh status会报错 )
启动Zookeeper、查看状态、关闭
./zkServer.sh start ./zkServer.sh status ./zkServer.sh stop |
编写启动脚本可参考下面链接。后面会配置大数据集群脚本,这步可以先不做。
https://www.cnblogs.com/biehongli/p/7650570.html
Hbase安装
Hbase 安装前需要安装好 JDK 和 Hadoop和Zookeeper。配置好环境变量。
先在master安装然后配置,再发送给slave1,slave2
下载Hbase的安装包并解压
tar -zxvf hbase-2.2.4.tar.gz -C ~/bigdata/ |
环境变量配置
vim ~/.bashrc export HBASE_HOME=/root/bigdata/hbase export PATH=$HBASE_HOME/bin:$PATH source ~/.bashrc |
配置hbase-env.sh
export JAVA_HOME=/root/bigdata/jdk export HBASE_MANAGES_ZK=false --如果你是使用hbase自带的zk就是true,如果使用自己的zk就是false |
配置hbase-site.xml
<configuration> //本台机器hbase存储目录 <property> <name>hbase.rootdirname> <value>hdfs://master:9000/hbasevalue> property> //hbase的master位置 <property> <name>hbase.mastername> <value>master:60000value> property> //hbase的运行模式,true代表分布式,false为单机模式 <property> <name>hbase.cluster.distributedname> <value>truevalue> property> //zookeeper监控目录 <property> <name>hbase.zookeeper.quorumname> <value>master,slave1,slave2value> property> <property> <name>hbase.tmp.dirname> <value>/home/hadoop/bigdata/hbase/datavalue> <description>Temporary directory on the local filesystem.description> property> //Here you have to set the path where you want HBase to store its built in zookeeper files. <property> <name>hbase.zookeeper.property.dataDirname> <value>/home/hadoop/bigdata/zookeeper/zookeeperdir/zookeeper-datavalue> property> <property> <name>hbase.unsafe.stream.capability.enforcename> <value>falsevalue> property> configuration> |
配置regionservers
master slave1 slave2 |
发送给slave1,slave2
scp -r /home/hadoop/bigdata/hbase-xxx hadoop@slave1:/home/hadoop/bigdata/ scp -r /home/hadoop/bigdata/hbase-xxx hadoop@slave2:/home/hadoop/bigdata/ |
在slave1,slave2分别创建软连接
ln -s hbase-xxx hbase |
启动hbase(启动的hbase的时候要保证hadoop集群已经启动)
/hbase/bin/start-hbase.sh hbase shell |
Spark安装
先在master安装,再发送到slave1,slave2
下载spark的安装包并解压
tar -zxvf spark-xxxx.tar.gz -C ~/bigdata/ |
创建软连接
ln -s spark-xxx spark |
环境变量配置
vim ~/.bashrc export SPARK_HOME=/root/bigdata/spark export PATH=$SPARK_HOME /bin:$PATH source ~/.bashrc |
修改spark-env.sh
cp spark-env.sh.template
export HADOOP_HOME=/home/hadoop/bigdata/hadoop export YARN_HOME=/home/hadoop/bigdata/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_CONF_DIR=$YARN_HOME/etc/hadoop export SPARK_HOME=/home/hadoop/bigdata/spark export JAVA_HOME=/opt/java/jdk1.8.0_241 # 配置master的地址 export SPARK_MASTER_IP=192.168.190.130 export SPARK_LIBRARY_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$HADOOP_HOME/lib/native SPARK_LOCAL_DIRS=/home/hadoop/bigdata/spark/tmp SPARK_DRIVER_MEMORY=2G |
集群配置,修改slaves
cp slaves.template slaves
# A Spark Worker will be started on each of the machines listed below. slave1 slave2 |
发送给slave1,slave2
scp -r /home/hadoop/bigdata/spark-xxx hadoop@slave1:/home/hadoop/bigdata/ scp -r /home/hadoop/bigdata/spark-xxx hadoop@slave2:/home/hadoop/bigdata/ |
在slave1,slave2分别创建软连接
ln -s spark-xxx hbase |
编写集群一键启动脚本
此时集群hadoop+zookeeper+hbase+spark集群基本搭建完毕。
想要启动集群首先要在master上启动hdfs和yarn。在master、slave1、slave2上启动zookeeper、在master上启动hbase、在master上启动hbase。每次启动是很麻烦的一件事,所以我们编写一个一键启动脚本。
在master机器上,编写集群启动脚本
mkdir ~/script vim start.sh |
# hadoop集群启动 /home/hadoop/bigdata/hadoop/sbin/start-yarn.sh /home/hadoop/bigdata/hadoop/sbin/start-dfs.sh # zookeeper集群启动 /home/hadoop/bigdata/zookeeper/bin/zkServer.sh start for i in 1 2 do ssh slave$i "source ~/.bashrc;/home/hadoop/bigdata/zookeeper/bin/zkServer.sh start" done # hbase集群启动 start-hbase.sh # spark集群启动 /home/hadoop/bigdata/spark/sbin/start-all.sh |
编写集群关闭脚本
vim stop.sh |
# spark集群关闭 /home/hadoop/bigdata/spark/sbin/stop-all.sh # hbase集群关闭 stop-hbase.sh # zookeeper集群关闭 /home/hadoop/bigdata/zookeeper/bin/zkServer.sh stop for i in 1 2 do ssh slave$i "/home/hadoop/bigdata/zookeeper/bin/zkServer.sh stop" done # hadoop集群关闭 /home/hadoop/bigdata/hadoop/sbin/stop-dfs.sh /home/hadoop/bigdata/hadoop/sbin/stop-yarn.sh |
为了在任何位置上都可以使用集群启动关闭脚本,将脚本所在路径配置到环境变量
vim ~/.bashrc
#自动化脚本的目录 export SCRIPT=/home/hadoop/script export PATH=$SCRIPT:$PATH
source ~/.bashrc |
尝试使用该命令
start.sh stop.sh |
Hive安装
Hive 安装前需要安装好 JDK 和 Hadoop。配置好环境变量。
只在master安装即可
下载Hive的安装包并解压
tar -zxvf hive-2.3.7.tar.gz -C ~/bigdata/ |
进入到 解压后的hive目录找到 conf目录, 修改配置文件
cp hive-env.sh.template hive-env.sh vi hive-env.sh |
在hive-env.sh中指定hadoop的路径
HADOOP_HOME=/home/hadoop/bigdata/hadoop |
配置环境变量
vim ~/.bashrc # hive export HIVE_HOME=/home/hadoop/bigdata/hive export PATH=$HIVE_HOME/bin:$PATH #保存退出后 source ~/.bash_profile |
与mysql连接
上传 mysql驱动到 hive安装目录的lib目录下
cp mysql-connector-java-8.0.19.jar /home/hadoop/bigdata/hive/lib/ |
vi conf/hive-site.xml 配置 Mysql 元数据库信息
<configuration>
<property> <name>hive.metastore.warehouse.dirname> <value>/user/hive/warehousevalue> property>
<property> <name>hive.metastore.localname> <value>truevalue> property>
<property> <name>javax.jdo.option.ConnectionURLname> <value>jdbc:mysql://localhost:3306/hivevalue> property>
<property> <name>javax.jdo.option.ConnectionDriverNamename> <value>com.mysql.cj.jdbc.Drivervalue> property>
<property> <name>javax.jdo.option.ConnectionUserNamename> <value>hivevalue> property>
<property> <name>javax.jdo.option.ConnectionPasswordname> <value>123value> property> <property> <name>hive.metastore.schema.verificationname> <value>falsevalue> property> <property> <name>datanucleus.schema.autoCreateAllname> <value>truevalue> property> configuration> |
在本地mysql中创建hive数据库
启动 hive的metastore元数据服务和hive
hive --service metastore hive |
Sqoop安装
HADOOP 和MYSQL安装ok
sudo tar xzvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz |
配置环境变量
# sqoop export SQOOP_HOME=/home/hadoop/bigdata/sqoop export PATH=$SQOOP_HOME/bin:$PATH
source ~/.bashrc |
切换到conf目录,配置sqoop-env.sh
cd $SQOOP_HOME/conf mv sqoop-env-template.sh sqoop-env.sh vim sqoop-env.sh export HADOOP_COMMON_HOME=/home/hadoop/bigdata/hadoop export HADOOP_MAPRED_HOME=/home/hadoop/bigdata/hadoop |
移动jdbc,jar包到lib目录下
cp mysql-connector-java-8.0.19.jar-bin.jar /home/hadoop/bigdata/ sqoop/lib |
查看版本号
sqoop-version |
Kafka安装
前提安装zookeeper并启动
解压kafka
tar -zxvf kafka_2.11-1.0.0.tgz |
创建日志存储目录
cd /home/hadoop/bigdata/kafka/ mkdir logs-1 |
修改kafka-server 的配置文件
vim config/server.properties |
修改配置文件中21、31、36和60行
broker.id=1 listeners=PLAINTEXT://:9092 advertised.listeners=PLAINTEXT://host_ip:9092 log.dirs=/home/wzj/kafka/logs-1 |
hdfs是分布式存储工具,按块存储。
查看文件
hadoop fs -ls
查看文件内容
hadoop fs -cat
移动文件
hadoop fs -mv URI [URI …]
上传本地文件到hdfs
hadoop fs -put
下载hdfs文件到本地
hadoop fs -get
删除文件
hadoop fs -rm URI [URI …]
Mapreduce是分布式计算的工具,因为有大量IO操作,速度慢适合离线操作
案例:Word Count 词频统计
test.py
hadoop spark hadoop spark hdfs mapreduce hadoop |
mapper.py
import sys for line in sys.stdin: line = line.strip() words = line.split() for word in words: print("%s %d"%(word,1)) |
reducer.py
import sys current_word = None current_count = 0 word = None for line in sys.stdin: line = line.strip() word,count = line.split() try: count = int(count) except ValueError: continue
if word == current_word: current_count += count else: if current_word: print("%s\t%d" % (current_word,current_count)) current_word = word current_count = count if current_word == word: print("%s\t%d" % (current_word,current_count)) |
运行
1)不使用hadoop,在linux下测试脚本
$cat test.txt | python mapper.py|sort|python reducer.py |
2)使用hadoop
vim ./streaming.sh添加。需要将test.txt文件上传到hdfs上
STREAM_JAR_PATH="/home/hadoop/bigdata/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.10.0.jar" #指定JAR包位置 INPUT_FILE_PATH_1="/test.txt" #指定读取文件位置 OUTPUT_PATH="/output" #指定输出文件位置
hadoop fs -rm -r -skipTrash $OUTPUT_PATH
hadoop jar $STREAM_JAR_PATH -input $INPUT_FILE_PATH_1 -output $OUTPUT_PATH -mapper "python mapper.py" -reducer "python reducer.py" -file ./mapper.py -file ./reducer.py |
1)基本使用方法
创建数据库
CREATE DATABASE test; |
显示所有数据库
SHOW DATABASES; |
创建表
CREATE TABLE student(classNo string, stuNo string, score int) row format delimited fields terminated by ','; |
row format delimited fields terminated by ',' 指定了字段的分隔符为逗号,所以load数据的时候,load的文本也要为逗号,否则加载后为NULL。hive只支持单个字符的分隔符,hive默认的分隔符是\001。
将数据load到表中
在本地文件系统创建一个如下的文本文件:/home/hadoop/tmp/student.txt
C01,N0101,82 C01,N0102,59 C01,N0103,65 C02,N0201,81 C02,N0202,82 C02,N0203,79 C03,N0301,56 C03,N0302,92 C03,N0306,72 |
这个命令将student.txt文件复制到hive的warehouse目录中,这个目录由hive.metastore.warehouse.dir配置项设置,默认值为/user/hive/warehouse。Overwrite选项将导致Hive事先删除student目录下所有的文件, 并将文件内容映射到表中。
load data local inpath '/home/hadoop/tmp/student.txt' overwrite into table student; |
查询表中的数据
hive>select * from student; |
分组查询group by和统计count
hive>select classNo,count(score) from student where score>=60 group by classNo; |
显示表信息
hive>desc student; |
删除表查看结果
hive>drop table student; |
2)综合案例
需求:根据用户行为以及文章标签筛选出用户最感兴趣(阅读最多)的标签。
用户行为表user_actions
user_id article_id event_time 11,101,2018-12-01 06:01:10 22,102,2018-12-01 07:28:12 33,103,2018-12-01 07:50:14 11,104,2018-12-01 09:08:12 22,103,2018-12-01 13:37:12 33,102,2018-12-02 07:09:12 11,101,2018-12-02 18:42:12 35,105,2018-12-03 09:21:12 22,104,2018-12-03 16:42:12 77,103,2018-12-03 18:31:12 99,102,2018-12-04 00:04:12 33,101,2018-12-04 19:10:12 11,101,2018-12-05 09:07:12 35,102,2018-12-05 11:00:12 22,103,2018-12-05 12:11:12 77,104,2018-12-05 18:02:02 99,105,2018-12-05 20:09:11 |
文章数据articles
artical_id,artical_url,artical_keywords 101,http://www.itcast.cn/1.html,kw8|kw1 102,http://www.itcast.cn/2.html,kw6|kw3 103,http://www.itcast.cn/3.html,kw7 104,http://www.itcast.cn/4.html,kw5|kw1|kw4|kw9 105,http://www.itcast.cn/5.html, |
数据上传hdfs
hadoop fs -mkdir /tmp/demo hadoop fs -mkdir /tmp/demo/user_action |
创建外部表
drop table if exists user_actions; CREATE EXTERNAL TABLE user_actions( user_id STRING, article_id STRING, time_stamp STRING ) ROW FORMAT delimited fields terminated by ',' LOCATION '/tmp/demo/user_action'; |
drop table if exists articles; CREATE EXTERNAL TABLE articles( article_id STRING, url STRING, key_words array<STRING> ) ROW FORMAT delimited fields terminated by ',' COLLECTION ITEMS terminated BY '|' LOCATION '/tmp/demo/article_keywords'; /* key_words array<STRING> 数组的数据类型 COLLECTION ITEMS terminated BY '|' 数组的元素之间用'|'分割 */ |
查看数据
select * from user_actions; select * from articles; |
需要使用到的方法
group by之后 针对某一列聚合 结果放到[]
区别一个去重一个不去重
explode函数把复杂类型array map拆开 一行变多行
lateral view 和 explode函数 配合使用 创建虚拟视图 可以把 explode的结果和其他列一起查询
select article_id,kw from articles lateral view explode(key_words) t as kw;
不同列的字符串拼接到一起
concat_ws 可以把array中的元素拼接到同一个字符串中指定分割符
根据文章id找到用户查看文章的关键字并统计频率
select a.user_id, b.kw,count(1) as weight from user_actions as a left outer JOIN (select article_id,kw from articles lateral view outer explode(key_words) t as kw) b on (a.article_id = b.article_id) group by a.user_id,b.kw order by a.user_id,weight desc; |
结果
11 kw1 4 11 kw8 3 11 kw5 1 11 kw9 1 11 kw4 1 22 kw7 2 22 kw9 1 22 kw1 1 22 kw3 1 22 kw4 1 22 kw5 1 22 kw6 1 33 kw3 1 33 kw8 1 33 kw7 1 33 kw6 1 33 kw1 1 35 NULL 1 35 kw3 1 35 kw6 1 77 kw1 1 77 kw4 1 77 kw5 1 77 kw7 1 77 kw9 1 99 NULL 1 99 kw3 1 99 kw6 1 |
将用户查看的关键字和频率合并成 key:value形式并按用户聚合
select cc.user_id,str_to_map(concat_ws(',',collect_set(cc.kw_w))) as wm from(select a.user_id, concat_ws(':',b.kw,cast (count(1) as string)) as kw_w from user_actions as a left outer JOIN (select article_id,kw from articles lateral view outer explode(key_words) t as kw) b on (a.article_id = b.article_id) group by a.user_id,b.kw ) as cc group by cc.user_id; |
结果
11 {"kw1":"4","kw4":"1","kw5":"1","kw8":"3","kw9":"1"} 22 {"kw1":"1","kw3":"1","kw4":"1","kw5":"1","kw6":"1","kw7":"2","kw9":"1"} 33 {"kw1":"1","kw3":"1","kw6":"1","kw7":"1","kw8":"1"} 35 {"1":null,"kw3":"1","kw6":"1"} 77 {"kw1":"1","kw4":"1","kw5":"1","kw7":"1","kw9":"1"} 99 {"1":null,"kw3":"1","kw6":"1"} |
将用户的阅读偏好结果保存到表中
create table user_kws as select cc.user_id,str_to_map(concat_ws(',',collect_set(cc.kw_w))) as wm from(select a.user_id, concat_ws(':',b.kw,cast (count(1) as string)) as kw_w from user_actions as a left outer JOIN (select article_id,kw from articles lateral view outer explode(key_words) t as kw) b on (a.article_id = b.article_id) group by a.user_id,b.kw) as cc group by cc.user_id; |
查看新创建的表
从表中通过key查询map中的值
从表中获取map中所有的key 和 所有的value
用lateral view explode把map中的数据转换成多列
名称 |
命令表达式 |
查看所有表 |
list |
创建表 |
create '表名', '列族名1','列族名2','列族名n' |
添加记录 |
put '表名','行名','列名:','值 |
查看记录 |
get '表名','行名' |
查看表中的记录总数 |
count '表名' |
删除记录 |
delete '表名', '行名','列名' |
删除一张表 |
第一步 disable '表名' 第二步 drop '表名' |
查看所有记录 |
scan "表名称" |
查看指定表指定列所有数据 |
scan '表名' ,{COLUMNS=>'列族名:列名'} |
更新记录 |
重写覆盖 |
创建命名空间 |
create_namespace 'test' |
删除命名空间 |
drop_namespace ‘test’ |
创建表并且删除表
创建命名空间并在命名空间内创建表
插入数据
查询表中的所有数据
Scan查询中添加限制条件
限制输出两行
STARTROW 限制起始的Rowkey
ROWPREFIXFILTER rowkey 前缀过滤器
查询某个rowkey的数据
查询某个列簇的数据
删除表中的数据
清空数据
启动kafka服务
> bin/kafka-server-start.sh config/server.properties & |
创建一个主题(topic)
> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test |
创建好之后,可以通过运行以下命令,查看已创建的topic信息
> bin/kafka-topics.sh --list --zookeeper localhost:2181 test |
发送消息
消费消息