Ambari 统信 UOS 适配征途:国产化环境下的集群管理破壁与实践总结
随着国产化替代进程的加速,将 Apache Ambari 这一成熟的 Hadoop 集群管理工具部署到统信 UOS 操作系统环境的需求日益迫切。然而,由于底层操作系统、依赖库、环境配置等方面的显著差异,适配过程面临一系列独特的挑战。本文档系统总结了在 Ambari 适配统信 UOS 过程中遇到的关键问题、技术难点以及相应的解决方案与实践经验。旨在为后续在国产化统信 UOS 平台上顺利部署和管理 Ambari 及 Hadoop 生态组件提供详实参考,加速国产化大数据平台的落地进程。
问题
shell
INFO 2025-03-13 15:47:21,825 HeartbeatThread.py:132 - Registration response received
ERROR 2025-03-13 15:47:21,825 HeartbeatThread.py:108 - Exception in HeartbeatThread. Re-running the registration
Traceback (most recent call last):
File "/usr/lib/ambari-agent/lib/ambari_agent/HeartbeatThread.py", line 95, in run
self.register()
File "/usr/lib/ambari-agent/lib/ambari_agent/HeartbeatThread.py", line 135, in register
self.handle_registration_response(response)
File "/usr/lib/ambari-agent/lib/ambari_agent/HeartbeatThread.py", line 209, in handle_registration_response
raise Exception(error_message)
Exception: Registration failed due to: Cannot register host with not supported os type, hostname=hadoop-02, serverOsType=kylin20, agentOsType=uos server20
INFO 2025-03-13 15:47:21,825 transport.py:358 - Receiver loop ended
', None)
解决
/usr/lib/ambari-agent/lib/ambari_commons/resources/os_family.json
/usr/lib/ambari-agent/lib/ambari_commons/os_check.py
shell
/usr/lib/ambari-agent/lib/ambari_commons/resources/os_family.json
"kylin": {
"extends" : "redhat",
"distro": [
"kylin"
],
"versions": [
10,
#加上20
20
]
},
问题
shell
Traceback (most recent call last):
File "/var/lib/ambari-agent/cache/stack-hooks/before-INSTALL/scripts/hook.py", line 37, in <module>
BeforeInstallHook().execute()
File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 352, in execute
method(env)
File "/var/lib/ambari-agent/cache/stack-hooks/before-INSTALL/scripts/hook.py", line 33, in hook
install_packages()
File "/var/lib/ambari-agent/cache/stack-hooks/before-INSTALL/scripts/shared_initialization.py", line 37, in install_packages
retry_count=params.agent_stack_retry_count)
File "/usr/lib/ambari-agent/lib/resource_management/core/base.py", line 125, in __new__
cls(names_list.pop(0), env, provider, **kwargs)
File "/usr/lib/ambari-agent/lib/resource_management/core/base.py", line 166, in __init__
self.env.run()
File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 160, in run
self.run_action(resource, action)
File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 124, in run_action
provider_action()
File "/usr/lib/ambari-agent/lib/resource_management/core/providers/packaging.py", line 30, in action_install
self._pkg_manager.install_package(package_name, self.__create_context())
File "/usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py", line 242, in install_package
elif context.is_upgrade or context.use_repos or not self._check_existence(name):
File "/usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py", line 312, in _check_existence
return self.rpm_check_package_available(name)
File "/usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py", line 397, in rpm_check_package_available
import rpm # this is faster then calling 'rpm'-binary externally.
ImportError: No module named rpm
usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py
python
def rpm_check_package_available(self, name):
import rpm # this is faster then calling 'rpm'-binary externally.
ts = rpm.TransactionSet()
packages = ts.dbMatch()
name_regex = re.escape(name).replace("\\?", ".").replace("\\*", ".*") + '$'
regex = re.compile(name_regex)
for package in packages:
if regex.match(package['name']):
return True
return False
修改后
python
def rpm_check_package_available(self, name):
try:
result = subprocess.run(
['rpm', '-q', name],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=False
)
return result.returncode == 0
except Exception:
return False
或者
python
def rpm_check_package_available(self, name):
import rpm # this is faster then calling 'rpm'-binary externally.
ts = rpm.TransactionSet()
packages = ts.dbMatch()
name_regex = re.escape(name).replace("\\?", ".").replace("\\*", ".*") + '$'
regex = re.compile(name_regex)
for package in packages:
if regex.match(package['name']):
return True
return False
# command = ['rpm', '-qa']
# process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# output, error = process.communicate()
# if process.returncode == 0:
# packages = output.decode().splitlines()
# else:
# return False
# name_regex = re.escape(name).replace("\\?", ".").replace("\\*", ".*")
# regex = re.compile(name_regex)
# for package in packages:
# if regex.match(package):
# return True
# return False