Gautham Banasandra created HADOOP-20031:
-------------------------------------------
Summary: Fix the Windows native build: Docker image, libhdfspp
CMake and YARN UI
Key: HADOOP-20031
URL: https://issues.apache.org/jira/browse/HADOOP-20031
Project: Hadoop Common
Issue Type: Bug
Components: hadoop-common
Affects Versions: 3.5.0
Environment: Windows 10/11
Reporter: Gautham Banasandra
Assignee: Gautham Banasandra
Fix For: 3.5.0
h2. Problem
{{mvn clean install}} with {{-Pnative-win}} cannot complete on Windows. The
Docker image described in BUILDING.txt no longer builds at all, and even with a
working image the native build fails in libhdfspp and again in the YARN
capacity-scheduler UI. There is no single cause -- eight separate defects have
accumulated, each of which independently stops the build.
h2. Root causes
h3. The build image no longer builds
# {{Dockerfile_windows_10}} installs Azul JDK 8. Hadoop requires JDK 17, so the
enforcer rejects the build immediately. This line has not been touched since
2022.
# {{vcpkg install}} fails because the pinned {{protobuf 3.25.5}} cannot be
resolved from vcpkg's version database. The pin was added by HADOOP-19605 on
2025-11-10, so the Windows image has been unbuildable for roughly eleven
months.
# The pinned vcpkg tag {{2025.03.19}} references MSYS2 packages
({{msys2-runtime-3.5.4-2}}) that have since been purged from the upstream
mirror. MSYS2 keeps only current versions.
# The {{libzstd}} and {{rsync}} MSYS2 pins in the Dockerfile have been purged
from the same mirror for the same reason.
h3. The native build fails
# Boost is not pinned explicitly -- its version comes from
{{builtin-baseline}}, so it floats as the baseline moves. Boost 1.87 removed
{{boost/asio/io_service.hpp}}, which five libhdfspp files still include
(ioservice.h, ioservice_impl.h, mock_connection.{h,cc},
remote_block_reader_test.cc).
# The protobuf/protoc compatibility check in
{{libhdfspp/CMakeLists.txt}} leaves {{CMAKE_REQUIRED_LIBRARIES}} pointing at
the Abseil targets. Abseil carries C++ feature requirements that a later
C-language {{check_symbol_exists()}} cannot satisfy under the Visual Studio
generator, so that check fails spuriously.
# The legacy {{PROTOBUF_LIBRARY}}, {{PROTOBUF_PROTOC_LIBRARY}} and
{{PROTOBUF_LIBRARIES}} variables resolve to import DLLs under vcpkg, which
MSVC rejects with {{LNK1107}}.
# {{hadoop-yarn-capacity-scheduler-ui}} sets {{packageManagerScript}} to
{{node_modules/.bin/react-router}}. On Windows that path is an {{sh}} shim,
which {{node}} cannot execute.
h2. Why Linux is unaffected
The Linux build *pins* its native dependencies inside the repository --
{{dev-support/docker/install-boost.sh}} hard-codes Boost 1.86.0 and
{{install-protobuf.sh}} hard-codes Protobuf 3.25.5, both built from source. The
Windows build instead delegates to vcpkg and lets the versions float with the
baseline. That asymmetry is the root cause of defects 2, 5 and arguably 3: the
Windows build has no equivalent of the version lock the Linux build has had all
along.
h2. Fix
* Dockerfile: install the Microsoft Build of OpenJDK 17; move to vcpkg tag
{{2026.07.29}}; refresh the {{libzstd}} and {{rsync}} pins; refresh CMake to
3.30.2. Switch the base image to {{windows/servercore}}, which carries
everything the build needs at a fraction of the size, and relax the password
policy that Server Core enables by default so the existing passwordless
{{HadoopBuilder}} account can still be created.
* {{vcpkg.json}}: narrow the Boost dependency from the {{boost}} metapackage to
the four ports libhdfspp actually includes (asio, date-time, program-options,
system), and pin all 55 transitively required Boost ports to 1.86.0 -- the
same version {{install-boost.sh}} pins for Linux. Pin protobuf to a version
vcpkg publishes.
* {{libhdfspp}}: reset {{CMAKE_REQUIRED_INCLUDES}} and
{{CMAKE_REQUIRED_LIBRARIES}} after the protoc compatibility check, and
migrate from the legacy {{PROTOBUF_*}} variables to the
{{protobuf::libprotobuf}} and {{protobuf::libprotoc}} imported targets.
* {{hadoop-yarn-capacity-scheduler-ui}}: point {{packageManagerScript}} at the
real entry point, {{node_modules/@react-router/dev/bin.js}}.
* BUILDING.txt: correct the Windows Docker section. It omitted that Docker
Desktop must be switched to Windows containers; it documented the Maven
repository mount under {{ContainerAdministrator}} although the Dockerfile
ends with {{USER HadoopBuilder}}, so the documented mount is silently
ignored; it recommended {{docker cp}}, which fails against a running Hyper-V
isolated container; it omitted the container memory the build needs; and the
manual vcpkg route still pinned the purged {{2025.03.19}} tag.
h2. Testing
Verified with a single clean {{mvn clean install}} inside the Windows container,
from a fresh trunk clone with these changes applied:
* *120 of 120 modules SUCCESS*, no failures and no skipped modules
* 48:59 min, against a warm Maven repository
* Produces {{winutils.exe}}, {{hadoop.dll}} and {{hdfs.dll}}, present both in
{{hadoop-dist/target/hadoop-3.6.0-SNAPSHOT/bin}} and inside the distribution
tarball
* {{winutils.exe systeminfo}}, {{ls}}, {{chmod}} and {{hardlink}} all run
correctly against the produced binary
No new tests are added: these are build, packaging and documentation changes,
and the test is that the build completes and emits working native binaries.
h2. Notes
While investigating, {{-Dcmake.prefix.path}} was found to be read by nothing.
The only reader in the tree is {{${windows.cmake.prefix.path}}} in
{{hadoop-hdfs-native-client/pom.xml}}, and neither property is defined in any
pom, so the flag documented in BUILDING.txt left {{CMAKE_PREFIX_PATH}} holding
an unexpanded literal. BUILDING.txt is corrected here; the same misspelling also
appears in {{dev-support/bin/hadoop.sh}} and may deserve a separate issue.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]