在 WSL2 Ubuntu 20.04 上安装 SQL Server 并用 Sqoop 将数据导入 HDFS

在子系统上安装 SQL Server 上基本按照微软官方的 Tutorial, 原来想着照着上面的命令敲一遍完事大吉, 结果敲完最后一个命令sudo /opt/mssql/bin/mssql-conf setup 报错了:

1
2
System has not been booted with systemd as init system (PID 1). Can't operate.
Attempting to start the Microsoft SQL Server service failed.

启动 SQL Server 失败。在这里折腾了很久,尝试了各种姿势,后来发现需要在子系统上正常执行 systemctl 才可以,参考这篇做了一些设置:
首先安装 daemonizefontconfig:

1
sudo apt install -y fontconfig daemonize

编辑/etc/profile 并加入下面的内容:

1
2
3
4
5
6
7
8
9
10
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')

if [ -z "$SYSTEMD_PID" ]; then
sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi

if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi

修改/etc/sudoers并加入下面的内容:

1
2
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*

最后执行下source /etc/profile确认设置成功

设置成功后参考微软的文档重新生成下数据库, 按照操作设置完密码重新启动 SQL Server 服务后登录 SQL Server:

1
sqlcmd -S localhost -U SA -P

现在其实可以在主机用 SSMS 登录子系统的 SQL Server 了,首先看下子系统的 IP 地址:

1
ip addr

得到的 IP 地址作为服务器名称填上去,再选 SQL Server 身份验证填上用户名密码就可以登录了。

tempdb 数据库建一个数据表并插入两条记录来测试 Sqoop:

1
2
3
4
5
6
7
USE tempdb;
GO;
CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT);
INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
GO;
SELECT * FROM Inventory;
GO;

设置好 Sqoop 和 Hadoop 后用下面的命令来讲数据库 tempdb 里的 Inventory 表导入到 HDFS:

1
2
3
4
5
6
7
8
9
sqoop import \
--connect 'jdbc:sqlserver://;serverName=127.0.0.1;port=1433;databaseName=tempdb' \
--username sa \
--password <password> \
--table Inventory \
--target-dir /mssql \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

上面的命令会把数据导入到 /mssql 这个路径下面。