Hadoop伪分布式系统的搭建(ubuntu)
相关软件下载:
一、安装虚拟机软件VirtualBox
二、使用VirtualBox新建虚拟机并安装Ubuntu系统
提示:最小安装即可
三、创建一个新账户
1、使用CTRL+ALT+T打开命令行终端,输入命令创建新用户
sudo useradd -m hadoop -s /bin/bash
说明:-m表示自动创建用户目录(/home/hadoop),hadoop是用户名,-s表示使用/bin/bash作为shell
2、给新用户设置密码
sudo passwd hadoop
说明:输入两次新密码
3、给新用户增加管理员权限
sudo adduser hadoop sudo
4、注销当前用户,并以新用户登录
四、在Ubuntu中挂载共享文件夹
1、“设备”->“共享文件夹”,记住共享文件夹的共享名
2、“设备”->“安装增强功能“
说明:安装好了,桌面上会出现光盘图标VBox_GAs_5.2.18和一个虚拟盘sf_VirtualBoxShare
3、进入目录/media/hadoop/VBox_GAs_5.2.18,执行命令./VBoxLinuxAddtion.run
4、将共享文件夹挂载到Ubuntu的一个文件夹
(1)创建挂载的目标文件夹
mkdir ~/share
(2)挂载
格式:mount -t vboxsf 共享名 本地目录
mount -t vboxsf VirtualBoxShare ~/share
说明:VirtualBox是共享文件夹的共享名,share目录需要事先在家目录(~,即/home/hadoop) 下创建
5、设置vbox共享粘贴板
“设备”->“共享粘贴板”->“双向“
说明:这样在真机和虚拟机之间可以任意的复制和粘贴。
更正:
1.安装增强功能
2.设置共享文件夹
桌面上会增加"sf_共享名"文件夹 //只有root用户才能访问,进入下一步修改
3.将当前用户添加至vboxsf用户组
sudo usermod -a -G vboxsf hadoop //当前用户是hadoop,需重启
五、安装一些必要的工具
1、更新apt-get
sudo apt-get update
说明:apt-get是用来安装软件的工具
2、安装ssh服务
apt-get install openssh-server
说明: ssh是机器之间远程登录的服务
3、安装vim
apt-get install vim
说明:vim是Linux下常用的文本编辑器,Ubuntu也有自带的文本编辑器gedit
六、配置免密登录
1、禁用防火墙
ufw disable
ufw status //查看防火墙状态
2、生成密钥对
cd ~/.ssh
ssh-keygen -t rsa
说明:一路回车,在~/.ssh目录会生成一个两个文件,id_rsa和id_rsa.pub
3、将公钥复制到localhost
ssh-copy-id localhost
说明:也可cat ./id_rsa.pub >> ./authorized_keys,这样~/.ssh目录又会多一个文件authorized_keys
4、登录测试
ssh localhost
说明:看是否需要输入密码
5、退出与localhost的连接
exit
七、安装并配置jdk
1、在家目录(~)下新建/app 文件夹
mkdir ~/app
说明:后面的jdk、hadoop等都安装在此
2、在真机中将jdk、hadoop的安装包复制到真机的共享文件夹中
3、安装jdk
tar -zxvf ~/share/jdk-8u181-linux-x64.tar.gz -C ~/app //解压
mv ~/app/jdk1.8.0_181 ~/app/jdk //改名
4、配置jdk
(1)编辑配置文件.bashrc
vim ~/.bashrc
export JAVA_HOME=/home/hadoop/app/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
(2) 编译配置文件
source ~/.bashrc
(3)测试jdk
java -version
八、安装hadoop
1、安装hadoop
tar -zxvf ~/share/hadoop-2.7.3.tar.gz -C ~/app //解压
mv ~/app/hadoop-2.7.3 ~/app/hadoop //改名
2、配置hadoop
(1)配置环境变量
vim ~/.bashrc,添加或修改以下语句:
export HADOOP_HOME=/app/hadoop //添加
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin //修改
source ~/.bashrc //编译生效
(2)配置hadoop-env.sh
vim ~/app/hadoop/etc/hadoop/hadoop-env.sh
找到export JAVA_HOME=${JAVA_HOME}这一行,将其修改为:
export JAVA_HOME=/home/hadoop/app/jdk
(3)配置core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hadoop/tmp</value> <!--该目录需要手动创建 -->
</property>
</configuration>
(4)配置hdfs-site.xml
<configuration>
<property>
<!--配置块的副本数 -->
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
(5)配置mapred-site.xml
说明:需将mapred-site.xml.template复制成mapred-site.xml,并配置内容如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(6)配置yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
九、运行hadoop
1、格式化namenode
hadoop namenode -format
说明:
首次运行须格式化,以后运行就不需要这一步。
格式化后会在core-site.xml中hadoop.tmp.dir所指定的目录中生成name文件夹。
2、运行hadoop
cd ~/app/hadoop/sbin
./start-all.sh
3、查看进程:
jps
14262 NameNode
15976 NodeManager
14385 DataNode
15884 ResourceManager
14601 SecondaryNameNode
16120 Jps
如果出现以上进程,说明hadoop环境搭建成功,分布式系统启动完成。
4、webUI查看
http://localhost:50070 //查看hdfs
http://localhost:8088 //查看mapreduce作业情况
十、测试wordcount程序
1、生成单词文件
mkdir ~/tmp
echo 'hello world hello hadoop' > ~/tmp/word1.txt
echo 'hive run on hadoop' > ~/tmp/word2.txt
2、上传至hdfs
(1)在hdfs上新建输入数据的目录
hdfs dfs -mkdir /input
(2)上传文件
hdfs dfs -put /tmp/word*.txt /input
3、运行hadoop自带的单词计数程序
hadoop jar ~/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input output
4、查看结果
hdfs dfs -cat /user/hadoop/output/part-r-00000
可以看到每个单词出现的次数
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
安装hive
1、解压
tar -zxvf ~/share/apache-hive-2.1.0-bin.tar.gz -C ~/app
2、设置环境变量
vim ~/.bashrc
HIVE_HOME=/home/hadoop/app/hive
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
3、配置hive-env.sh
cd ~/app/hive/conf
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
HADOOP_HOME=/home/hadoop/app/hadoop
4、配置hive-site.xml
cd ~/app/hive/conf
cp hive-site.xml.template hive-site.xml
vim hive-site.xml
<property>
<name>hive.querylog.location</name>
<value>/home/centosm/hive/hivelog</value>
<description>Location of Hive run time structured log file</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/hadoop/app/hive/hivelog</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/home/hadoop/app/hive/hivelog</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
5、初始化derby数据库
cd ~/app/hive/bin
schematool -initSchema -dbType derby
6、运行hive
$HADOOP_HOME/sbin/start-all.sh //先启动hadoop
$HIVE_HOME/bin/hive //启动hive
------------------------------------------------------------------------------------------------
hive 外模式mysql的安装
1、安装mysql
(1)安装mysql-server
$>apt-get install mysql-server
(2)在mysql中添加hadoop用户
a.创建用户
msql>create user hadoop@localhost identified by 'hadoop';
b.授予hadoop用户访问hive数据库的所有权限
mysql>grant all privileges on hive to hadoop@localhost identified by 'hadoop';
c.刷新权限
mysql>flush privileges;
(3)登录mysql
hadoop@Ubuntu01:~$mysql -u hadoop -phadoop
2、下载并复制jdbc的连接jar包
如:mysql-connector-java-5.1.47.jar,将其复制$HIVE_HOME/lib中
3、修改hdfs-site.xml
<!-- mysql驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- mysql连接url-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</value>
</property>
<!-- 用户名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hadoop</value>
</property>
<!-- 密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hadoop</value>
</property>
4、初始化hive
[$HIVE_HOME/bin]
schematool -initSchema -dbType mysql
5、客户端连接hive
客户端程序是不能直接访问hive的,必须先开启hiveserver2服务,然后通过hiveserver2连接hive。
(1)启动hiveserver2
$>$HIVE_HOME/bin/hiveserver2 & //在后台运行
$>jobs //查看作业
$>netstat -ano | grep 10000 //hiveserver2的端口为10000
注:若要停止hiveserver2,可使用命令:hiveserver2 stop。若还不行,则杀死进程:kill -9 <pid>
使用beeline连接hiveserver2
$>beeline -u jdbc:hive2://localhost:10000/mydb -n hadoop -phadoop
说明:$HIVE_HOME/lib下需要hive-jdbc-2.1.0-standalone.jar
(2)修改core-site.xml
hive2新加了权限,需修改hadoop的配置文件
[$HADOOP_HOME/etc/hadoop/core-site.xml]
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
(3)编写java程序
a.安装并配置maven
[~/.bashrc]
export M2_HOME=/home/hadoop/app/maven
export PATH=...:$M2_HOME/bin
[$M2_HOME/conf/setting.xml]
<!-- 修改本地仓库的位置 -->
<localRepository>/home/hadoop/app/maven/local_repository</localRepository>
<!-- 将maven仓库的默认镜像修改为阿里云 -->
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun Maven</name>
<mirrorOf>*</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
b.修改eclipse中的maven配置
Windows->Preference->Maven->User Settings->Global Settings->修改为$M2_HOME/conf/settings.xm,其中$M2_HOME为maven的主目录
c.新建maven项目
修改pom.xml,新增一个包依赖
[pom.xml]
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.1.0</version>
</dependency>
注意:此处的hive-jdbc的版本必须和你的hive版本一致。
3.新建java文件
[hive-jdbc.java]
package com.zyz; import java.sql.*; import org.junit.After; import org.junit.Before; import org.junit.Test; public class HiveJDBC { // 连接 private Connection connection = null; private PreparedStatement ps = null; private ResultSet rs = null; /** * 测试前准备工作 */ @Before public void before() { try { // Hive的JDBC驱动 String classDriver = "org.apache.hive.jdbc.HiveDriver"; // 连接串,接数据库名mydb,数据库写你的数据库 String url = "jdbc:hive2://localhost:10000/mydb"; // 加载驱动 Class.forName(classDriver); // 获得连接 connection = DriverManager.getConnection(url,"hadoop","hadoop"); } catch (Exception e) { e.printStackTrace(); } } /** * 查询表中的数据 */ @Test public void testSelect() { try { // 表和数据需要提前准备好 String sql = "select * from heros"; // 执行SQL语句 ps = connection.prepareStatement(sql); // 得到结果集 rs = ps.executeQuery(); // 遍历结果集 while (rs.next()) { System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3)); } } catch (Exception e) { e.printStackTrace(); } System.out.println("over..."); } /* * 插入记录 * */ @Test public void TestInsert() { // TODO Auto-generated method stub String sql="insert into player values(?,?,?)"; try { ps=connection.prepareStatement(sql); ps.setInt(1, 9); ps.setString(2, "park"); ps.setString(3, "spus"); ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("ok!"); } /* * *建表 */ @Test public void TestCreateTable() { // TODO Auto-generated method stub String sql="create table heros(id int,name string,country string)"; try { ps=connection.prepareStatement(sql); ps.execute(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("ok..."); } /** * 测试结束后关闭连接 */ @After public void after(){ try { if (ps != null) ps.close(); if (rs != null) rs.close(); connection.close(); }catch (Exception e){ e.printStackTrace(); } } }
附:
-------------------------------------------------------------------------------------------------
1、Ubuntu 遭遇 无法打开锁文件 /var/lib/dpkg/lock - open (13: 权限不够)
sudo rm /var/lib/dpkg/lock
sudo rm /var/cache/apt/archive/lock