1、安装linux子系统
1、启用适用于 Linux 的 Windows 子系统
搜索框里面输入<开发>即可跳转,打开开发人员模式
命令行里面输入systeminfo确定是否电脑已经支持虚拟化,是则可以继续安装:
2、然后先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。确定自己系统是win10(22H2)或更高,win11也可。
以管理员身份打开powershell输入:
--linux子系统
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
--虚拟机平台
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
在设置搜索框输入:启用或关闭 windows功能
确保虚拟机平台和适用于linux的wondows子系统已经勾选。
重启计算机。
3、下载 Linux 内核更新包
下载好后安装,安装好后打开 PowerShell输入以下命令将 WSL 2 设置为默认版本:
wsl --set-default-version 2
4、下载Ubuntu20.04发行版
Index of /ubuntu-releases/20.04/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
a:创建一个文件夹,然后进到这个文件夹 运行下面命令下载ubuntu20.04(文件约0.8G)(也可官方文档旧版本 WSL 的手动安装步骤 |Microsoft 学习去下载:Downloading distributions下面的Ubuntu 22.04 LTS):
Invoke-WebRequest -Uri https://wsldownload.azureedge.net/Ubuntu_2004.2020.424.0_x64.appx -OutFile Ubuntu20.04.appx -UseBasicParsing
# Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile Ubuntu.appx -UseBasicParsing
# 如果下载时间较长,通过设置$ProgressPreference = 'SilentlyContinue'
完成后执行:
Rename-Item .\Ubuntu20.04.appx Ubuntu.zip
Expand-Archive .\Ubuntu.zip -Verbose
cd .\Ubuntu\
.\ubuntu2004.exe
b: 也可去官网Ubuntu 20.04.6 LTS (Focal Fossa)下载镜像用VMWare软件安装:
c:直接下载该版本,下载好后直接安装即可(文件已在对应网盘):
安装好后打开ubuntu根据提示设置用户名username和password即可,密码输入完成后可以看到Ubuntu20.04的相关信息。如果不小心退出ubuntu可以重新进入,此时系统会用默认用户名root(超级用户)和密码登录:
运行adduser即可添加用户,运行cat /etc/passwd即可查看当前所有用户信息。
查看当前位置:
pwd --查看当前目录
普通用户下切换到超级用户使用:
sudo -i
超级用户切换到普通用户:
su username
su - username
在root用户下为username分配sudo权限:
sudo visudo --普通用户没有su权限时,编辑sudoers文件来添加权限
--在打开的 sudoers 文件中
improot ALL=(ALL:ALL) ALL --添加该行,允许improot用户使用sudo,保存文件并退出。
此时可以在此电脑左栏
中看到Linux
,打开它可以看到Ubuntu的文件,后续与Ubuntu之间的文件操作可以从此处进行。如果想删除该图标,光卸载ubuntu是不行的,需要运行以下命令,至此子系统安装完成。
'''
删除此电脑下左栏的linux图标只要在应用-可选功能-更多windows功能关闭使用Linux的windows子系统不可行
'''
卸载双系统window+linux系统:
win+R输入msinfo32查看系统摘要:BIOS模式为UEFI,如果是传统需要参考legacy引导模式下进行移除ubuntu系统
win+x进入磁盘管理查看磁盘分区形式,排除基本盘分区C、D盘等,排除恢复分区,排除EFI系统分区,其他的基本都是ubuntu分区,点击ubuntu分区右键删除卷
或进入命令行:
diskpart#启动内置磁盘管理分区工具
list disk#列出所有物理磁盘
select disk1#选择指定磁盘
list partition#列出该磁盘所有分区
assign letter=E#分配新盘符,打开此电脑会看到该盘但无权打开,可以用记事本管理员身份删除
remove letter=E#移除新盘符
但还是发现无法删除,左栏两个ubuntu图标依然坚挺
此时通过powershell输入:
wsl --list --all # 查看本机安装了哪些子系统
wsl --unregister <System_name> # 卸载
就可以大功告成删除这ubuntu大图标
常见命令:
超级用户下添加用户:
sudo adduser usename --添加用户
--默认情况下:adduser在创建用户时会主动调用 /etc/adduser.conf;
--在创建用户主目录时默认在/home下,而且创建为 /home/用户名
--如果主目录已经存在,就不再创建,但是此主目录虽然作为新用户的主目录,而且默认登录时会进入这个目录下,但是这个目录并不是属于新用户,当使用userdel删除新用户时,并不会删除这个主目录,因为这个主目录在创建前已经存在且并不属于这个用户。
另外添加用户方式:
useradd usename--在使用useradd创建新用户时,不会为用户创建主目录,不会为用户指定shell版本,不会为用户创建密码。
sudo useradd usename --不使用任何参数选项创建用户
sudo passwd usename --为用户指定登录密码
sudo passwd usename --修改用户密码
passwd username --root用户直接修改其他用户的密码
--为用户指定参数的useradd命令:
-d: 指定用户的主目录
-m: 如果存在不再创建,但是此目录并不属于新创建用户;如果主目录不存在,则强制创建; -m和-d一块使用。
-s: 指定用户登录时的shell版本:/bin/bash --为用户指定shell版本
-M: 不创建主目录
删除用户:
sudo deluser usename --仅删除用户
sudo deluser --remove-home usename --连同用户的主目录和邮箱一起删除
sudo deluser --remove-all-files usename --连同用户拥有的所有文件删除
sudo userdel usename --只删除用户
sudo deluser -r usename --连同用户主目录一起删除,如果创建时主目录已经存在,即主目录不属于当前要删除的用户,则无法删除主目录。
--相关文件
/etc/passwd --使用者帐号资讯,可以查看用户信息
/etc/shadow --使用者账号资讯加密
/etc/group --群组资讯
/etc/default/useradd --定义资讯
/etc/login.defs --系统广义设定
/etc/skel --内部定义文档的目录
--获取用户列表
cat /etc/passwd:这个命令会显示系统中的所有用户信息,包括用户名、用户ID、用户组ID、用户家目录等。用户信息以冒号分隔。
cut -d: -f1 /etc/passwd:这个命令会仅显示用户名,使用冒号作为分隔符。
getent passwd:这个命令会显示系统中的所有用户信息,包括本地用户和网络用户。
awk -F: '{print $1}' /etc/passwd:这个命令会仅显示用户名,使用冒号作为分隔符。
--查看所有用户家目录
cut -d: -f1,6 /etc/passwd --从/etc/passwd文件中提取用户名和家目录,并以冒号分隔。输出结果将显示所有用户的用户名和对应的家目录路径。
getent passwd | grep '/home' | cut -d: -f1,6 --用getent passwd获取所有用户信息,并使用grep过滤出家目录路径包含/home的用户。然后,使用cut命令提取用户名和家目录路径,并以冒号分隔。输出结果将显示所有本地用户的用户名和对应的家目录路径。
grep "用户名" /etc/passwd | cut -d: -f6 --查看指定用户家目录
执行sudo命令时常用参数选项有:
–home: 指定创建主目录的路径,默认是在/home目录下创建用户名同名的目录,这里可以指定;如果主目录同名目录存在,则不再创建,仅在登录时进入主目录。
–quiet: 即只打印警告和错误信息,忽略其他信息。
–debug: 定位错误信息。
–conf: 在创建用户时使用指定的configuration文件。
–force-badname: 默认在创建用户时会进行/etc/adduser.conf中的正则表达式检查用户名是否合法,如果想使用弱检查,则使用这个选项,如果不想检查,可以将/etc/adduser.conf中相关选项屏蔽。如:...
用 sudo
以当前用户执行普通用户的命令:
sudo -u newusername -i
2、在子系统上安装桌面环境
1、更换软件源,由于Ubuntu默认的软件源在国外,有时候后可能会造成下载软件卡顿,这里更换为国内的阿里云源,在ubuntu里面输入:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak# 备份原来的软件源
sudo nano /etc/apt/sources.list # 编辑软件源
cd /etc/apt # 进入该文件夹
rm sources.list # 删除该文件
vim sources.list # 编辑该文件
将文件内容替换为以下内容:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
保存退出后执行:
sudo apt-get update -y # 更新软件源
sudo apt-get upgrade -y # 升级所有软件
# sudo apt update && sudo apt upgrade --用分配的首选软件包管理器定期更新和升级软件包
Windows子系统下安装的分发版Ubuntu是默认不带有桌面环境的,为了能够使用桌面环境,需要手动安装桌面环境,例如xfce4、gnome等,在这里选择最经典的gnome桌面环境,即和Ubuntu官方版本的桌面环境相似:
sudo apt-get install ubuntu-desktop # 安装gnome桌面环境
sudo apt-get install gnome-tweak-tool # 安装相关工具
Windows子系统下安装的分发版Ubuntu默认不支持systemctl命令,然而systemctl在原生版Ubuntu中非常重要,手动安装:
git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
bash ubuntu-wsl2-systemd-script.sh --force
当看到下面图片所示时代表安装成功:
安装远程控制软件(可选),然后使用Windows自带的mstsc
工具来达到可视化操作Ubuntu的目的,有绿色的running代表服务成功运行。
sudo apt-get install xrdp # 安装xrdp远程控制服务
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini # 将端口从3389改为3390,因为此前默认的3389端口已保留用于ubuntu shell
echo "gnome-session" > ~/.xsession # 配置启动session,否则远程桌面登录输入密码之后会直接闪退
sudo systemctl restart xrdp # 重新启动xrdp服务
sudo systemctl status xrdp # 查看xrdp服务状态
在运行框中输入mstsc,再在远程连接中输入
localhost:3390即可连接到远程桌面:
此为linux桌面显示,完成安装:确保xrdp服务是启动状态,否则远程主机无法连接
文件存储:
要在 Windows 文件资源管理器中打开 WSL 项目,只要输入:
explorer.exe . --在命令末尾添加句点以打开当前目录
为了获得最快的性能速度,如果在 Linux 命令行(Ubuntu、OpenSUSE 等)中使用 Linux 工具处理文件,请将文件存储在 WSL 文件系统中。如果在使用 Windows 工具在 Windows 命令行(PowerShell、命令提示符)中工作,请将文件存储在 Windows 文件系统中(可以跨操作系统访问文件,但可能会显著降低性能)。
在存储 WSL 项目文件时:
- 使用 Linux 文件系统根目录:
\\wsl$\<DistroName>\home\<UserName>\Project
- 而不是 Windows 文件系统根目录:或
C:\Users\<UserName>\Project
/mnt/c/Users/<UserName>/Project$
此外可以在vscode中安装插件:WSL
输入以下命令即可开启一个新项目
>wsl
常见问题:
'''
使用 sudo 命令时如果提示 “command not found”
'''
find /etc/sudoers.d --看一下 /etc/sudoers.d 文件是否存在,如果返回 No such file or directory,就说明系统没有安装sudo
apt-get install sudo
apt-get update--如果上述命令提示 E: Unable to locate package sudo 的错误,先执行此命令
微软提供了虚拟机学习平台:实验 - 使用 Microsoft Office 集成 - Training | Microsoft Learn,登陆自己账号,启动VM模式,授权完成后地区选择US,点击右侧Resources就可查看登陆账号和密码每次使用时长只有2h,使用完会初始化需要重新登录:
3、配置基本环境
由于Impala 是建立在 Hadoop 之上的,因此要先安装 Hadoop,通常 Impala 与 Hadoop 集成,因此需要确保 Hadoop 和 HDFS(分布式文件系统)正确运行。
在图形化界面打开终端或输入crtl+alt+t打开终端创建新用户:
sudo useradd -m hadoop -s /bin/bash # 创建用户
sudo passwd hadoop # 设置密码
usermod -a -G hadoop hadoop # 添加Hadoop到hadoop组
cat /etc/passwd
用户已创建,用 /bin/bash 作为 shell,同样的方式为hadoop用户添加sudo权限,完成后注销用户,切换成hadoop用户登录,更新 apt:
安装SSH、配置SSH无密码登陆
集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:
sudo apt-get install openssh-server
安装完后用如下命令登陆本机 :
ssh localhost # ssh -p 3390 localhost
出现ssh免密登录localhost出现The authenticity of host ‘localhost (127.0.0.1)’ can’t be established的解决方法:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 生成公钥私钥,将在~/.ssh文件夹下生成文件id_rsa:私钥,id_rsa.pub:公钥,将公钥复制到服务器
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 导入公钥到认证文件,更改权限
chmod 0600 ~/.ssh/authorized_keys # 并将密钥加入到授权
出现错误信息:ssh: connect to host localhost port 22: Connection refused解决方法:
sudo apt-get install openssh-server--确定安装sshd
sudo net start sshd--启动sshd
sudo ufw disable --检查防火墙设置,关闭防火墙
ssh localhost--重新校验
ps -e | grep ssh --查看是否有sshd进程
sudo service ssh restart--有时候虽然可以看到sshd 但是还是不能连接成功,这时候就要想到重新启动一下
如果上述依然无法解决拒绝连接问题,或者提示:
"System is booting up. Unprivileged users are not permitted to log in yet. Please come back later. For technical details, see pam_nologin(8)."
此时需要编辑一下文件:
cd /etc/pam.d/sshd
# 注释掉:account required pam_nologin.so该行
#或者直接运行:
sudo sed -i -r 's/^(.*pam_nologin.so)/#\1/' /etc/pam.d/sshd
取消未授权用户登录限制,此时输入ssh localhost就可以连接(非远程桌面,远程桌面同理):
SSH配置完好后,就可以使用ssh localhost来登录SSH,并在SSH上面运行远程控制、登录等命令 ,配置java环境,Hadoop 需要 JDK(Java Development Kit) 的原因主要是因为 Hadoop 是用 Java 编写的,并且很多 Hadoop 组件和操作都依赖于 Java 来运行,下载
这里 需要创建一个本地和虚拟机都能共享文件的文件夹,检查本地windows和linux是否能连接通,在linux下输入:
ip addr show
在windows下输入:
ipconfig
双方ping一下,看是否能ping通,能ping通就可以进行共享文件夹创建:
sudo apt-get install samba #安装samba,我在hadoop账户下
samba --version # 查看版本是否安装
sudo mkdir /home/hadoop/share_file # 在hadoop用户目录下创建以后要共享的文件夹share_file
sudo chmod 777 /home/hadoop/share_file # 配置该目录为最高权限
sudo smbpasswd -a hadoop # 参数-a就是添加一个用户,hadoop为登录账户(注意一定要是ubuntu存在的用户)。这一步会要求设置输入两次密码
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup # 备份配置文件
vim /etc/samba/smb.conf # 修改samba服务的配置文件
# 在文件末尾append:
[share]
comment = Share folder # 注释
# 共享目录,这个是你刚刚创建的samba共享目录
path = /home/hadoop/share_file
create mask = 0700
directory mask = 0700
# 用于登录的账户
valid users = hadoop
force user = hadoop
force group = hadoop
# 是否公开分享
public = yes
# 是否允许来宾用户访问
guest ok = yes
# 是否只读
read only = no
# 是否可被浏览
browseable = yes
available = yes
writable = yes
修改完之后保存退出即可,重启服务:
sudo service smbd restart
然后windows+R:输入:
按提示输入授权用户账号密码登陆后直接进入到share文件夹,拖动本地下载的文件到该share文件夹,然后去linux下的share_file文件夹查看就存在对应文件,当然也可以用Mobaxterm或FileZilla客户端方式实现文件互传。
cd /usr/lib
sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
cd ..
cd hadoop/share_file # 进入压缩包文件夹
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下
cd ~
vim ~/.bashrc # 设置环境目录
# 在文件开头append:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source ~/.bashrc # 退出后执行让配置文件立即生效
4、配置大数据hadoop
同样解压hadoop压缩包放到local文件夹中:
sudo tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.1.3/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop # 修改文件权限
cd /usr/local/hadoop
./bin/hadoop version # Hadoop可用的话则会显示Hadoop版本信息
Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。例如运行grep例子中将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中:
cd /usr/local/hadoop
mkdir ./input
cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/* # 查看运行结果
rm -r ./output # 删除文件夹
执行结果:
Hadoop伪分布式配置,Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
Hadoop配置文件说明:
Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行,不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。
修改配置文件 core-site.xml,通过 gedit 编辑会比较方便:
gedit ./etc/hadoop/core-site.xml
将当中的:
<configuration>
</configuration>
修改为下面配置:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
同样打开配置文件 hdfs-site.xml:
gedit ./etc/hadoop/hdfs-site.xml
修改配置文件 hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
配置完成后,执行 NameNode 的格式化:
cd /usr/local/hadoop
./bin/hdfs namenode -format
成功会看到如下信息:
如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,需要重新设置,如果设置好还是出现该错误,那么到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的绝对地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后重启Hadoop。
接着在hadoop目录下开启 NameNode 和 DataNode 守护进程,若出现ssh提示输入yes即可:
./sbin/start-dfs.sh # start-dfs.sh是个完整的可执行文件,中间没有空格
启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable WARN 提示可以忽略,并不会影响正常使用。
如果启动 Hadoop 时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况,这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
保存后执行 source ~/.bashrc
使变量设置生效,然后再次执行 ./sbin/start-dfs.sh
启动 Hadoop。启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: "NameNode"、"DataNode" 和 "SecondaryNameNode"(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,重新配置或通过查看启动日志排查原因。
Hadoop无法正常启动的解决方法: 一般可以查看启动日志来排查原因,注意几点:
启动时会提示形如 "DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.out",其中 DBLab-XMU 对应你的机器名,但其实启动日志信息是记录在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以应该查看这个后缀为 .log 的文件;
每一次的启动日志都是追加在日志文件之后,所以得拉到最后面看,对比下记录的时间就知道了。
一般出错的提示在最后面,通常是写着 Fatal、Error、Warning 或者 Java Exception 的地方。自行排查解决,此外若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做):
# 针对 DataNode 没法启动的解决方法
cd /usr/local/hadoop
./sbin/stop-dfs.sh # 关闭
rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
./bin/hdfs namenode -format # 重新格式化 NameNode
./sbin/start-dfs.sh # 重启
成功启动后,可以访问 Web 界面 http://localhost:9870 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件,web界面如下:
伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:
./bin/hdfs dfs -mkdir -p /user/hadoop
1、运行Hadoop需要两个核心技术:a. HDFS;b. mapreduce
2、HDFS:用于分布式存储;MapReduce:用于分析计算数据
3、使用伪分布式Hadoop,本质是在本地启用HDFS,从而让Hadoop并不是读取本地文件来分析,而是从HDFS从读取数据来使用MapReduce处理。
4、伪分布和分布唯一区别:有没有真实使用多个终端去操作
5、用户想要使用HDFS就需要为自己创建目录,本质就是在NameNode中注册,方便后续查找对应的DataNode。
实际上hdfs有三种shell方式:
hadoop fs # hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs # hadoop dfs只能适用于HDFS文件系统
hdfs dfs # hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。在hadoop 用户下已创建相应的目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
./bin/hdfs dfs -ls input # 查看文件列表
伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
./bin/hdfs dfs -cat output/*
将结果取回本地:
rm -r ./output # 先删除本地的output文件夹(如果存在)
./bin/hdfs dfs -get output ./output # 将HDFS上的output文件夹拷贝到本机
cat ./output/*
Hadoop 运行程序时输出目录不能存在,否则会提示错误 ,若要再次执行需要先删除 output 文件夹,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:
Error: "org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists"
./bin/hdfs dfs -rm -r output # 删除 output 文件夹
Configuration conf = new Configuration();
Job job = new Job(conf);
/* 删除输出目录 */
Path outputPath = new Path(args[1]);
outputPath.getFileSystem(conf).delete(outputPath, true);
若要关闭 Hadoop,运行./sbin/stop-dfs.sh即可,下次启动 hadoop 时无需进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh
就可以!
5、hive大数据配置
-
Hadoop:Hadoop是一个开源的分布式计算框架,主要用于存储和处理大规模数据集。它的核心组件包括Hadoop分布式文件系统(HDFS)和MapReduce计算模型。Hadoop提供了一个基础设施来存储和处理数据。
-
Hive:Hive是一个构建在Hadoop之上的数据仓库工具,用于提供数据查询和分析功能。它允许用户使用类似SQL的HiveQL进行数据查询,而不需要直接使用MapReduce编程模型。Hive将其查询转换为底层的MapReduce任务,从而利用Hadoop的分布式计算能力。
下载好apache-hive-3.1.2-bin.tar后(Index of /dist/hive)同样方式上传到share_file目录解压到local目录下:
sudo tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /usr/local
cd /usr/local/
sudo mv ./apache-hive-3.1.2-bin/ ./hive
sudo chown -R hadoop ./hive # 将当前目录下的 hive 目录及其所有子文件和子目录的所有者更改为用户hive
配置环境变量:
vim /etc/profile # 如果是read-only可以提升权限使用sudo vim /etc/profile
#退出时:qa!不保存强制退出; :wq!强制保存退出; :q不保存退出
#在该文件头append:
#HIVE_HOME
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
#append:
#HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
source /etc/profile # 退出后source,立即生效
初始化数据库时报错:
bin/schematool -dbType derby -initSchema # 初始化元数据库(默认是derby数据库)
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
原因是hadoop和hive的两个guava.jar版本不一致,两个jar位置分别位于下面两个目录:
/usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar
/usr/local/hive/lib/guava-19.0-jre.jar
解决办法是删除低版本的那个,将高版本的复制到低版本目录下。
cd /usr/local/hive/lib
rm -f guava-19.0.jar
cp /usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar .
hive配置完就可以启动:
bin/hive
show databases;
对于生产环境,配置一个外部的Metastore,并使用外部数据库(如MySQL或PostgreSQL)来存储Hive的元数据。这样做的好处是Hive服务和元数据存储分离,便于维护和扩展,对于测试环境UTA可以直接配置mysql作为其元数据。
6. Hive的高级配置和性能优化
6.1 配置Hive的执行引擎
6.1.1 Tez和Spark执行引擎的选择
选择合适的执行引擎是优化Hive性能的重要一步。Hive可以使用多种执行引擎,包括MapReduce、Tez和Spark。MapReduce是Hadoop最初使用的工作负载管理器,但因其执行效率较低,通常在处理复杂查询时性能不如Tez和Spark。
Tez是基于MapReduce构建的,优化了任务间的依赖关系,减少了不必要的磁盘I/O操作,大幅提升了查询性能。Tez特别适合执行包含多个阶段的复杂查询。
Spark执行引擎则完全绕过了Hadoop的MapReduce层,通过内存计算提高了效率,尤其适合于需要迭代计算的任务。在处理大数据量和复杂计算时,Spark通常能提供更快的响应时间。
根据应用场景和数据规模的不同,可以选择最适合的执行引擎。对于批处理场景,Tez往往能提供更好的性能。而在需要实时处理或者迭代计算的场景,Spark可能是更好的选择。
6.1.2 配置执行引擎的参数优化
配置执行引擎的参数优化对于提升Hive性能至关重要。每种执行引擎都有自己的配置参数,以满足不同的性能需求。
对于Tez,可以通过调整hive.tez.container.size
参数来控制Tez容器的内存大小,这对于处理大量数据的查询尤为重要。hive.tez.java.opts
参数则用来指定Java堆大小,它影响了Tez任务的性能。
对于Spark,参数spark.executor.memory
影响了执行器的内存大小,而spark.executor.cores
则定义了执行器使用的CPU核心数量。合理配置这些参数可以充分利用集群资源,提高查询效率。
在实际操作中需要根据集群资源和工作负载进行调优,有时还需要配合执行计划的查看来调整参数,达到最佳性能。
6.2 性能优化技巧
6.2.1 分区和桶策略的使用
分区和桶是Hive用来提高查询效率的两种策略。分区是将表中的数据按照某列或多列的值分散存储在不同的目录下,查询时Hive只会读取相关的分区,从而减少不必要的数据扫描。
桶策略则是将数据进一步分散存储在多个文件中,可以用来实现数据的随机采样。通过CLUSTERED BY
和DISTRIBUTED BY
语句,可以在创建表时或之后对数据进行桶化。
在使用分区和桶策略时,合理的分区键和桶的数量选择非常关键。分区键的选择应避免数据倾斜,而桶的数量则需要根据数据量大小和集群的处理能力进行权衡。
6.2.2 索引和存储格式的选择
索引可以加快查询速度,尤其是对于数据量庞大的表。Hive支持多种类型的索引,例如位图索引、Bloom Filter和Compact索引等。每种索引都有其特定的使用场景,例如位图索引适合于基数较低的列。
存储格式的选择也对性能有影响。Hive支持多种存储格式,包括TextFile、SequenceFile、Parquet和ORC等。ORC格式因其高度压缩和列式存储的特性,在读写效率上往往优于其他格式,尤其适合大数据量的分析。
选择合适的索引和存储格式,需要根据查询类型、数据特性以及对压缩率和读写速度的要求进行综合考量。
6.3 监控和故障排除
6.3.1 日志文件分析
日志文件是Hive性能监控和故障排除的宝贵资源。通过分析Hive的服务器日志、客户端日志和Hadoop的YARN日志,可以找到查询执行的瓶颈和错误原因。
服务器日志提供了关于查询执行的详细信息,例如任务执行的时间、资源使用情况以及作业失败的原因。客户端日志则可以帮助定位用户操作或配置问题。
在分析日志时,特别要注意错误信息、警告信息和时间戳。错误信息有助于快速定位问题,而警告信息和时间戳则可以帮助你了解在何时何地发生了问题。
6.3.2 常见问题的解决方法
Hive在使用过程中可能会遇到各种问题,常见的问题包括数据倾斜、低效的查询计划、资源不足等。
数据倾斜问题通常需要通过调整表的分区策略、增加更多的桶或者使用倾斜连接来解决。低效的查询计划则需要通过查看执行计划并根据实际情况调整表的存储格式或索引。
资源不足的问题,如内存不足或CPU限制,可以通过增加任务的资源请求或者优化查询计划来解决。另外,适当调整执行引擎的参数也有助于解决资源问题。
在处理这些问题时,Hive社区提供了大量的工具和文档资源。利用这些资源进行故障排除,可以有效解决Hive使用中遇到的问题。
7、Hive数据仓库的操作实践
7.1 数据定义语言(DDL)的使用
7.1.1 创建和修改表结构
在Hive中,数据定义语言(DDL)是一种用于定义数据结构的语言,如表、分区和桶。创建表是使用DDL中最常见的任务之一。
use test;
CREATE TABLE IF NOT EXISTS employees (
id INT,
name STRING,
salary FLOAT,
department STRING,
work_time decimal(4,2)
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
创建一个名为employees
的新表,它包含四个字段:id
, name
, salary
, 和department
。这些字段分别被定义为整型(INT)、字符串(STRING)、浮点型(FLOAT)和字符串类型(STRING)。此表使用逗号作为字段分隔符,并以文本格式存储。
表创建后,可能会出现需要修改表结构的情况。例如,要向employees
表中添加一个新字段age
:
ALTER TABLE employees ADD COLUMNS (age INT);
此语句将向现有表添加一个新的整型字段age
。Hive的DDL还支持修改字段的数据类型、重命名字段以及删除字段,使结构修改变得灵活。
7.1.2 管理分区和桶
分区(Partitioning)和桶(Buckets)是Hive优化查询性能的关键特性。分区允许将数据组织在不同的部分中,通常根据某些经常用于查询条件的字段。而桶则是将数据进一步细分为多个文件。
ALTER TABLE employees PARTITION BY (department); # 根据department字段对employees表进行分区
MSCK REPAIR TABLE employees; # 通过MSCK REPAIR TABLE命令让Hive识别已经存在的分区
对于桶操作,可以使用以下命令对数据进行分桶处理:
SET hive.enforce.bucketing = true; # hive.enforce.bucketing参数启用桶强制
SET mapreduce.job.reduces = 4; # mapreduce.job.reduces设置执行MapReduce任务时的Reducer数量,这个值通常应该是桶数的倍数
INSERT OVERWRITE TABLE employees SELECT * FROM employees TABLESAMPLE(BUCKET 4 OUT OF 4 ON id) SORT BY id; # TABLESAMPLE操作用于选择特定的样本桶,这里是从4个桶中抽取所有数据,并根据id字段排序
通过DDL管理和优化表结构可以有效地组织和查询大量数据。接下来将探讨如何使用数据操作语言(DML)来执行实际的数据操作。
7.2 数据操作语言(DML)实践
7.2.1 加载数据到Hive表
Hive中的数据操作语言(DML)涉及数据的加载、查询和更新。加载数据是数据仓库中常见的操作之一,用Hadoop的fs
命令将本地文件系统中的employees.csv
文件上传到了HDFS中的/user/hive/warehouse/employees
路径,Hive默认将表数据存储在此位置:
hadoop fs -put /user/data/employees.csv /user/hive/warehouse/employees;
加载数据后,需要将数据加载(或装载)到Hive表中,这通常通过HiveQL完成:
LOAD DATA INPATH '/user/data/employees.csv' INTO TABLE employees;
将HDFS中指定位置的文件加载到employees
表中。如果Hive表和数据文件存储在同一个路径下,则可以省略INPATH
关键字。
7.2.2 查询数据和聚合操作
在数据仓库中,执行数据查询是实现数据分析和生成报告的关键。HiveQL提供了强大的查询功能,几乎可以执行所有SQL-92标准的查询。
SELECT name, salary FROM employees WHERE department = 'Engineering';
更复杂的查询可能需要使用聚合函数,计算每个部门的平均薪水,并按部门分组:
SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department;
Hive还支持使用窗口函数进行更高级的数据分析,为每个部门的员工按薪水排序编号:
SELECT id, name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;
通过使用HiveQL的DML,可以轻松地实现数据加载、查询和聚合操作,这些操作是数据仓库实现数据处理和分析的基础。
7.3 数据仓库的最佳实践
7.3.1 数据模型设计
设计高效的数据模型是构建数据仓库时一个关键步骤。良好的数据模型不仅简化了数据管理,而且还可以提升查询性能。在Hive中,数据模型设计通常涉及星型模式和雪花模式,这两种模式都是数据仓库设计中常用的维度建模方法。
星型模式使用一个或多个事实表(通常是大型表格,存储大量的度量数据)和一些维度表(存储有助于分析事实数据的描述信息)。星型模式特别适合于OLAP分析。
雪花模式是星型模式的一个变种,其中维度表进一步规范化为更小的表。这些表通过外键关联,形成一个类似雪花的结构。
7.3.2 数据处理和ETL流程
ETL(Extract, Transform, Load)是数据仓库的核心概念之一。Hive提供了一系列工具来实现ETL流程。
数据提取(Extract)是从各种数据源中导入数据到Hive中。Hive支持多种数据格式,如文本文件、JSON、CSV以及Parquet和ORC列式存储格式。
数据转换(Transform)涉及到数据清洗、格式化和聚合等操作。HiveQL提供了强大的数据转换能力,可以使用用户定义函数(UDF)和窗口函数来完成复杂的数据转换。
数据加载(Load)是将清洗和转换后的数据加载到目标表。数据加载可以通过HiveQL的INSERT OVERWRITE TABLE
或INSERT INTO TABLE
命令来实现。
在Hive中实现ETL流程通常涉及编写HiveQL脚本,这些脚本可以作为Hadoop作业提交执行。在某些情况下,可以使用更复杂的工具如Apache NiFi或Apache Airflow来管理Hive的ETL流程。
通过遵循这些最佳实践,可以有效地管理和优化Hive数据仓库,以便更高效地进行数据处理、分析和报告。
8、配置mysql作为hive的元数据
sudo apt-get install mysql-server # 安装MySQL服务端
# sudo apt-get remove --purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* # 卸载服务
# sudo rm -rf /var/lib/mysql # 删除 MySQL 数据文件
sudo apt-get install mysql-client # 安装MySQL客户端
# sudo apt-get remove --purge mysql-client mysql-client-core-* # 卸载
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 修改mysql的配置文件
skip-grant-tables # 找到[mysqld],在后面任意新建一行添加该文本并保存退出
service mysql restart # 重启mysql服务 # 选择对应的登陆账户
mysql -u root -p # 无需输入密码,直接回车即可登录
use mysql; # 切换到nysql数据库
update user set authentication_string='******' where user = 'root'; # 更新user表中的root用户的密码
flush privileges; # 刷新权限
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '******';
quit; # 退出mysql终端
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 删除或注释掉所添加的skip-grant-tables,并保存
service mysql restart # 重启mysql服务
mysql -u root -p # 输入设定的密码即可登录
当两个用户hdoop和improot的登陆mysql账户重复时会造成Error:ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'; 需要对不同用户设置不同的登录mysql账户如:
CREATE USER 'root1'@'localhost' IDENTIFIED BY '******'; # hadoop用户登录mysql的账户
GRANT ALL PRIVILEGES ON *.* TO 'root1'@'localhost' WITH GRANT OPTION; # 授权
FLUSH PRIVILEGES;
配置mysql连接器:mysql-Connector-J安装包下载_开源镜像站-阿里云任选一款,如选择mysql-connector-java_8.0.28-1ubuntu18.04_all.deb这一款, 下载好复制到share_file文件夹中,在cp到hive目录下安装:
sudo cp mysql-connector-java_8.0.28-1ubuntu18.04_all.deb /usr/local/hive
sudo dpkg -i mysql-connector-java_8.0.28-1ubuntu18.04_all.deb # 安装该驱动程序
安装好后可以在/usr/share/java目录下查看到对应文件 :
将该jar文件cp到hive的lib目录下:
cp mysql-connector-java-8.0.28.jar /usr/local/hive/lib
sudo vim ~/.bashrc # 环境变量配置文件
在开头append:
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:HIVE_HOME/bin
source ~/.bashrc # 刷新
如果环境变量不小心配错了导致所有命令失效,直接设置:
export PATH=/usr/bin:/bin:$PATH
export PATH=/usr/sbin:/sbin:$PATH
恢复后重新设置PATH。
将“/usr/local/hive/conf”目录下的hive-default.xml.template文件重命名为hive-default.xml,用vim编辑器新建一个文件hive-site.xml:
cd /usr/local/hive/conf
sudo mv hive-default.xml.template hive-default.xml
sudo vim hive-site.xml
内容如下:
<?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>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
</configuration>
启动MySQL,在MySQL中为Hive新建数据库, 配置MySQL允许Hive接入:
# improot用户下
create user hive identified by '******';
grant all privileges on hive.* to hive@'%' with grant option;
flush privileges;
# hadoop用户下
create user hive1 identified by '******';
grant all privileges on hive1.* to hive1@'%' with grant option;
flush privileges;
DROP USER 'root'@'localhost';
DROP USER 'root1'@'localhost';
CREATE USER 'root'@'localhost' IDENTIFIED BY '******';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
SELECT User, Host FROM mysql.user; # 查看所有用户
启动hive:
cd /usr/local/hadoop
./sbin/start-dfs.sh # 先启动Hadoop集群伪分布式
# bin/schematool -dbType mysql -initSchema
# 进入hive目录
bin/hive # 对数据修改会被元数据感知到,反过来hive需要refresh源数据的修改才能感知
9、配置conda和python环境
获取安装包:
# https://repo.anaconda.com/archive/
weget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh
放在对应目录后执行:
bash Anaconda3-2024.06-1-Linux-x86_64.sh
回车输入yes即可,配置环境变量:
vim ~/.bashrc # 编辑
export PATH="$HOME/anaconda3/bin:$PATH" 添加路径
source ~/.bashrc # 刷新
conda info --envs # 验证是否安装成功
配置好有退出虚拟机重新进入,安装虚拟环境:
conda init # 初始化
conda create -n py38 python=3.8
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 镜像源
pip install numpy pandas